当前位置: 首页 > 知识库问答 >
问题:

使用PostgreSQL时出现Spring Security JDBC身份验证默认模式错误

云令
2023-03-14

真的不可能使用默认模式的Spring Security与PostgreSQL,因为部分varchar_ignorecase不存在不能被替换?

我只是在测试默认设置:

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

下面是错误:

引起原因:
org.springframework.beans.factory.Bean定义存储异常:工厂方法[公共javax.servlet.过滤器org.springframework.security.config.annotation.web.configuration.WebSecurityConfiguration.springSecurityFilterChain()抛出java.lang.异常]抛出异常;

嵌套异常是
org。springframework。jdbc。数据源。初始化。ScriptStatementFailedException:未能在资源类路径resource的第1行执行SQL脚本语句
[org/springframework/security/core/userdetails/jdbc/users.ddl]:创建表用户(username varchar_ignorecase(50)not null主键,password varchar_ignorecase(500)not null,enabled boolean not null);

嵌套异常是
org.postgresql.util.PSQLExcture: ERROR: type"varchar_ignorecase"不存在

共有3个答案

吕高昂
2023-03-14

PGSQL的架构:

模式。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  INT      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');

感谢Mr.Q.我完全使用了你的MySQL模式,并将其适用于PGSQL。

林念
2023-03-14

没有必要添加DefaultSchema()。只需用正确的列名和外键约束定义schema.sql和data.sql。下面是MySQL(在Spring Boot中)的示例配置

模式。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);
}
巢宏富
2023-03-14

由于默认模式不适合PostgreSQL,我需要创建自己的模式,并实现自己的用户和权限查询查询。

auth.jdbcAuthentication()
                .dataSource(dataSource)
                .usersByUsernameQuery(
                        "select username,password, enabled from users where username=?")
                .authoritiesByUsernameQuery(
                        "select username, role from user_roles where username=?");
 类似资料:
  • 我正在开发ASP NET核心Web API,对认证方式的选择感到困惑。我曾经应用默认的Asp Net身份验证,但最近我知道了JWT。因此,我几乎像本文中一样实现了身份验证:https://stormpath.com/blog/token-authentication-asp-net-core。但是我不能理解这个JWT的好处。通过简单的Asp Net身份认证,我不关心令牌存储等,我只需要用signI

  • LDAP的基础是什么?如果在配置期间没有给出任何基数。 我必须从基于web的应用程序验证/验证用户,并且我有java代码。 但是我需要为此建立基础(变量),我已经让另一个团队告诉我基础,他们说我们没有在LDAP上定制任何东西。LDAP的默认基数是什么?

  • 我有一个Spring启动应用程序,它由Azure AD oAuth2保护。我使用JWT授权。在安全配置中 我还将一些东西保存在会话中。但我发现,如果用户已经通过身份验证,他们可以绕过JWT身份验证,因为spring boot将身份验证保存在会话中。如何禁用此行为并仅允许通过JWT进行授权。

  • 我正在Spring Boot应用程序中学习Spring Security性,我试图了解默认情况下使用Spring Security性的身份验证方式。我知道Spring Security默认情况下使用基于表单的身份验证,但我使用基本身份验证对Postman进行了测试,结果正常。 我有一个非常简单的Spring Boot应用程序。 Rest控制器: 我在pom中添加了Spring Security依赖

  • 尝试将Azure AD身份验证添加到具有. net核心2.1后端的Angular 7 webapp。 然而,我在请求过程中收到了CORS错误。 “访问位于的XMLHttpRequest”https://login.microsoftonline.com/.......“(重定向自”https://localhost:5001/api/auth/login“)起源”https://localhost

  • 我试图在Rails中使用“omniauth-google-oauth2”gem。我已经将我的应用程序作为web应用程序注册到云控制台,并试图使其工作,但当我试图访问以下URL时:https://accounts.google.com/oauth2/auth?response_type=code&client_id=xxx.project.googleusercontent.com&redirect