0

我已经在 spring-cloud-security issue #175中问过这个问题,但可以肯定的是 Github 不是问题跟踪器。;-)

spring-cloud-security 中的 web session / http session 处理如何区分已登录的用户?

在 spring-security 技术概述6.2.1 SecurityContextHolder、SecurityContext 和 Authentication Objects中似乎使用了主体:

获取当前用户信息

在 SecurityContextHolder 中,我们存储了当前与应用程序交互的主体的详细信息。Spring Security 使用 Authentication 对象来表示此信息。

在我们的例子中,AS 是 Keycloak,所有用户都是通过 Keycloak 注册的,只有电子邮件地址。但是注册页面被用作 First- & Lastname = "noname" 的隐藏表单数据。

客户端浏览器只知道会话 cookie,不知道令牌详细信息。
网关服务必须处理来自不同用户的客户端请求,并根据其会话 cookie 将它们传递给后端服务器,由 oAuth 令牌扩展
这是通过.map(token -> withBearerAuth(exchange, token))
后端将提取唯一的 userId (sub) 以进行进一步处理.

如果有多个用户登录,就会产生不好的想法。但是为什么呢?application.yaml 中使用的网关配置 spring.security.oauth2.client.provider.keycloak.user-name-attribute=name

  security:
    oauth2:
      client:
        provider:
          keycloak:
            user-name-attribute: name

导致在token网关中使用最后登录用户的身份向后端设置 den Authorization Bearer Header。

最后,后端中的所有操作都是在最后一个登录用户的上下文中完成的。这不仅仅是一个很好的安全“问题”。

在将 Keycloak 中的 First- 和 Lastname 更改为唯一值的第一步中,它改进了行为。

经过一些基于此处显示的“主要属性”的更多研究:https ://www.keycloak.org/docs/latest/securing_apps/#_java_adapter_config

principal-attribute
OpenID Connect ID Token attribute to populate the UserPrincipal name with. If token attribute is null, defaults to sub. Possible values are:
         sub, preferred_username, email, name, nickname, given_name, family_name.

If token attribute is null, defaults to sub- 那讲得通!

将 user-name-attribute 更改为 sub spring.security.oauth2.client.provider.keycloak.user-name-attribute=sub 将 userId 作为主体名称返回:[49a79b38-2549-4e9a-ab59-c831beea22b1]

最后,我不再能够为并行登录的用户收到错误令牌的错误。

但我想了解 spring-security SecurityContextHolder / spring-cloud-security 这里发生了什么。

校长有几个条目。有些可能是相同的(名称),有些是唯一的(子)。并且正确的 http 会话处理似乎基于使用的用户名属性值?

4

0 回答 0