在多个服务上处理Spring Security Oauth2 [已关闭]

lrl1mhuk  于 12个月前  发布在  Spring
关注(0)|答案(1)|浏览(198)

已关闭。此问题为opinion-based。目前不接受回答。
**要改进此问题吗?**更新此问题,以便editing this post可以使用事实和引文来回答。

上个月关门了。
Improve this question
我有一个使用oauth2沿着keycloak的认证服务。然后我有两个不同的服务,都需要知道哪个用户正在访问它们(直接)。现在我有这些选项:

  1. Auth service默认设置了一个jsession cookie。所以它是有状态的。我还没有找到一种方法来使它完全无状态,因为它需要保存oauth2中的代码。我将从中提取jwt token并将其设置为另一个cookie。然后我将其他2个服务设置为无状态并使用Bearer token调用它们。这很有效。我发现这更慢,在每次调用时,我的服务将使用keycloak验证令牌。我也无法使用Bearer令牌调用auth服务,因为它期望基于cookie的会话。
    1.我通过Redis为我需要的每一个服务共享我的会话。这样我就可以访问我所有的服务(在同一个域上)而不需要设置我的头。我也可以使用从客户端发送的相同cookie对其他服务进行内部调用。我发现它要快得多。但是我不知道可能导致的后果。
    1.使其他服务无状态,不使用安全性,通过网关路由我所有的请求,网关将转换我的会话cookie到jwt内部,服务将简单地解码jwt的,因为他们总是签署了keycloak已经因为它通过网关路由。
    我想知道什么是你们的常见情况?分享会议是一种常见的做法吗?什么情况更可取?
bwntbbo3

bwntbbo31#

选项3几乎是我的方法:您应该将资源访问控制保存在负责保存它的资源服务器上。此资源服务器了解资源的内部和业务规则。此外,在资源服务器上测试访问控制规则也非常容易。
正如您在编辑中所指出的,如果访问令牌是JWT,则资源服务器不需要为每个请求往返授权服务器。从资源服务器到授权服务器的请求仅需要获取令牌的公共签名密钥(在启动时和每次轮换时)。然后,资源服务器使用此密钥在本地验证令牌。
OAuth2工作原理如下:

  • OAuth2授权服务器拥有状态(用户身份验证状态)
  • OAuth2客户端具有状态(存储令牌)
  • OAuth2资源服务器可以(应该?)是无状态(随每个请求接收令牌)

授权服务器和客户端上的会话是不同的,授权服务器不应与其他参与者共享其会话(但可以使用spring-session在客户端之间共享会话)。
最新的建议是仅使用“私有”OAuth2客户端,这意味着客户端运行在您信任的服务器上(不,OAuth2客户端不应该是单页或移动的应用程序)。
对于单页面(Angular、React、Vue...)和移动的应用程序,Spring Security团队鼓励使用BFF模式。
如果使用的是服务器端渲染引擎(Thymeleaf,JSF,...),则MVC应用程序可以配置为机密客户端并直接发送请求(使用访问令牌授权)到资源服务器。我编写了another tutorial for that。在本教程中,资源服务器和客户机合并在一个应用程序中,但是由于安全要求非常不同,每个Bean都有其自己的SecurityFilterChain Bean,

相关问题