У меня есть API весенней загрузки 2.2.4 с пружинной защитой, и я делаю свою собственную форму входа в систему, мне удается правильно пройти аутентификацию с использованием фреймворка, но позже по другим запросам, когда я пытаюсь извлечь объект Authentication из SecurityContext, который я получаю
"name": "anonymousUser"
Вот мой весенний конфигурационный файл безопасности:
@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(securedEnabled = true)
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
CustomSecurityService customSecurityService;
@Autowired
CustomPasswordEncoder passwordEncoder;
@Bean
@Override
public AuthenticationManager authenticationManagerBean() throws Exception {
return super.authenticationManagerBean();
}
@Bean
public WebMvcConfigurer corsConfigurer() {
return new WebMvcConfigurer() {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**").allowedOrigins("http://localhost:4200");
}
};
}
@Override
public void configure(WebSecurity web) throws Exception {
web.ignoring().antMatchers("/*.js", "/images/**", "/assets/**", "/favicon.ico", "/index.html", "/*.woff",
"/*.woff2", "/*.eot", "/*.css", "/*.jpg", "/*.ttf");
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests().antMatchers("/login", "/user").permitAll().antMatchers("/**").authenticated().and()
.formLogin().loginProcessingUrl("/login").successHandler((request, response, authentication) -> {
HttpSession session = request.getSession();
Authentication authUser = SecurityContextHolder.getContext().getAuthentication();
session.setAttribute("username", authUser.getName());
session.setAttribute("authorities", authentication.getAuthorities());
// set our response to OK status
response.setStatus(HttpServletResponse.SC_OK);
response.setHeader("Access-Control-Allow-Origin", "*");
}).and().csrf().disable();
}
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(customSecurityService).passwordEncoder(passwordEncoder);
}
}
как только я получаю одобренный ответ, я пытаюсь получить текущего пользователя с помощью контроллера
@GetMapping(value = "/user")
public ResponseEntity<?> getUserDetails() {
Authentication auth = SecurityContextHolder.getContext().getAuthentication();
if (auth != null) {
return ResponseEntity.ok().body(auth);
}else {
return ResponseEntity.badRequest().build();
}
}
. im получить следующий ответ (в формате json для моего клиента)
{"полномочия": [{"полномочия": "ROLE_ANONYMOUS"}], "деталь": { "remoteAddress": "0: 0: 0: 0: 0: 0: 0: 1", "SESSIONID": нулевая}, "проверка подлинности": правда, "главный": "anonymousUser", "keyHa sh": - 1635720795, "credentials": "", "name": "anonymousUser"}
где моя аутентификация? в этот момент я ожидал получить пользователя, вошедшего в систему.
я не вмешивался в настройки сеанса и не объявил / не изменил сеанс на состояние без состояния.
в getUserDetails я пытался получить доступ к атрибуту сеанса имени пользователя - он нулевой, даже если я его установил.
последний, но не менее важный - я переопределил обработчик успеха по умолчанию потому что я не хочу, чтобы он предлагал поведение перенаправления.