SpringBoot:Imp SpringSecurity:使用用户登录时/pass获取屏幕错误消息";“用户已禁用”;
我刚开始实施SpringSecurity,但登录后屏幕上显示错误消息“用户已禁用” 它在默认情况下运行得非常好。 当用/user或/admin点击并尝试登录时,它会显示“用户已禁用” 我将采取以下步骤:SpringBoot:Imp SpringSecurity:使用用户登录时/pass获取屏幕错误消息";“用户已禁用”;,spring,spring-boot,spring-security,Spring,Spring Boot,Spring Security,我刚开始实施SpringSecurity,但登录后屏幕上显示错误消息“用户已禁用” 它在默认情况下运行得非常好。 当用/user或/admin点击并尝试登录时,它会显示“用户已禁用” 我将采取以下步骤: 第一个创建的schema.sql(在资源文件夹下) 创建表用户( 用户名VARCHAR(128)主键, 密码VARCHAR(128)不为空, 已启用字符(1)检查(在('Y','N')中启用)不为空 ); 创建表权限( 用户名VARCHAR(128)不为空, 权限VARCHAR(128)不为空
创建表用户(
用户名VARCHAR(128)主键,
密码VARCHAR(128)不为空,
已启用字符(1)检查(在('Y','N')中启用)不为空
);
创建表权限(
用户名VARCHAR(128)不为空,
权限VARCHAR(128)不为空
);
更改表格权限添加约束权限\u唯一(用户名、权限);
更改表权限添加约束权限\u FK1外键(用户名)引用用户(用户名);
插入用户(用户名、密码、启用)值('user','pass','Y');
在用户(用户名、密码、已启用)中插入值('admin','pass','Y');
在权限(用户名、权限)值中插入('user','ROLE_user');
在权限(用户名、权限)值中插入('admin','ROLE_admin');
package com.example.callCenter;
导入org.springframework.web.bind.annotation.GetMapping;
导入org.springframework.web.bind.annotation.RestController;
@RestController
公共类家庭资源{
@GetMapping(“/”)
公共字符串home(){
返回(“欢迎主页”);
}
@GetMapping(“/user”)
公共字符串用户()
{
返回(“欢迎用户页面”);
}
@GetMapping(“/admin”)
公共字符串管理()
{
返回(“欢迎管理员页面”);
}
}
package com.example.callCenter;
导入javax.sql.DataSource;
导入org.springframework.beans.factory.annotation.Autowired;
导入org.springframework.context.annotation.Bean;
导入org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
导入org.springframework.security.config.annotation.web.builders.HttpSecurity;
导入org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
导入org.springframework.security.config.annotation.web.configuration.websecurityConfigureAdapter;
导入org.springframework.security.core.userdetails.User;
导入org.springframework.security.crypto.password.NoOpPasswordEncoder;
导入org.springframework.security.crypto.password.PasswordEncoder;
@启用Web安全性
公共类安全配置扩展了WebSecurity配置适配器{
@自动连线
数据源数据源;
@凌驾
受保护的无效配置(AuthenticationManagerBuilder auth)引发异常{
auth.jdbccauthentication().dataSource(dataSource)
.usersByUsernameQuery(“选择用户名、密码、已启用”
+“来自用户”
+“其中用户名=?”)
.authoritiesByUsernameQuery(“选择用户名、权限”
+“来自当局”
+“其中用户名=?”;
//此beloe代码是MySQL数据库的默认实现
//auth.jdbc身份验证()
//.dataSource(数据源)
//.withDefaultSchema()
//.withUser(
//User.withUsername(“用户”)
//.密码(“通行证”)
//.角色(“用户”)
// )
//.withUser(
//User.withUsername(“admin”)
//.密码(“通行证”)
//.角色(“管理员”)
// );
}
@凌驾
受保护的无效配置(HttpSecurity http)引发异常{
http.csrf().disable()
.授权请求()
.antMatchers(“/admin”).hasRole(“admin”)
.antMatchers(“/user”).hasAnyRole(“管理员”、“用户”)
.antMatchers(“/”).permitAll()
.and().formLogin();
}
@豆子
公共密码编码器getPasswordEncoder()
{
返回NoOpPasswordEncoder.getInstance();
}
}
package com.example.callCenter;
导入org.springframework.boot.SpringApplication;
导入org.springframework.boot.autoconfigure.springboot应用程序;
@SpringBoot应用程序
公共类调用应用程序{
公共静态void main(字符串[]args){
run(CallCenterApplication.class,args);
}
}
pom.xml:由于表单正在打开,因此给定了所有不成问题的依赖项
application.properties:
spring.datasource.url=
spring.datasource.username=
spring.datasource.password=
spring.datasource.driverClassName=
spring.jpa.show_sql=true
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.SQLServer2012Dialect
spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
spring.jpa.hibernate.ddl-auto=update
spring.jpa.hibernate.dialect=org.hibernate.dialect.SQLServer2012Dialect
spring.jpa.format_sql=true
我添加了几乎所有的细节,我这边没有任何悬而未决的问题,但现在我需要一些帮助,为什么不允许我呼叫用户并允许我登录。这里的问题是存储在列中的值
ENABLED CHAR(1)检查(在('Y','N')中启用)不为空
JdbcUserDetailsManager。创建用户对象时,具有以下代码逻辑来填充其属性
String userName = rs.getString(1);
String password = rs.getString(2);
boolean enabled = rs.getBoolean(3);
要获得已启用
状态,将使用,并且相同的java文档将提到以下内容
检索当前行中指定列的值
此ResultSet对象在Java编程语言中是一个布尔值
如果指定列的数据类型为CHAR或VARCHAR,则
包含“0”或数据类型为BIT、TINYINT、SMALLINT、INTEGER或
BIGINT并包含0,则返回值false。如果
指定列的数据类型为CHAR或VARCHAR,并包含“1”
或具有位、TINYINT、SMALLINT、INTEGER或BIGINT和的数据类型