2016-03-25 8 views
2

Ich habe versucht, eine Postgres-Datenbank für die Authentifizierung mit Spring-Sicherheit zu verwenden.Grund: PreparedStatementCallback; schlechte SQL-Grammatik

Dies ist meine SQL-Tabelle Definition:

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 
); 

Und hier ist meine Konfigurationsklasse für den Frühling Sicherheit:

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(); 
} 

} 

Es verwendet, um mit Benutzern im Speicher zu arbeiten. Jetzt kann ich es nicht schaffen, weil SQL-Grammatik. Oder sollte ich den Tabellennamen ändern, weil in dem Fehler der Benutzername Kleinbuchstaben ist und mein Tabellenname Großbuchstaben ist?

Hier ist der Fehler:

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

Ich fand das Problem

Es scheint, wenn Sie eine Abfrage ausführen mit jdbcAuthentication() es Spalten- und Tabellennamen zwingt Fall zu senken. Kann jemand das ändern?

+0

Sie Kapitalien nicht in Utilisateur verwenden. SQL ** ist ** unabhängig von Groß- und Kleinschreibung, aber Ihr Framework * kann * Bezeichner angeben, wodurch der SQL-Parser gezwungen wird, Groß- und Kleinschreibung zu beachten. Kurz gesagt: Verwenden Sie keine Großbuchstaben. – joop

+0

Aber ich kann den Datenbanknamen nicht ändern, es ist ein Projekt, wo ich die Datenbank nicht anfassen kann, nur wie es ist :( –

+0

@joop: Rechtliche, kleingeschriebene, nicht angebene Identifikatoren helfen, solche Komplikationen zu vermeiden. Ihr Rat ist gut , nur die Erklärung ist rückwärts. [Bezeichner in SQL sind tatsächlich * Groß- und Kleinschreibung *.] (http://stackoverflow.com/a/20880247/939860) Namen werden in Postgres nur auf Kleinbuchstaben gefaltet. Fall in Standard-SQL) –

Antwort

1

Wer auch immer Ihre Tabelle erstellt hat, hat sich entschieden, die CaMeL-Fallbezeichner mit doppelten Anführungszeichen zu versehen. Jetzt müssen Sie die übereinstimmenden Tabellen- und Spaltennamen für Groß- und Kleinschreibung überall verwenden.

Da doppelte Anführungszeichen in Ihrem Client eine besondere Bedeutung haben, müssen Sie das Sonderzeichen flüchten oder kodieren. Ich kenne Spring nicht. Vielleicht mit einem Backslash entkommen?

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

Etc.

Verwandte:

+0

Vielen Dank es funktioniert: D –

+0

@ KamelMili: Du meinst Flucht mit Backslash, oder? –

+0

Ja Ja mit Blackslash –