Я попытался реализовать, чтобы установить cookie с HttpOnly в весенней безопасности. Мне удалось установить cookie в моем ответе, но его невозможно удалить при выходе из системы.
Я использовал deleteCookies("COOKIE_KEY");
(реализация - CookieClearingLogoutHandler.java), чтобы удалить cookie в классе Security Config, ноКогда я посмотрел на источник, этот метод не справился с HttpOnly. Итак, я думаю, что это не сработало из-за этого.
Должен ли я реализовать удаление cookie с помощью явного cookie.setHttpOnly(true);
? Если есть правильный способ его реализации, пожалуйста, дайте мне совет.
Примечание: я использовал версию ниже.
- OpenJDK11
- SpringSecurity 5.1.5
CookieClearingLogoutHandler.java
public CookieClearingLogoutHandler(String... cookiesToClear) {
Assert.notNull(cookiesToClear, "List of cookies cannot be null");
List<Function<HttpServletRequest, Cookie>> cookieList = new ArrayList<>();
for (String cookieName : cookiesToClear) {
Function<HttpServletRequest, Cookie> f = (request) -> {
Cookie cookie = new Cookie(cookieName, null);
String cookiePath = request.getContextPath() + "/";
cookie.setPath(cookiePath);
cookie.setMaxAge(0);
return cookie;
};
cookieList.add(f);
}
this.cookiesToClear = cookieList;
}
И вот мои примеры кодов.
SecurityConfig.java
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
private final HelloProvider helloProvider;
public SecurityConfig(
AuthenticationManagerBuilder authenticationManagerBuilder,
HelloProvider helloProvider
){
this.helloProvider = helloProvider;
}
@Override
public void configure(HttpSecurity http) throws Exception {
// Basic settings
http
.cors().disable()
.authorizeRequests()
.antMatchers("/api/logout").permitAll()
.anyRequest().authenticated()
.and().csrf().disable()
.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS);
// Custom Filter
HelloFilter filter = new HelloFilter();
filter.setRequiresAuthenticationRequestMatcher(new AntPathRequestMatcher("/api/auth","POST"));
filter.setAuthenticationManager(authenticationManagerBean());
http.addFilter(filter);
// Logout
http
.logout()
.logoutUrl("/api/logout")
.logoutSuccessHandler(authenticationLogoutSuccesshandler())
.deleteCookies("COOKIE_ID")
.invalidateHttpSession(true);
}
@Override
public void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.authenticationProvider(helloProvider);
}
@Bean
public LogoutSuccessHandlerImpl authenticationLogoutSuccesshandler() {
return new LogoutSuccessHandlerImpl();
}
HelloFilter.java
public class HelloFilter extends UsernamePasswordAuthenticationFilter {
@Override
public Authentication attemptAuthentication(HttpServletRequest request,
HttpServletResponse response) throws AuthenticationException {
UsernamePasswordAuthenticationToken authRequest = new UsernamePasswordAuthenticationToken(
"principal", "credentials");
setDetails(request, authRequest);
return this.getAuthenticationManager().authenticate(authRequest);
}
@Override
protected void successfulAuthentication(HttpServletRequest request, HttpServletResponse response, FilterChain chain, Authentication authResult) throws IOException, ServletException {
// Override this method to return 200 response and set the cookie.
Cookie cookie = new Cookie("COOKIE_ID", "cookievalue");
cookie.setHttpOnly(true);
cookie.setMaxAge(-1);
cookie.setPath("/");
response.addCookie(cookie);
}
}
HelloProvider.java
@Configuration
public class HelloProvider implements AuthenticationProvider {
@Override
public Authentication authenticate(Authentication authentication) throws AuthenticationException {
return new UsernamePasswordAuthenticationToken("principal", "credentials", new ArrayList<>());
}
@Override
public boolean supports(Class<?> authentication) {
return true;
}
}
LogoutSuccessHandlerImpl.java
public class LogoutSuccessHandlerImpl implements LogoutSuccessHandler {
@Override
public void onLogoutSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException {
response.setStatus(HttpServletResponse.SC_OK);
}
}
Я подтвердил, что куки не были удалены с помощью Почтальона. Я прикрепил изображения.
Изображение: Ответ с cookie для удаления самого себя
Изображение: Все еще там печенье ...