长话短说,您必须构建一种机制,以便在注销时手工删除令牌
或使其无效。
你应该问自己的问题是
验证
工作流以添加更多自定义检查
或验证签名有效性
、过期时间
和其他一些默认检查
之前,您可以运行自己的自定义检查
,如果自定义检查
通过,则继续执行,否则不能通过!
那么,除了
黑名单
之外,您还可以执行以下操作
只需将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-memory
store或database
表以查看是否存在记录。对于in-memory
store,简单的existing
检查就足够了。对于数据库表
,您需要执行更多的检查(例如exist和not experial,等等),如果检查通过了let the请求,否则,您将不能通过!
当出现
注销请求
时,如果是内存中
存储区,只需删除键
并继续(如果找到),如果是数据库
,则可以删除JWT
记录,该记录将级联到新表。
嗯,你能做到的
- 首先使用自定义顶级筛选器或
- 您可以展开
verify
endpoint工作流来执行这些额外的检查
我所使用的项目不要求令牌在
logout
时无效,因此我不必跨过这座桥梁。我必须展开verify
endpoint,以确保如果所有的自定义检查
都通过了,则令牌是有效的。
除了你指出的教程。还有其他一些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(