在注销控制器中,我尝试编写了很多代码组合。现在我有了这个:
final Authentication auth = SecurityContextHolder.getContext().getAuthentication();
if (auth != null) {
new SecurityContextLogoutHandler().logout(request, response, auth);
}
SecurityContextHolder.getContext().setAuthentication(null);
auth.setAuthenticated(false);
但提供的代码执行令牌仍然有效。
我错了什么?如何最终撤销令牌?
答案 0 :(得分:10)
您正在寻找的课程是
DefaultServices
,方法revokeToken(String tokenValue)
。
答案 1 :(得分:3)
如果您需要为当前用户之外的其他用户撤消令牌(例如,管理员想要禁用用户帐户),您可以使用此权限:
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.TokenStore
且consumerTokenServices
为org.springframework.security.oauth2.provider.token.ConsumerTokenServices
答案 2 :(得分:0)
线程有点旧但是对于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);
}
在客户端,只需拦截此错误并断开用户连接 希望这有助于某人。
答案 3 :(得分:0)
使用DefaultTokenServices的当前授权用户的令牌撤销的简单示例:
@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);
}
}
答案 4 :(得分:-2)
自动装配DefaultTokenServices然后使用此代码:
String authHeader = request.getHeader("Authorization");
String tokenValue = authHeader.replace("bearer", "").trim();
tokenService.revokeToken(tokenValue);
tokenService.setAccessTokenValiditySeconds(1);
tokenService.setRefreshTokenValiditySeconds(1);
只需尝试使用代码撤消访问令牌。