Почему не срабатывает аутентификация Spring Security?
Пытаюсь настроить аутентификцию спринг бута по своей таблице User
.
Вот мои действия:
1 Создал entity:
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private long id;
private String username;
private String password;
private boolean active;
@ElementCollection(targetClass = Roles.class, fetch = FetchType.EAGER)
@CollectionTable(name="user_message", joinColumns = @JoinColumn(name = "user_id"))
@Enumerated(EnumType.STRING)
private Set<Roles> roles;
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public boolean isActive() {
return active;
}
public void setActive(boolean active) {
this.active = active;
}
public Set<Roles> getRoles() {
return roles;
}
public void setRoles(Set<Roles> roles) {
this.roles = roles;
}
}
2. Создал репозиторий:
public interface UserRep extends JpaRepository<User,Long> {
Optional<User> findByUsername(String username);
}
3. Создал имплементацию UserDetails:
public class SecurityUser implements UserDetails {
private final User user;
public SecurityUser(User user) {
this.user = user;
}
@Override
public Collection<? extends GrantedAuthority> getAuthorities() {
return user.getRoles();
}
@Override
public String getPassword() {
return user.getPassword();
}
@Override
public String getUsername() {
return user.getUsername();
}
@Override
public boolean isAccountNonExpired() {
return true;
}
@Override
public boolean isAccountNonLocked() {
return true;
}
@Override
public boolean isCredentialsNonExpired() {
return true;
}
@Override
public boolean isEnabled() {
return user.isActive();
}
}
4. Создал имплементацию UserDetailsServer:
@Service
public class UserService implements UserDetailsService {
@Autowired
UserRep userRep;
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
User user = userRep.findByUsername(username).orElseThrow(() -> new UsernameNotFoundException("User was not find"));
return new SecurityUser(user);
}
}
5. Ну и наконец впихнул всё это в конфигурацию:
@Configuration
@EnableWebSecurity
public class WebSecurityConfig {
@Autowired
private UserService userService;
@Bean
PasswordEncoder passwordEncoder()
{
return NoOpPasswordEncoder.getInstance();
}
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http
.authorizeHttpRequests((requests) -> requests
.requestMatchers("/", "/home","/registration").permitAll()
.anyRequest().authenticated()
)
.formLogin((form) -> form
.loginPage("/login")
.permitAll()
)
.logout((logout) -> logout.permitAll());
return http.build();
}
@Bean
public UserDetailsService userDetailsService() {
return userService;
}
}
Но меня перенаправляет на страницу ошибки неправильной аутентификации. Хотя пользователь есть:
И UserRep
находит такого пользователя, по имени us
А почему spring security
ругается - непонятно.
Источник: Stack Overflow на русском