问题描述
我正在使用 spring-security-rest:2.0.0.M2
。
根据文档
使用 JWT 令牌时无法注销(默认策略), 因为服务器中没有保存状态。如果您还想注销, 你可以通过创建一个子类来提供你自己的实现 JwtTokenStorageService 并覆盖方法 storetoken 和 删除令牌。我目前只删除客户端 JWT 来注销。
我也试图通过使用 /api/login
端点从服务器端注销。
我已经创建了自己的继承自 JwtTokenStorageService
的类并且我已经在 resource.groovy
中注册了它,但是我不知道如何实现 removetoken 方法来删除令牌。>
在注册我的 JwtTokenStorageService 实现之前,发送到 /api/logout
的帖子返回了 404 错误,现在我已经注册了它,我已经获得了 200 状态,但是令牌仍然没有被删除。
我还没有找到应该如何实现 removetoken 方法,因为该方法只接收一个字符串作为参数,而该类没有类似于 remove 或 delete 的方法。
这是我的 JwtTokenStorageService:
class CustomTokenStorageService extends JwtTokenStorageService {
JwtService jwtService
@Override
UserDetails loadUserByToken(String tokenValue) throws TokenNotFoundException {
Date Now = new Date()
try {
JWT jwt = JWTParser.parse(tokenValue)
if (jwt.JWTClaimsSet.expirationTime?.before(Now)) {
throw new TokenNotFoundException("Token ${tokenValue} has expired")
}
def roles = jwt.JWTClaimsSet.getStringArrayClaim('roles')?.collect { new SimpleGrantedAuthority(it) }
try {
UserDetails details = JwtService.deserialize(jwt.JWTClaimsSet.getStringClaim('principal'))
if (details) {
return details
}
} catch (exception) {
}
return new org.springframework.security.core.userdetails.User(jwt.JWTClaimsSet.subject,'N/A',roles)
} catch (ParseException pe) {
throw new TokenNotFoundException("Token ${tokenValue} is not valid")
} catch (JOSEException je) {
throw new TokenNotFoundException("Token ${tokenValue} has an invalid signature")
}
}
@Override
void storetoken(String tokenValue,UserDetails principal) {
}
@Override
void removetoken(String tokenValue) throws TokenNotFoundException {
}
}
文档仅说明了编写 storetoken
和 removetoken
方法,但我也覆盖了 loadUserByToken
方法,因为 jwtService.parse()
不起作用,因为 jwtService
为空,所以现在我使用 JWTParser.parse ()
。
这是我对/api/login
的请求。
POST /api/logout HTTP/1.1
Host: localhost:8080
Authorization: Bearer eyJhbGciOiJIUzI1NiJ9.
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)