使用PostgreSQL时,Spring Security JDBC身份验证默认架构错误

时间:2014-06-12 00:49:01

标签: spring spring-security postgresql-9.1

使用PostgreSQL对Spring Security使用默认架构是否真的不可能,因为部件"varchar_ignorecase" does not exist无法替换?

我只测试默认设置:

auth.jdbcAuthentication()
            .dataSource(dataSource)
            .withDefaultSchema();

以下是错误:

  

引起:
  org.springframework.beans.factory.BeanDefinitionStoreException:   工厂方法[public javax.servlet.Filter   org.springframework.security.config.annotation.web.configuration.WebSecurityConfiguration.springSecurityFilterChain()   抛出java.lang.Exception]抛出异常;

     

嵌套异常是
  org.springframework.jdbc.datasource.init.ScriptStatementFailedException:   无法在资源类的第1行执行SQL脚本语句   路径资源
  [org / springframework / security / core / userdetails / jdbc / users.ddl]:create   表用户(用户名varchar_ignorecase(50)not null primary   key,密码varchar_ignorecase(500)not null,启用boolean not   空值);

     

嵌套异常是
  org.postgresql.util.PSQLException:错误:   type" varchar_ignorecase"不存在

2 个答案:

答案 0 :(得分:15)

因为默认架构不适合PostgreSQL,我需要创建自己的架构并为用户和权限查询实现自己的查询。

auth.jdbcAuthentication()
                .dataSource(dataSource)
                .usersByUsernameQuery(
                        "select username,password, enabled from users where username=?")
                .authoritiesByUsernameQuery(
                        "select username, role from user_roles where username=?");

答案 1 :(得分:0)

无需添加 withDefaultSchema()。只需使用适当的列名和外键约束定义您的 schema.sql 和 data.sql。以下是 Mysql 的示例配置(在 Spring Boot 中)。

schema.sql

DROP TABLE IF EXISTS users;
DROP TABLE IF EXISTS authorities;

CREATE TABLE users
(
   username VARCHAR(50)  NOT NULL,
   password VARCHAR(100) NOT NULL,
   enabled  TINYINT      NOT NULL DEFAULT 1,
   PRIMARY KEY (username)
 );

CREATE TABLE authorities
(
username  VARCHAR(50) NOT NULL,
authority VARCHAR(50) NOT NULL,
FOREIGN KEY (username) REFERENCES users (username)
);

然后定义用户和权限(data.sql)

INSERT INTO users (username, password, enabled)
values ('user','pass',1);

INSERT INTO authorities (username, authority)
values ('user', 'ROLE_USER');

最后,定义认证机制

protected void configure(AuthenticationManagerBuilder auth) throws Exception {
    auth
            .jdbcAuthentication()
            .passwordEncoder(NoOpPasswordEncoder.getInstance())
            .dataSource(dataSource);
}