Я настраиваю веб-приложение со страницей входа. При входе в систему все выглядит хорошо, но после перезагрузки страницы Security Context Holder возвращает «anonymousUser», но аутентифицируется. Я сравнил контексты, и они разные. Как это исправить?
Я также пытался настроить контекст безопасности вручную, но он не работает.
Это контроллер
@RestController
public class LoginController {
@Autowired
UserRepository userRepository;
@PostMapping(path = "/login")
public ResponseEntity login(Principal principal){
User byLogin = userRepository.findByLogin(principal.getName());
if(byLogin != null){
UserDTO userDTO = new UserDTO(byLogin);
System.out.println(SecurityContextHolder.getContext().getAuthentication().getName());
System.out.println(SecurityContextHolder.getContext().getAuthentication().isAuthenticated());
return ResponseEntity.status(200).body(userDTO);
}
else{
return ResponseEntity.status(401).build();
}
}
@GetMapping(path = "/checkAuthentication")
@ResponseBody
public boolean checkAuthentication(){
System.out.println(SecurityContextHolder.getContext().getAuthentication().isAuthenticated());
System.out.println(SecurityContextHolder.getContext().getAuthentication().getName());
if(SecurityContextHolder.getContext().getAuthentication().isAuthenticated()){
if(!SecurityContextHolder.getContext().getAuthentication().getName().equals("anonymousUser")){
return SecurityContextHolder.getContext().getAuthentication().isAuthenticated();
}
}
return false;
}
Это Конфигурация
@Configuration
@EnableWebSecurity
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
@Autowired
UserDetailsImpl userDetails;
@Bean
public DaoAuthenticationProvider daoAuthenticationProvider(){
DaoAuthenticationProvider authenticationProvider = new DaoAuthenticationProvider();
authenticationProvider.setUserDetailsService(userDetails);
authenticationProvider.setPasswordEncoder(passwordEncoder());
return authenticationProvider;
}
@Override
protected void configure(AuthenticationManagerBuilder authenticationManagerBuilder){
authenticationManagerBuilder.authenticationProvider(daoAuthenticationProvider());
}
@Override
protected void configure(HttpSecurity httpSecurity) throws Exception {
httpSecurity.addFilterBefore(new CorsConfiguration(), ChannelProcessingFilter.class);
httpSecurity
.authorizeRequests()
.antMatchers("/**")
.permitAll()
.anyRequest()
.authenticated()
.and()
.logout()
.logoutUrl("logout")
.deleteCookies("JSESSIONID")
.and()
.httpBasic()
.and()
.csrf()
.disable();
}
@Bean
public PasswordEncoder passwordEncoder(){
return new BCryptPasswordEncoder();
}
}
Это реализация UserDetails
@Service
public class UserDetailsImpl implements UserDetailsService {
@Autowired
UserRepository userRepository;
@Override
public UserDetails loadUserByUsername(String login) throws
UsernameNotFoundException {
User user = userRepository.findByLogin(login);
if(user != null){
UserService userService = new UserService();
userService.setUser(user);
return userService;
}
else {
throw new UsernameNotFoundException(login);
}
}
}
Это класс UserService
public class UserService implements UserDetails {
User user;
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
@Override
public Collection<? extends GrantedAuthority> getAuthorities() {
return null;
}
@Override
public String getPassword() {
return user.getPassword();
}
@Override
public String getUsername() {
return user.getLogin();
}
@Override
public boolean isAccountNonExpired() {
return true;
}
@Override
public boolean isAccountNonLocked() {
return true;
}
@Override
public boolean isCredentialsNonExpired() {
return true;
}
@Override
public boolean isEnabled() {
return true;
}
}
и сущность пользователя
@Entity
public class User {
@Id
int id;
@Column(name = "login")
String login;
@Column(name = "password")
String password;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getLogin() {
return login;
}
public void setLogin(String login) {
this.login = login;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}