Spring Security: не поддерживает удаление куки с помощью httponly в методе deleteCookies - PullRequest
0 голосов
/ 18 октября 2019

Я попытался реализовать, чтобы установить 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 для удаления самого себя

Изображение: Все еще там печенье ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...