Не получается реализовать авторизацию в спринг секьюрити
Не авторизуется пользователь при вводе верных логина (в моем случае почта) и пароля. Пытался проверить в чем ошибка через точку остановы, но в loadUserByUsername даже не заходит.
Регистрация при этом работает исправно. Из за того что пытался не использовать WebSecurityConfigurerAdapter, получилось, так что не очень много инфы смог найти. Самому разобраться не хватает опыта.
@Configuration
public class MvcConfig implements WebMvcConfigurer {
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/static/**")
.addResourceLocations("classpath:/static/");
}
public void addViewControllers(ViewControllerRegistry registry){
registry.addViewController("/main").setViewName("main");
registry.addViewController("/").setViewName("main");
registry.addViewController("/login").setViewName("login");
registry.addViewController("/registration").setViewName("registration");
}
}
...
public class WebSecurityConfig {
@Autowired
private UserService userService;
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(userService).passwordEncoder(bCryptPasswordEncoder());
}
@Bean
public BCryptPasswordEncoder bCryptPasswordEncoder() {
return new BCryptPasswordEncoder();
}
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception{
http
.authorizeHttpRequests((requests)->requests
.requestMatchers("/login","/static/**","/registration").permitAll()
.anyRequest().authenticated()
)
.formLogin((form)->form
.loginPage("/login")
.permitAll()
)
.logout((logout)->logout.permitAll());
return http.build();
}
@Bean
public UserDetailsService userDetailsService() {
UserDetails user =
User.withDefaultPasswordEncoder()
.username("user")
.password("password")
.roles("USER")
.build();
return new InMemoryUserDetailsManager(user);
}
}
...
@Service
public class UserService implements UserDetailsService {
@PersistenceContext
private EntityManager em;
@Autowired
UserRepository userRepository;
@Autowired
private RoleRepository roleRepository;
private BCryptPasswordEncoder bCryptPasswordEncoder;
@Override
public UserDetails loadUserByUsername(String email) throws UsernameNotFoundException {
User user = userRepository.findByEmail(email);
if(user == null){
throw new UsernameNotFoundException("User not found");
}
return user;
}
public User findUserById(Long userId){
Optional<User> userFromDb = userRepository.findById(userId);
return userFromDb.orElse(new User());
}
public List<User> allUser(){
return userRepository.findAll();
}
public boolean saveUser(User user){
User userFromDb = userRepository.findByEmail(user.getUsername());
Role userRole = roleRepository.findByName("ROLE_ADMIN");
String email = user.getEmail();
if(userRole == null){
userRole = roleRepository.findByName("ROLE_USER");
if(userRole == null) {
Role role = new Role("ROLE_USER");
roleRepository.save(role);
}
}
if(userFromDb != null) {
return false;
}
user.setRole(userRole);
user.setPassword(bCryptPasswordEncoder.encode(user.getPassword()));
userRepository.save(user);
return true;
}
public boolean deleteUser(Long userId){
if(userRepository.findById(userId).isPresent()){
userRepository.deleteById(userId);
return true;
}
return false;
}
public List<User> usergtList(List idMin){
return em.createQuery("SELECT u FROM User u WHERE u.id > :paramId", User.class)
.setParameter("paramId", idMin).getResultList();
}
}
...
@Entity
@Data
@Table(name = "role")
public class Role implements GrantedAuthority {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Long id;
@Column(name = "name")
private String name;
@Transient
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER, mappedBy = "role")
private Set<User> users;
public Role(){
}
public Role(String name){
this.name = name;
}
@Override
public String getAuthority() {
return getName();
}
public String getName() {
return name;
}
}