Spring security spring云安全:通过主体值识别http会话处理中的单个用户?用户名属性的危险设置?

Spring security spring云安全:通过主体值识别http会话处理中的单个用户?用户名属性的危险设置?,spring-security,oauth-2.0,spring-cloud-security,Spring Security,Oauth 2.0,Spring Cloud Security,我在spring云安全问题中已经问过这个问题,但可以肯定的是Github不是一个问题追踪者 在SpringCloudSecurity中,web会话/http会话处理如何区分登录用户 在spring security技术概述中,似乎使用了以下原则: 获取有关当前用户的信息 在SecurityContextHolder中,我们存储当前与应用程序交互的主体的详细信息。Spring Security使用身份验证对象来表示此信息 在我们的例子中,原样的keydape,所有用户都是通过keydape注册的,

我在spring云安全问题中已经问过这个问题,但可以肯定的是Github不是一个问题追踪者

在SpringCloudSecurity中,web会话/http会话处理如何区分登录用户

在spring security技术概述中,似乎使用了以下原则:

获取有关当前用户的信息

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

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

客户端浏览器只知道会话cookie,不知道令牌详细信息。
网关服务必须处理来自不同用户的客户端请求,并根据其会话cookie将它们传递到后端服务器,由oAuth令牌扩展
这是通过
.map(令牌->WithBeareAuth(交换,令牌))

后端将提取唯一用户ID(sub)以进行进一步处理

如果有多个用户登录,则会启动错误的思考。 但是为什么呢? 使用的网关配置
spring.security.oauth2.client.provider.keydove.user name attribute=name
在application.yaml中:

  security:
    oauth2:
      client:
        provider:
          keycloak:
            user-name-attribute: name
导致最后登录用户的
令牌
在网关中用于设置通向后端的den授权承载头

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

在第一步中,将KeyClope中的first-&Lastname更改为唯一值,从而改进了行为

根据此处显示的“主要属性”进行进一步研究后:

如果token属性为null,则默认为sub
——这很有意义

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

最后,我再也无法为并行登录用户获取错误令牌的错误

但我想了解spring security SecurityContextHolder/spring云安全在这里发生了什么

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

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.