原因:PreparedStatementCallback;糟糕的 SQL 语法

Posted

技术标签:

【中文标题】原因:PreparedStatementCallback;糟糕的 SQL 语法【英文标题】:Reason: PreparedStatementCallback; bad SQL grammar 【发布时间】:2016-07-13 02:30:29 【问题描述】:

我一直在尝试使用 Postgres 数据库通过 Spring 安全性进行身份验证。

这是我的 SQL 表定义:

CREATE TABLE "UTILISATEUR" (
"IdUtilisateur" serial NOT NULL,
"Nom" character varying(50),
"Prenom" character varying(50),
"Profil" character varying(50),
"Pseudo" character varying(20),
"IdSite" integer DEFAULT 0,
"Password" character varying(1024),
role character varying(45),
CONSTRAINT "UTILISATEUR_pkey" PRIMARY KEY ("IdUtilisateur"),
CONSTRAINT fk1u FOREIGN KEY (role)
   REFERENCES "Role" (role) MATCH SIMPLE
   ON UPDATE NO ACTION ON DELETE NO ACTION
);

这是我的 Spring Security 配置类:

package com.ardia.MDValidation;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.builders.WebSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import javax.sql.DataSource ;

@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter 
    //Pour l'authentification des Utilisateur de Table Utilisateur
@Autowired  
public void GlobalConfig(AuthenticationManagerBuilder auth,DataSource dataSource) throws Exception 
  auth.jdbcAuthentication()
    .dataSource(dataSource)
        .usersByUsernameQuery("select Pseudo as principal , Password as credentials from UTILISATEUR where Pseudo = ? ")
            .authoritiesByUsernameQuery("select Pseudo as principal , role as role from UTILISATEUR where Pseudo = ? ")
                .rolePrefix("_ROLE");

    //ne pas appliqué la securité sur les ressources 
@Override
public void configure(WebSecurity web) throws Exception 
    web.ignoring()
    .antMatchers("/bootstrap/css/**","/css/**");

@Override
protected void configure(HttpSecurity http) throws Exception 
http

    .csrf().disable()   
    .authorizeRequests()
    .anyRequest()   
        .authenticated()        
            .and()
            .formLogin()
            .permitAll();



它曾经与内存用户一起使用。现在我不能让它工作是因为 SQL 语法。还是我应该更改表名,因为在错误中用户名是小写而我的表名是大写?

这是错误:

org.postgresql.util.PSQLException: ERREUR: la relation « utilisateur » n'existe pas Position : 32

我发现了问题

似乎当您使用jdbcAuthentication() 执行查询时,它会强制列名和表名小写。有人知道怎么改吗?

【问题讨论】:

在 UTILISATEUR 中不要使用大写字母。 SQL 不区分大小写,但您的框架可能 引用标识符,这将强制 sql 解析器区分大小写。简而言之:不要使用大写字母。 但我无法更改数据库名称,这是我无法触及数据库的项目,只能按原样使用它:( @joop:合法的、小写的、不带引号的标识符有助于避免任何此类并发症。你的建议很好,只是解释是倒退的。 Identifiers in SQL are, in fact, case sensitive. 名称在 Postgres 中仅折叠为小写(在标准 SQL 中为大写),除非双引号。 我不能为此使用双引号,否则 .usersByUsernameQuery() 将无法执行,因为查询也在双引号中 【参考方案1】:

创建您的表格的人选择使用双引号保留 CaMeL 大小写标识符。现在您必须在任何地方使用匹配的大小写和双引号表和列名。

由于双引号在您的客户端中具有特殊含义,因此您必须对特殊字符进行转义或编码。我对春天不熟悉。也许用反斜杠转义?

"SELECT \"Pseudo\" AS principal, \"Password\"; AS credentials
 FROM \"UTILISATEUR\" WHERE \"Pseudo\" = ? "

等等

相关:

Are PostgreSQL column names case-sensitive?

【讨论】:

是的,带黑斜线

以上是关于原因:PreparedStatementCallback;糟糕的 SQL 语法的主要内容,如果未能解决你的问题,请参考以下文章

rca根本原因分析法是啥意思

ip、端口 连接失败问题常见原因

在MYSQL里 段错误 是啥原因

“'NSInternalInconsistencyException' 的替代原因,原因:'此 NSPersistentStoreCoordinator 没有持久存储。'”

Oracle连接太慢的原因及TNS无监听程序

ios 开发证书被撤销是啥原因