SpringBoot: Imp SpringSecurity: при входе в систему с участием пользователя / пароля появляется сообщение об ошибке «Пользователь отключен» - PullRequest
0 голосов
/ 14 февраля 2020

Я только начинаю внедрять SpringSecurity, но после входа в систему появляется сообщение об ошибке на экране «Пользователь отключен»

ЭТО ОЧЕНЬ РАБОТАЕТ, ПО УМОЛЧАНИЮ. Когда вы нажимаете кнопку / user или / admin и пытаетесь войти, он показывает «Пользователь отключен»

Я выполняю следующий шаг:

  1. Первый созданная схема. sql (в папке ресурсов)

    CREATE TABLE USERS (
        USERNAME VARCHAR(128) PRIMARY KEY,
        PASSWORD VARCHAR(128) NOT NULL,
        ENABLED CHAR(1) CHECK (ENABLED IN ('Y','N') ) NOT NULL
    );
    
    CREATE TABLE AUTHORITIES (
        USERNAME VARCHAR(128) NOT NULL,
        AUTHORITY VARCHAR(128) NOT NULL
    );
    
    ALTER TABLE AUTHORITIES ADD CONSTRAINT AUTHORITIES_UNIQUE UNIQUE (USERNAME, AUTHORITY);
    ALTER TABLE AUTHORITIES ADD CONSTRAINT AUTHORITIES_FK1 FOREIGN KEY (USERNAME) REFERENCES USERS (USERNAME);
    
  2. Создано "data. sql" в папке ресурсов

    insert into USERS(USERNAME,PASSWORD,ENABLED) VALUES ('user','pass','Y');
    insert into USERS(USERNAME,PASSWORD,ENABLED) VALUES ('admin','pass','Y');
    insert into AUTHORITIES (USERNAME,AUTHORITY) values ('user','ROLE_USER');
    insert into AUTHORITIES (USERNAME,AUTHORITY) values ('admin','ROLE_ADMIN');
    
  3. HomeResource. JAVA (Это API класса контроллера)

    package com.example.callCenter;
    
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    @RestController
    public class HomeResource{
    
        @GetMapping("/")
        public String home(){
            return("<h1>Welcome home page..</h1>");
        }
    
        @GetMapping("/user")
        public String user()
        {
            return ("<h1>Welcome User page</h1>");
        }
    
        @GetMapping("/admin")
        public String admin()
        {
            return("<h1>Welcome Admin page</h1>");
        }
    }
    
  4. SecurityConfiguration. java (Это включает PAGE Form Spring)

    package com.example.callCenter;
    
    import javax.sql.DataSource;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.context.annotation.Bean;
    import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
    import org.springframework.security.config.annotation.web.builders.HttpSecurity;
    import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
    import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
    import org.springframework.security.core.userdetails.User;
    import org.springframework.security.crypto.password.NoOpPasswordEncoder;
    import org.springframework.security.crypto.password.PasswordEncoder;
    
    @EnableWebSecurity
    public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
    
        @Autowired
        DataSource dataSource;
    
        @Override
        protected void configure(AuthenticationManagerBuilder auth) throws Exception {
            auth.jdbcAuthentication().dataSource(dataSource)
                .usersByUsernameQuery("select username,password,enabled "
                            + "from users "
                            + "where username = ?")
                .authoritiesByUsernameQuery("select username,AUTHORITY  "
                            + "from AUTHORITIES "
                            + "where username = ?");
    
            // This beloe code is default implementation with MySQL database
            // auth.jdbcAuthentication()
            //         .dataSource(dataSource)
            //         .withDefaultSchema()
            //         .withUser( 
            //                     User.withUsername("user")
            //                     .password("pass")
            //                     .roles("USER")
    
            //         )
            //         .withUser( 
            //                     User.withUsername("admin")
            //                     .password("pass")
            //                     .roles("ADMIN")
            //         );
    
        }
    
        @Override
        protected void configure(HttpSecurity http) throws Exception {
            http.csrf().disable()
                .authorizeRequests()
                    .antMatchers("/admin").hasRole("ADMIN")
                    .antMatchers("/user").hasAnyRole("ADMIN","USER")
                    .antMatchers("/").permitAll()
                    .and().formLogin();
        }
    
        @Bean
        public PasswordEncoder getPasswordEncoder()
        {
            return NoOpPasswordEncoder.getInstance();
        }
    
    }
    
  5. CallApplication. java

    package com.example.callCenter;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    
    @SpringBootApplication
    public class CallApplication {
    
        public static void main(String[] args) {
            SpringApplication.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
    

Я добавил почти все детали, с моей стороны ничего не ожидается, но теперь мне нужна помощь, почему я не могу позвонить пользователю и войти в систему.

1 Ответ

0 голосов
/ 15 февраля 2020

Проблема здесь со значением, хранящимся в столбце

ENABLED CHAR(1) CHECK (ENABLED IN ('Y','N') ) NOT NULL

JdbcUserDetailsManager. loadUsersByUsername (String username) имеет следующий код logi c для Заполните его свойства при создании объекта User.

                String userName = rs.getString(1);
                String password = rs.getString(2);
                boolean enabled = rs.getBoolean(3);

Чтобы получить статус enabled, используется ResultSet.getBoolean () и документы java для того же самого упоминают следующее

Извлекает значение указанного столбца в текущей строке этого объекта ResultSet как логическое значение на языке программирования Java.

Если указанный столбец имеет тип данных CHAR или VARCHAR и содержит «0» или имеет тип данных BIT, TINYINT, SMALLINT, INTEGER или BIGINT и содержит 0, возвращается значение false. Если указанный столбец имеет тип данных CHAR или VARCHAR и содержит «1» или имеет тип данных BIT, TINYINT, SMALLINT, INTEGER или BIGINT и содержит 1, возвращается значение true.

В приведенном выше коде правильными значениями для включенного / выключенного являются '1' и '0' соответственно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...