Обновление: я пытался внедрить токен CSRF, и теперь, когда я пытаюсь войти в систему, меня всегда перенаправляют на страницу входа по умолчанию Spring localhost: 8080 / login, и когда я снова вхожу, он снова перенаправляет меня на URL успешного входа в систему ....
Это мой WebSecurityConfig
@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
AccountDetailsService accountDetailsService;
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(accountDetailsService).passwordEncoder(passwordEncoder());
}
@Override
protected void configure(HttpSecurity http) throws Exception{
http
.authorizeRequests()
.antMatchers("/api/me").permitAll()
.antMatchers( HttpMethod.POST,"/api/addthing", "/api/addotherthing").hasRole("ADMIN")
.anyRequest().authenticated()
.and()
.formLogin()
.defaultSuccessUrl("http://192.168.1.105:3000/api/adminpage", true)
.and()
.logout()
.logoutSuccessUrl("http://192.168.1.105:3000/")
.logoutUrl("/logout")
.deleteCookies("JSESSIONID");
http.csrf().disable();
}
@Bean
public BCryptPasswordEncoder passwordEncoder(){
return new BCryptPasswordEncoder();
}
}
Вот мой AccountDetailsService
@Service("userDetailsService")
@Transactional
public class AccountDetailsService implements UserDetailsService {
@Autowired
AccountService accountService;
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
Account account = accountService.findAccountByUsername(username);
return new org.springframework.security.core.userdetails.User(
account.getUsername(), account.getPassword(),
true, true, true, true,
accountService.getAuthorities(account)
);
}
}
Также AccountSrvice:
@Service
public class AccountService {
@Autowired
AccountRepository accountRepository;
@Autowired
PasswordEncoder passwordEncoder;
public Account findAccountByUsername(String username){
return accountRepository.findFirstByUsername(username);
}
public List<GrantedAuthority> getAuthorities(Account account){
List<GrantedAuthority> roles = new ArrayList<>();
String role = account.getRole();
roles.add(new SimpleGrantedAuthority(role));
return roles;
}
public void createNewAccount(String username, String password, String role) {
Account account = new Account(username, passwordEncoder.encode(password), role);
accountRepository.save(account);
}
}
Проблема, с которой я сталкиваюсь, заключается в том, что после входа в систему я перенаправлен на сайт /api/adminpage/
, что означает, что вход выполнен успешно, верно? Но когда я пытаюсь получить своего Принципала с помощью этого метода:
@CrossOrigin
@GetMapping("/api/me")
public Principal getMe(Principal principal){
return principal;
}
Это просто дает мне пустой ответ, что означает, что я не вошел в систему .. Также, когда я пытаюсь сделать запрос POST для некоторых из URL в antMatches Я не могу ... Может кто-нибудь объяснить, что я здесь делаю не так?