Базовая аутентификация jdbc, авторизация не работает - PullRequest
0 голосов
/ 17 октября 2018

Я новичок в весенней безопасности.Просто добавил простую базовую аутентификацию в мой проект с помощью jdbcauthenticationmanager, и она не работает.

SpringSecurityConfig

@Configuration
@EnableWebSecurity
public class SpringSecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    DataSource ds;

    @Bean
    public BCryptPasswordEncoder getEncoder() {
        return new BCryptPasswordEncoder(12);
    }

    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
        auth.jdbcAuthentication().dataSource(ds).usersByUsernameQuery("select * from users where username = ?")
                .authoritiesByUsernameQuery("select username, authority from roles where username = ?")
                .passwordEncoder(getEncoder());
        ;
    }

    @Override
    public void configure(HttpSecurity http) throws Exception {
        // Spring Security 4 automatically prefixes any role with ROLE_.
        http.authorizeRequests().antMatchers("/").permitAll().anyRequest()
                .hasAnyRole("ADMIN","USER").anyRequest().authenticated().and().httpBasic();

    }

}

Данные в таблице:

insert into users ( username, password)
values ( 'payal', '$2a$12$YcoYj8Si2mbx.gYTLWwPeu51cfI2bTJlWBnnpaI2uYitfQtKzjPxm');

insert into users ( username, password)
values ( 'admin', '$2a$12$vhk1ELFdkwuvtAb8HrnUzOHEGJsnqX5ZX.C3TV3Q4Vuu9dsDcRH8e');

insert into roles ( username, authority)
values (  'payal', 'ROLE_USER');

insert into roles ( username, authority)
values ( 'admin', 'ROLE_ADMIN');

Весь код можно найти по адресу https://github.com/payalbnsl/SpringMvcSecurity_err

При этом используется база данных в памяти со сценариями БД, поэтому можно просто запустить ее без дополнительной настройки.

Будет очень полезно, если кто-то сможет указать, почему он не проходит аутентификацию успешно. Каждое имя пользователя, пароль, оно говорит 401, не авторизовано

Однако это работает, если я изменяю его на inMemoryAuthentication, жестко кодируя имя пользователя, пароль.

@Autowired
        public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
            auth.inMemoryAuthentication().withUser("payal").password("$2a$12$YcoYj8Si2mbx.gYTLWwPeu51cfI2bTJlWBnnpaI2uYitfQtKzjPxm").roles("USER");
        }

Ответы [ 2 ]

0 голосов
/ 19 октября 2018

Сработало, если изменилось

auth.jdbcAuthentication().dataSource(ds).usersByUsernameQuery("select * from users where username = ?")
                .authoritiesByUsernameQuery("select username, authority from roles where username = ?")
                .passwordEncoder(getEncoder());
        ;

на

auth.jdbcAuthentication().dataSource(ds).usersByUsernameQuery("select username, password, 'true' as enabled from users where username = ?")
                    .authoritiesByUsernameQuery("select username, authority from roles where username = ?")
                    .passwordEncoder(getEncoder());
            ;

Исправлено добавление «true» как включено ».

0 голосов
/ 18 октября 2018

Вы должны хранить зашифрованный пароль, используя метод по умолчанию, bcrypt, а не обычный текст.

Используйте это для шифрования ваших паролей и хранения зашифрованного формата

System.out.println(new BCryptPasswordEncoder().encode("payal123"));
System.out.println(new BCryptPasswordEncoder().encode("admin"));
// . . . 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...