使用弹簧安全休息在 grails 中注销

时间:2021-01-15 16:57:32

标签: grails spring-security-rest

我正在使用 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 {
  }
}

文档仅说明了编写 storeTokenremoveToken 方法,但我也覆盖了 loadUserByToken 方法,因为 jwtService.parse() 不起作用,因为 jwtService 为空,所以现在我使用 JWTParser.parse ()

这是我对/api/login的请求。

POST /api/logout HTTP/1.1
Host: localhost:8080
Authorization: Bearer eyJhbGciOiJIUzI1NiJ9.

0 个答案:

没有答案