2014-09-25 2 views
0

я попытался с ....Как удалить refreshtoken и токен доступа при выходе пользователя из системы oauth 2.0?

<sec:logout invalidate-session="true" logout-success-url="/logoutsuccess" logouturl="/logout/> 

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

моей безопасности servlet.xml выглядит следующим образом

<!-- Protected resources --> 
<sec:http create-session="never" entry-point-ref="oauthAuthenticationEntryPoint" 
    access-decision-manager-ref="accessDecisionManager" 
    xmlns="http://www.springframework.org/schema/security"> 
    <sec:anonymous enabled="false" /> 
    <sec:intercept-url pattern="/data/user/*" 
     access="IS_AUTHENTICATED_FULLY" /> 
    <sec:logout delete-cookies="JSESSIONID" invalidate-session="true" /> 
    <sec:custom-filter ref="resourceServerFilter" 
     before="PRE_AUTH_FILTER" /> 
    <sec:access-denied-handler ref="oauthAccessDeniedHandler" /> 
</sec:http> 

ответ

1

вы можете сделать эти вещи в sessionDestroyedListener ... почти выглядеть .. в этом коде я обновление даты lastLogout ..you может сделать вес шляпу вы хотите

@Component("sessionDestroyedEventListener") 
 
public class SessionDestroyedEventListener implements ApplicationListener<SessionDestroyedEvent>{ 
 

 

 
// \t private static Logger logger = BaseLogger.getLogger(AuthenticationEventListener.class); 
 
\t @Autowired 
 
\t private AuthenticationService authenticationService; 
 
\t 
 
\t public void setAuthenticationService(AuthenticationService authenticationService) { 
 
\t \t this.authenticationService = authenticationService; 
 
\t } 
 
\t /** 
 
\t * Capture sessionDestroyed event and update lastLogout date after session destroyed of particular user. 
 
\t */ 
 
\t @Override 
 
\t public void onApplicationEvent(SessionDestroyedEvent appEvent) { 
 
\t \t SessionDestroyedEvent event = (SessionDestroyedEvent) appEvent; 
 
\t \t Object obj = null; 
 
\t \t UserInfo userInfo = null; 
 
\t \t ArrayList<SecurityContext> sc = (ArrayList<SecurityContext>) event.getSecurityContexts(); 
 
\t \t Iterator<SecurityContext> itr = sc.iterator(); 
 

 
\t \t while (itr.hasNext()) { 
 
\t \t \t obj = itr.next().getAuthentication().getPrincipal(); 
 

 
\t \t \t if (obj instanceof UserInfo) { 
 
\t \t \t \t userInfo = (UserInfo) obj; 
 
\t \t \t } else { 
 
\t \t \t \t String userCode = (String) obj; 
 
\t \t \t \t if (userCode == null || "".equals(userCode)) { 
 
\t \t \t \t \t userCode = "UnDefinedUser"; 
 
\t \t \t \t } 
 
\t \t \t \t userInfo = new UserInfo(userCode); 
 

 
\t \t \t } 
 

 
    \t \t \t //authenticationService.updateLastLogoutDate(userInfo.getUsername()); 
 
\t \t } 
 

 
\t } 
 
}

+0

есть ли способ решить эту проблему с помощью конфигурации? – Prince

+0

..... Я использую эту конфигурацию. , но, по моему мнению, вы можете это сделать. –

1

В Spring-загрузки приложения я: 1. получить OAuth2AccessToken 2. используя это удалит OAuth2RefreshToken 3. а затем удалить себя

@Component 
public class CustomLogoutSuccessHandler 
     extends AbstractAuthenticationTargetUrlRequestHandler 
     implements LogoutSuccessHandler { 


    private static final String BEARER_AUTHENTICATION = "Bearer "; 
    private static final String HEADER_AUTHORIZATION = "authorization"; 

    @Autowired 
    private TokenStore tokenStore; 

    @Override 
    public void onLogoutSuccess(HttpServletRequest httpServletRequest, 
           HttpServletResponse httpServletResponse, 
           Authentication authentication) throws IOException, ServletException { 

     String token = httpServletRequest.getHeader(HEADER_AUTHORIZATION); 

     if (token != null && token.startsWith(BEARER_AUTHENTICATION)) { 
      String accessTokenValue = token.split(" ")[1]; 

      OAuth2AccessToken oAuth2AccessToken = tokenStore.readAccessToken(accessTokenValue); 
      if (oAuth2AccessToken != null) { 
       OAuth2RefreshToken oAuth2RefreshToken = oAuth2AccessToken.getRefreshToken(); 
       if (oAuth2RefreshToken != null) 
        tokenStore.removeRefreshToken(oAuth2RefreshToken); 

       tokenStore.removeAccessToken(oAuth2AccessToken); 
      } 
     } 

     httpServletResponse.setStatus(HttpServletResponse.SC_OK); 
    } 

} 
Смежные вопросы