Почему не срабатывает аутентификация Spring Security?

Рейтинг: 0Ответов: 1Опубликовано: 27.02.2023

Пытаюсь настроить аутентификцию спринг бута по своей таблице 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 ругается - непонятно.

Ответы

▲ 0

Попробуй прописать еще один @Bean в конфигураторе, который билдит сам AuthenticationManager. Как вариант:

 @Bean
 public AuthenticationManager authenticationManager(HttpSecurity http, UserService personDetailsService) throws Exception {
       return http.getSharedObject(AuthenticationManagerBuilder.class)
               .userDetailsService(personDetailsService)
               .and()
               .build();
    }