当前位置: 首页 > 知识库问答 >
问题:

在Spring应用程序中注销时删除JWT

吕作人
2023-03-14

共有1个答案

边国安
2023-03-14

长话短说,您必须构建一种机制,以便在注销时手工删除令牌或使其无效。

你应该问自己的问题是

  • 是否需要将JWT令牌存储在数据库中?如果是,为什么?
    null
  • 自定义验证工作流以添加更多自定义检查
  • 在对标记进行验证签名有效性过期时间和其他一些默认检查之前,您可以运行自己的自定义检查,如果自定义检查通过,则继续执行,否则不能通过!

那么,除了黑名单之外,您还可以执行以下操作

只需将JWT令牌的uniquely-identification-metadata作为密钥存储到redis中,并赋予它与JWT令牌过期时间相同的过期时间,以便令牌过期时自毁

set key {replace_with_jwt_unique_identifier} ex {jwt_expiry_timestamp}

风险:Redis存储在内存中,条目没有持久化。

不要使用Redis或者不想冒这个险。可以将database与自定义数据库表一起使用。一个单独的表,它是

  • 与JWT记录相关,并且在删除级联上有
  • 与JWT记录无关,您必须自己维护

normal请求附带JWT时,使用JWT查询in-memorystore或database表以查看是否存在记录。对于in-memorystore,简单的existing检查就足够了。对于数据库表,您需要执行更多的检查(例如exist和not experial,等等),如果检查通过了let the请求,否则,您将不能通过!

当出现注销请求时,如果是内存中存储区,只需删除并继续(如果找到),如果是数据库,则可以删除JWT记录,该记录将级联到新表。

嗯,你能做到的

  • 首先使用自定义顶级筛选器或
  • 您可以展开verifyendpoint工作流来执行这些额外的检查

我所使用的项目不要求令牌在logout时无效,因此我不必跨过这座桥梁。我必须展开verifyendpoint,以确保如果所有的自定义检查都通过了,则令牌是有效的。

除了你指出的教程。还有其他一些SO问题也讨论了类似的问题。见

 类似资料:
  • 我有两个spring boot应用程序。 模块1在端口8080上运行 模块2在端口9090上运行 我已在应用程序中使用此属性设置端口。属性文件 这两个模块都有/登录/注册,无需通过下面的代码进行身份验证即可访问。 任何其他请求都需要对用户进行身份验证。 如果我一次使用一个模块没有问题, 但是如果尝试同时来回使用它们,那么问题是我每次使用另一个应用程序时都必须再次登录到之前的应用程序。例如。 转到模

  • 我在springsecurity和oauth2中注销有问题 我们使用Spring SecurityOAuth2保护REST服务。令牌和REST apiendpoint是无状态的,不需要会话。我只需要身份验证服务器一次登录验证,当我在rest客户端中调用注销服务时,它显示200响应,但没有删除授权。当我输入用户名和密码时,应该是同一个用户登录。但不注销。我还澄清了上下文。 这是我的控制器

  • 您好,我已经在codova开发了一个带有ionic framework的移动应用程序。我已经构建了这个应用程序,并开始在android mobile上进行测试。注销时,单击“我已在后面添加此代码”: 但在手机测试时间,当我注销时 我的控制器代码: 我的注销代码: 我访问数据的身份是:

  • 它给出: 下面是我使用的代码: 方法verifyUserExistance是; 我就是这样处理注销的;

  • 我已经设置了一个使用OKTA作为IDP的应用程序。该应用程序基于SAML。这部分工作正常。 但我无法注销。为此,我们有1。已启用单一注销2。设置单一注销URL(我从标题Identity Provider Single Logout URL下的IDP元数据中收到此URL)3。Sp问题(我从标题Identity Provider Issuer下的IDP元数据中收到此消息)4。签名证书(这是IDP的证书

  • 根据链接中的答案,我知道如果调用SAML local logout(