Spring security

211
08 марта 2022, 20:50

при такой конфигурации всё работает, авторизация прохожу.

import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    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.core.userdetails.UserDetails;
    import org.springframework.security.core.userdetails.UserDetailsService;
    import org.springframework.security.provisioning.InMemoryUserDetailsManager;
    import ru.akaleganov.service.UsersDetailServiceCustom;
    @Configuration
    @EnableWebSecurity
    public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
        @Override
        protected void configure(HttpSecurity http) throws Exception {
            http
                    .authorizeRequests()
                    .antMatchers("/").permitAll()
                    .anyRequest().authenticated()
                    .and()
                    .formLogin()
                    .loginPage("/login")
    //                .defaultSuccessUrl("/")
                    .permitAll()
                    .and()
                    .logout()
    //                .logoutUrl("/login")
                    .deleteCookies("JSESSIONID")
                    .permitAll()
                    .and().csrf().disable()
            ;
        }

        @Bean
        @Override
        public UserDetailsService userDetailsService() {
            UserDetails user =
                    User.withDefaultPasswordEncoder()
                            .username("2")
                            .password("2")
                            .roles("USER")
                            .build();
            return new InMemoryUserDetailsManager(user);
        }
    }

но стоит мне поменять настройку создадим класс:

public class MyUserPrincipal implements UserDetails {
    private final Logger log = LoggerFactory.getLogger(MyUserPrincipal.class);
    private final Users users;
    public MyUserPrincipal(Users users) {
        this.users = users;
    }
    @Override
    public Collection<? extends GrantedAuthority> getAuthorities() {
        return Collections.singletonList(this.users.getRoles());
    }
    @Override
    public String getPassword() {
        return null;
    }
    @Override
    public String getUsername() {
        return this.users.getLogin();
    }
    @Override
    public boolean isAccountNonExpired() {
        return false;
    }
    @Override
    public boolean isAccountNonLocked() {
        return false;
    }
    @Override
    public boolean isCredentialsNonExpired() {
        return false;
    }
    @Override
    public boolean isEnabled() {
        return false;
    }
}

создадим ещё один класс:

 public class UsersDetailServiceCustom implements UserDetailsService {
    private final Logger log = LoggerFactory.getLogger(UsersDetailServiceCustom.class);
    private final UsersRepository usersRepository;
@Autowired
    public UsersDetailServiceCustom(UsersRepository usersRepository) {
        this.usersRepository = usersRepository;
    }

    @Override
    public UserDetails loadUserByUsername(String s) throws UsernameNotFoundException {
        Users users = this.usersRepository.findByLogin(s).orElse(new Users());
        log.debug(users.toString());
        if (users.getLogin() == null) {
            throw new UsernameNotFoundException(s);
        }
        return new MyUserPrincipal(users);
    }
}

а теперь меняем настройку секьюрити

    @Configuration
    @EnableWebSecurity
    public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
        @Autowired
         UsersRepository usersRepository;
        @Override
        protected void configure(HttpSecurity http) throws Exception {
            http
                    .authorizeRequests()
                    .antMatchers("/").permitAll()
                    .anyRequest().authenticated()
                    .and()
                    .formLogin()
                    .loginPage("/login")
    //                .defaultSuccessUrl("/")
                    .permitAll()
                    .and()
                    .logout()
    //                .logoutUrl("/login")
                    .deleteCookies("JSESSIONID")
                    .permitAll()
                    .and().csrf().disable()
            ;
        }
        @Bean
        public UsersDetailServiceCustom getUserDetailService() {
            return new UsersDetailServiceCustom(usersRepository);
        }
        @Override
        protected void configure(AuthenticationManagerBuilder auth) throws Exception {
            auth.userDetailsService(this.getUserDetailService());
        }
}

в итоге при авторизации меня редиректит на localhost:8080/login?error и в консоле я вижу

Hibernate: select users0_.id as id1_7_, users0_.login as login2_7_, users0_.name as name3_7_, users0_.password as password4_7_, users0_.role_id as role_id5_7_ from users users0_ where users0_.login=?
Hibernate: select roles0_.id as id1_5_0_, roles0_.role as role2_5_0_ from roles roles0_ where roles0_.id=?
2020-01-23 19:46:59.930  WARN 1896 --- [nio-8080-exec-1] o.a.c.util.SessionIdGeneratorBase        : Creation of SecureRandom instance for session ID generation using [SHA1PRNG] took [143] milliseconds.

что за варнинг чего ему не нравится? я хочу пройти авторизацию через репозиторий пользователя

Answer 1

Проблема видится мне в этом участке кода: Насчет пароля надо проверять отдельно, но isAccountNonExpired, isAccountNonLocked, isCredentialsNonExpired и isEnabledдолжны возвращать true

@Override
public String getPassword() {
    return null;
}
@Override
public String getUsername() {
    return this.users.getLogin();
}
@Override
public boolean isAccountNonExpired() {
    return false;
}
@Override
public boolean isAccountNonLocked() {
    return false;
}
@Override
public boolean isCredentialsNonExpired() {
    return false;
}
@Override
public boolean isEnabled() {
    return false;
}
READ ALSO
Сортировка Map на Java

Сортировка Map на Java

Имеется Map и содержит такие данные

127
Пакетное выполнение sql запросов

Пакетное выполнение sql запросов

Добрый день друзья и подруги , помогите вставить addBatch()в данный код

128
ошибка при передаче JSON ответа в Java объект с помощью Jackson [закрыт]

ошибка при передаче JSON ответа в Java объект с помощью Jackson [закрыт]

Хотите улучшить этот вопрос? Обновите вопрос так, чтобы он вписывался в тематику Stack Overflow на русском

194
JHipster microservices

JHipster microservices

Разбирасюь с JHipster

176