Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Spring Security. logout - 403 Forbidden / 7 сообщений из 7, страница 1 из 1
04.01.2016, 15:00
    #39141977
wvetal
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring Security. logout - 403 Forbidden
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
04.01.2016, 15:22
    #39141984
wvetal
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring Security. logout - 403 Forbidden
... странно получается, вот что получаю:
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
04.01.2016, 15:48
    #39141996
wvetal
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring Security. logout - 403 Forbidden
... вот еще наблюдение:

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

Буду благодарен за любые мысли, идеи.
...
Рейтинг: 0 / 0
04.01.2016, 19:49
    #39142104
imperfekt
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring Security. logout - 403 Forbidden
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
06.01.2016, 09:41
    #39142612
JonnySKS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring Security. logout - 403 Forbidden
Можно делегировать обработку логаута Spring Security, если не требуется какая то особая кастомизация
Код: java
1.
2.
3.
4.
http
    .logout()
        .logoutRequestMatcher(new AntPathRequestMatcher("/logout"))
        .logoutSuccessUrl("/index")
...
Рейтинг: 0 / 0
06.01.2016, 11:17
    #39142637
wvetal
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring Security. logout - 403 Forbidden
Похоже проблема была на клиенте.

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

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



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


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