使用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"不存在
答案 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);
}