如何撤销spring security中的auth令牌?

java spring spring-security-oauth2

14096 观看

5回复

10811 作者的声誉

在注销控制器中,我试着编写了很多代码组合。现在我有这个:

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

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

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

但提供的代码执行令牌仍然有效。

我错了什么?如何最终撤销令牌?

作者: gstackoverflow 的来源 发布者: 2014 年 2 月 24 日

回应 (5)


10

921 作者的声誉

决定

你正在寻找的课程是 DefaultServices方法revokeToken(String tokenValue)

这里是一个撤销令牌的控制器的例子,这里DefaultServicesbean 的oauth2配置。

作者: raonirenosto 发布者: 14.05.2014 10:45

-2

1 作者的声誉

自动装载DefaultTokenServices然后使用此代码:

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

只需尝试代码即可撤消访问令牌。

作者: Suresh.U 发布者: 24.11.2016 12:13

3

11591 作者的声誉

如果您需要为当前用户之外的其他用户撤消令牌(例如,管理员想要禁用用户帐户),您可以使用以下命令:

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

随着tokenStore作为一个org.springframework.security.oauth2.provider.token.TokenStoreconsumerTokenServices作为一个org.springframework.security.oauth2.provider.token.ConsumerTokenServices

作者: Wim Deblauwe 发布者: 21.03.2017 05:00

0

377 作者的声誉

线程有点旧但是对于JWTToken用户来说这不起作用,因为没有存储令牌。所以另一种选择是使用过滤器。1创建一个管理员锁定/解锁数据库用户的方法。2使用过滤器,如果方法需要身份验证,请检查用户是否处于活动状态

例如:

@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);
}

在客户端只是拦截此错误并断开用户希望这有助于某人。

作者: mcfly 发布者: 13.01.2018 12:46

0

43 作者的声誉

使用DefaultTokenServices的当前授权用户的令牌撤销的简单示例:

  1. 需要Bean用于默认令牌存储

    @Bean 
    public DefaultTokenServices tokenServices() {
         DefaultTokenServices defaultTokenServices = new DefaultTokenServices();
         defaultTokenServices.setTokenStore(tokenStore());
         defaultTokenServices.setSupportRefreshToken(true);
         return defaultTokenServices;
    }
    
  2. 然后你可以编写自己的控制器

    @RestController
    @RequestMapping("/user")
    public class UserApi {
    
    @Autowired
    private DefaultTokenServices tokenServices;
    
    @Autowired
    private TokenStore tokenStore;
    
    @DeleteMapping("/logout")
    @ResponseStatus(HttpStatus.NO_CONTENT)
    public void revokeToken() {
        final OAuth2Authentication auth = (OAuth2Authentication) SecurityContextHolder
                .getContext().getAuthentication();
        final String token = tokenStore.getAccessToken(auth).getValue();
        tokenServices.revokeToken(token);
    }
    }
    
作者: lukascode 发布者: 16.06.2018 08:24
32x32