SpringBoot:Imp SpringSecurity:使用用户登录时/pass获取屏幕错误消息";“用户已禁用”;

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)不为空

我刚开始实施SpringSecurity,但登录后屏幕上显示错误消息“用户已禁用”

它在默认情况下运行得非常好。 当用/user或/admin点击并尝试登录时,它会显示“用户已禁用”

我将采取以下步骤:

  • 第一个创建的schema.sql(在资源文件夹下)

    创建表用户(
    用户名VARCHAR(128)主键,
    密码VARCHAR(128)不为空,
    已启用字符(1)检查(在('Y','N')中启用)不为空
    );
    创建表权限(
    用户名VARCHAR(128)不为空,
    权限VARCHAR(128)不为空
    );
    更改表格权限添加约束权限\u唯一(用户名、权限);
    更改表权限添加约束权限\u FK1外键(用户名)引用用户(用户名);
    
  • 在资源文件夹下创建了“data.sql”

    插入用户(用户名、密码、启用)值('user','pass','Y');
    在用户(用户名、密码、已启用)中插入值('admin','pass','Y');
    在权限(用户名、权限)值中插入('user','ROLE_user');
    在权限(用户名、权限)值中插入('admin','ROLE_admin');
    
  • JAVA(这是一个控制器类API)

    package com.example.callCenter;
    导入org.springframework.web.bind.annotation.GetMapping;
    导入org.springframework.web.bind.annotation.RestController;
    @RestController
    公共类家庭资源{
    @GetMapping(“/”)
    公共字符串home(){
    返回(“欢迎主页”);
    }
    @GetMapping(“/user”)
    公共字符串用户()
    {
    返回(“欢迎用户页面”);
    }
    @GetMapping(“/admin”)
    公共字符串管理()
    {
    返回(“欢迎管理员页面”);
    }
    }
    
  • SecurityConfiguration.java(这是启用Spring表单页面)

    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();
    }
    }
    
  • CallApplication.java

    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和的数据类型