Почему значение Authentication переданный в параметр контроллера является null?
У меня есть простой код:
@Controller
@RequestMapping(value = "/")
public class HomeController {
@GetMapping(value = {"/", "home"})
public String home(Authentication authentication) {
System.out.println("Authentication: " + authentication);
// Output: Authentication: null
System.out.println("Authentication: " + SecurityContextHolder.getContext().getAuthentication());
// Output: AnonymousAuthenticationToken [Principal=anonymousUser, Credentials=[PROTECTED], Authenticated=true...
return "home";
}
}
Объект Authentication, который я получаю через парметр контроллера является null, но SecurityContextHolder.getContext().getAuthentication() возвращает правильные данные.
Насколько я знаю, за передачу данных контроллеру через параметр метода отвечают различные фильтры. Но в данном случае параметр Authentication почему-то игнорируется ими.
Почему значение Authentication переданный в параметр контроллера является null?
Моя конфигурация Spring Security:
@Configuration
@EnableWebSecurity
public class WebSecurityConfig {
@Bean
public SecurityFilterChain filter(HttpSecurity http, SecurityContextRepository securityContextRepository, CustomAccessDeniedHandler accessDeniedHandler,
CustomAuthenticationFailureHandler authenticationFailureHandler, RememberMeServices rememberMeServices) throws Exception {
return http
.addFilterAfter(new CsrfTokenLogger(), CsrfFilter.class)
.authorizeHttpRequests((requests) -> requests
.requestMatchers("/", "/home", "/login", "/register", "/logout").permitAll()
.requestMatchers(HttpMethod.POST, "/login", "/register", "/logout").permitAll()
.requestMatchers("/user").hasAnyAuthority("USER", "ADMIN")
.requestMatchers("/admin").hasAnyAuthority("ADMIN")
.anyRequest().authenticated()
)
.formLogin((form) -> form.loginPage("/login").failureHandler(authenticationFailureHandler).securityContextRepository(securityContextRepository).permitAll())
.logout((logout) -> logout.logoutUrl("/logout").logoutSuccessUrl("/").invalidateHttpSession(true).deleteCookies("JSESSIONID").permitAll())
.rememberMe((remember) -> remember.rememberMeServices(rememberMeServices))
.securityContext(securityContext -> securityContext.securityContextRepository(securityContextRepository))
.exceptionHandling((exception) -> exception.authenticationEntryPoint(new LoginUrlAuthenticationEntryPoint("/login")).accessDeniedHandler(accessDeniedHandler))
.build();
}
@Bean
public RememberMeServices rememberMeServices(UserDetailsService userDetailsService) {
TokenBasedRememberMeServices.RememberMeTokenAlgorithm encodingAlgorithm = TokenBasedRememberMeServices.RememberMeTokenAlgorithm.SHA256;
TokenBasedRememberMeServices rememberMe = new TokenBasedRememberMeServices("secretKeyForRememberMeToken", userDetailsService, encodingAlgorithm);
rememberMe.setMatchingAlgorithm(TokenBasedRememberMeServices.RememberMeTokenAlgorithm.MD5);
return rememberMe;
}
@Bean
public SecurityContextRepository securityContextRepository() {
return new DelegatingSecurityContextRepository(
new RequestAttributeSecurityContextRepository(),
new HttpSessionSecurityContextRepository()
);
}
@Bean
public AuthenticationManager authenticationManager(UserDetailsService userDetailsService, PasswordEncoder passwordEncoder) {
DaoAuthenticationProvider authenticationProvider = new DaoAuthenticationProvider();
authenticationProvider.setUserDetailsService(userDetailsService);
authenticationProvider.setPasswordEncoder(passwordEncoder);
return new ProviderManager(authenticationProvider);
}
@Bean
public PasswordEncoder passwordEncoder() {
return NoOpPasswordEncoder.getInstance();
}
}
Spring Boot Starter Parent 3.2.1