при такой конфигурации всё работает, авторизация прохожу.
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.
что за варнинг чего ему не нравится? я хочу пройти авторизацию через репозиторий пользователя
Проблема видится мне в этом участке кода:
Насчет пароля надо проверять отдельно, но 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;
}
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Добрый день друзья и подруги , помогите вставить addBatch()в данный код
Хотите улучшить этот вопрос? Обновите вопрос так, чтобы он вписывался в тематику Stack Overflow на русском