powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Spring Security. logout - 403 Forbidden
7 сообщений из 7, страница 1 из 1
Spring Security. logout - 403 Forbidden
    #39141977
wvetal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AppSecurityConfig.java:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
    @Override
    protected void configure(HttpSecurity http) throws Exception {
      http
        .httpBasic().and()
        .authorizeRequests()
        	.antMatchers("/app/index.html", "/").permitAll()
        	.antMatchers("/app/vendor/**").permitAll()
        	.antMatchers("/app/styles/**").permitAll()
        	.antMatchers("/app/scripts/**").permitAll()
        	.antMatchers("/app/views/partial/NavbarDirective.html").permitAll()
        	.antMatchers("/app/views/home.html").permitAll()
        	.antMatchers("/app/views/login.html").permitAll()
        	.antMatchers("/logout").permitAll()
        	.anyRequest()
        	.authenticated().and()
        	.logout().permitAll().and()
        	.csrf().csrfTokenRepository(csrfTokenRepository()).and()
        	.addFilterAfter(new CsrfHeaderFilter(), CsrfFilter.class);
    }
    
    public class CsrfHeaderFilter extends OncePerRequestFilter {
  	  @Override
  	  protected void doFilterInternal(HttpServletRequest request,
  	      HttpServletResponse response, FilterChain filterChain)
  	      throws ServletException, IOException {
  	    CsrfToken csrf = (CsrfToken) request.getAttribute(CsrfToken.class
  	        .getName());
  	    if (csrf != null) {
  	      Cookie cookie = WebUtils.getCookie(request, "XSRF-TOKEN");
  	      String token = csrf.getToken();
  	      if (cookie==null || token!=null && !token.equals(cookie.getValue())) {
  	        cookie = new Cookie("XSRF-TOKEN", token);
  	        cookie.setPath("/");
  	        response.addCookie(cookie);
  	      }
  	    }
  	    filterChain.doFilter(request, response);
  	  }
    }
    
    private CsrfTokenRepository csrfTokenRepository() {
  	  HttpSessionCsrfTokenRepository repository = new HttpSessionCsrfTokenRepository();
  	  repository.setHeaderName("X-XSRF-TOKEN");
  	  return repository;
  	}


На клиенте Angular.
Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
  $scope.logout = function() {
	  $http.post('/myapp/logout', {}).success(function() {
	    $rootScope.authenticated = false;
	    $rootScope.admin = false;
	    $rootScope.user = false;
	    $location.path("#/");
	    $templateCache.removeAll();
	  }).error(function(data) {
	    $rootScope.authenticated = false;
	    $rootScope.admin = false;
	    $rootScope.user = false;
	    $templateCache.removeAll();
	  });
  }


При нажатии на клиенте logout получаю:
POST XHR http://localhost:8080/myapp/logout [HTTP/1.1 403 Forbidden 7мс]

Что необходимо подправить, чтоб logout сработал?
Что я упустил?
...
Рейтинг: 0 / 0
Spring Security. logout - 403 Forbidden
    #39141984
wvetal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
... странно получается, вот что получаю:
POST XHR http://localhost:8080/myapp/logout [HTTP/1.1 403 Forbidden 5мс]
GET XHR http://localhost:8080/myapp/app/views/login.html [HTTP/1.1 200 OK 6мс]
GET XHR http://localhost:8080/myapp/rest/user [HTTP/1.1 200 OK 7мс]
POST XHR http://localhost:8080/myapp/logout [HTTP/1.1 302 Found 7мс]

Интересно, почему первый раз logout не срабатывает, а второй срабатывает?
...
Рейтинг: 0 / 0
Spring Security. logout - 403 Forbidden
    #39141996
wvetal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
... вот еще наблюдение:

Когда, вызываю logout из:
http://localhost:8080/myapp/app/index.html#/ - logout не работает
а когда нахожусь, в любом другом месте, например
http://localhost:8080/myapp/app/index.html#/admin - logout работает.

Буду благодарен за любые мысли, идеи.
...
Рейтинг: 0 / 0
Spring Security. logout - 403 Forbidden
    #39142104
imperfekt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
wvetal,

Я бы так попробовал:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
@Override
    public void configure(WebSecurity web) throws Exception {
        web
                .ignoring()
                // following resources will be ignored be spring security
                .antMatchers(
                        "/app/styles/**",
                        "/app/scripts/**",
                        "/app/index.html");
    }

@Override
    protected void configure(HttpSecurity http) throws Exception {
      http
        .httpBasic().and()
        .authorizeRequests()
        	.antMatchers("/app/vendor/**").permitAll()
        	.antMatchers("/app/views/partial/NavbarDirective.html").permitAll()
        	.antMatchers("/app/views/home.html").permitAll()
        	.antMatchers("/app/views/login.html").permitAll()
        	.antMatchers("/**").authenticated()
                .and()
        	.logout()
                // logout URL
                .logoutUrl("/logout")
                // optional - define logout success handler (custom logic when logging user out)
                .logoutSuccessHandler(myLogoutSuccessHandler())
                // optional - when user is logged out, his HTTP session will be invalidated
                .invalidateHttpSession(true);
                .and()
        	.csrf().csrfTokenRepository(csrfTokenRepository()).and()
        	.addFilterAfter(new CsrfHeaderFilter(), CsrfFilter.class);
    }



Идей особых пока нет, кроме как смотреть в логе, какой из фильтров заворачивает запрос на logout.
...
Рейтинг: 0 / 0
Spring Security. logout - 403 Forbidden
    #39142612
Фотография JonnySKS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно делегировать обработку логаута Spring Security, если не требуется какая то особая кастомизация
Код: java
1.
2.
3.
4.
http
    .logout()
        .logoutRequestMatcher(new AntPathRequestMatcher("/logout"))
        .logoutSuccessUrl("/index")
...
Рейтинг: 0 / 0
Spring Security. logout - 403 Forbidden
    #39142637
wvetal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Похоже проблема была на клиенте.

Придумал такой костыль:
Когда пользователь залогинивается - переадресовываю его на страничку welcome
http://localhost:8080/myapp/app/index.html#/welcome

После этого logout прекрасно работает.
...
Рейтинг: 0 / 0
Spring Security. logout - 403 Forbidden
    #39144285
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
как вариант - добавить такой контроллер на сервере



Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
@RestController
public class CsrfController {

    @RequestMapping(value = "/csrf", method = RequestMethod.GET)
    public CsrfToken csrf(CsrfToken token ) {
        return token;
    }

    @ExceptionHandler(HttpSessionRequiredException.class)
    @ResponseStatus(value = HttpStatus.UNAUTHORIZED, reason = "The session has expired")
    public String handleSessionExpired() {
        return "sessionExpired";
    }
}



на клиенте получать текущий токен и отправлять его в каждом POST запросе

Код: javascript
1.
2.
3.
4.
5.
      $.get("/csrf", function(data) {
            _csrf = data.token;
           

        });
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Spring Security. logout - 403 Forbidden
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]