2014-02-24 4 views
7

로그 아웃 컨트롤러에서 코드 조합을 많이 작성했습니다. 지금이 있습니다 :봄 보안에서 인증 토큰을 취소하는 방법은 무엇입니까?

final Authentication auth = SecurityContextHolder.getContext().getAuthentication(); 

if (auth != null) { 
    new SecurityContextLogoutHandler().logout(request, response, auth); 
} 

SecurityContextHolder.getContext().setAuthentication(null); 
auth.setAuthenticated(false); 

그러나 제공된 코드 실행 토큰은 여전히 ​​유효합니다.

무엇이 잘못 되었나요? 결국 토큰을 취소하는 방법?

답변

9

원하는 클래스는 DefaultServices, 방법은 revokeToken(String tokenValue)입니다.

Here 토큰을 취소하는 컨트롤러의 예 및 빈을 사용하는 oauth2 구성.

String authHeader = request.getHeader("Authorization"); 
String tokenValue = authHeader.replace("bearer", "").trim(); 
tokenService.revokeToken(tokenValue); 
tokenService.setAccessTokenValiditySeconds(1); 
tokenService.setRefreshTokenValiditySeconds(1); 

그냥 액세스 토큰을 취소 할 코드를 시도 :

+3

@raonirenosto, 나는 당신의 예제를 사용하여 Spring으로 프록시 된 클래스를 autowiring하는 데 문제가있다. DefaultTokenServices를 작동시키기 위해 ConsumerTokenServices (인터페이스)로 변경해야했습니다. 하지만 DefaultTokenServices.revokeToken()을 사용하여 제안 해 주셔서 감사합니다. – vutbao

+0

제가 처음 보았을 때, 봄 Oauth는 많은 수업을 변경했습니다. 나는 프레임 워크가 내가이 예제를 쓴 것보다 더 안정적이라고 생각한다. – raonirenosto

-2

자동으로 묶어 DefaultTokenServices는이 코드를 사용합니다. tokenStoreorg.springframework.security.oauth2.provider.token.TokenStoreconsumerTokenServices 존재 인으로

Collection<OAuth2AccessToken> tokens = tokenStore.findTokensByClientIdAndUserName(
                  "my_oauth_client_id", 
                  user.getUsername()); 
for (OAuth2AccessToken token : tokens) { 
    consumerTokenServices.revokeToken(token.getValue()); 
} 

: 당신은 (예 : 관리자가 사용자 계정을 비활성화하고 싶어) 현재보다 다른 사용자 토큰을 취소해야하는 경우

+0

누군가이 답변이 왜 왜곡 된 이유를 친절하게 설명해야합니다. 왜 이것이 권장되지 않는가? – Olantobi

+0

@Olantobi 이렇게하면 토큰 유효 시간을 변경하면 하나의 토큰이 아닌 전체 응용 프로그램의 토큰 유효 기간이 변경되기 때문입니다. – Mikk

1

, 당신은이를 사용할 수 있습니다 a org.springframework.security.oauth2.provider.token.ConsumerTokenServices

0

스레드가 조금 오래되었지만 JWTToken 사용자의 경우 토큰이 저장되지 않아 작동하지 않습니다. 다른 옵션은 필터를 사용하는 것입니다. 1 관리자가 데이터베이스에서 사용자를 잠 그거나 잠금 해제 할 수있는 방법을 만듭니다. 2는 필터를 사용하는 방법은 인증 검사를 필요로하는 경우 사용자는

exemple 활성인지 아닌지 : 그냥이 사람을 도움이 오류와 분리 사용자 희망을 가로채는

@Override 
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { 
    Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); 
    if(authentication != null 
      && authentication.getName() != null 
      && !authentication.getName().equalsIgnoreCase("anonymousUser")) { 
     UserModel user = userService.getUser(authentication.getName()); 
     if(user != null && !user.isActivated()) 
      throw new SecurityException("SECURITY_USER_DISABLED"); 
    } 
    chain.doFilter(request, response); 
} 

클라이언트 측에.

관련 문제