Java Spring Security SAML:将saml2p:响应中的属性提取为用户属性

Java Spring Security SAML:将saml2p:响应中的属性提取为用户属性,java,spring,spring-security,Java,Spring,Spring Security,我昨天一直在深入研究spring security yaml,以便与Okta SAML合作。登录工作正常,但响应XML包含的用户属性显然无法自动提取到属性映射中。响应包含如下字段 <saml2:Attribute Name="user.lastName" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:unspecified"> <saml2:AttributeValue xmlns:xs="http://ww

我昨天一直在深入研究spring security yaml,以便与Okta SAML合作。登录工作正常,但响应XML包含的用户属性显然无法自动提取到属性映射中。响应包含如下字段

<saml2:Attribute Name="user.lastName" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:unspecified">
  <saml2:AttributeValue xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="xs:string">
    Surname
  </saml2:AttributeValue>
</saml2:Attribute>
一旦身份验证成功,我想把它们放在身份验证信息中。通过github/oauth登录时,
OAuth2AuthenticatedPrincipal
类具有属性映射,但是
Saml2AuthenticatedPrincipal
仅具有名称

解决这个问题的正确方法是什么

现在我正在考虑一个自定义的
AuthenticationSuccessHandler
,它通过第二次解析提供的XML响应(通过
.getDetails()
)来填充一个自定义的
Saml2AuthenticatedPrincipalWithAttributes
类,该类包含所有属性(或将它们放入会话)

我有一种预感,这可能不是春天做事的方式,我希望得到第二种意见。当你在谷歌上搜索时,你主要会发现SpringSecuritySAML的例子,在它被合并到SpringSecurity之前,它处理的事情似乎有点不同,因为上面提到的类已经不存在了


谢谢你帮助大家

在下一版本的Spring Security(5.4.0)中,您应该能够执行以下操作:


现在,我不知道还有比你更好的解决方法。

有同样的问题。。。这家伙决定手动解析响应,有趣的是,OpenSamlAuthenticationProvider就是这样解析和验证响应的,然后丢弃断言的。请分享您选择的方法,因为我在我的帖子中提到的
UserDetailsService
只在较旧的版本中可用。这还可以手动解析响应并丰富属性映射。然后我将设置一个新的
SecurityContext
,其中包含带有属性map.ok的
Principal
。顺便说一句,我指的是提到的问题中的更新,他也决定自己解析响应。我打开了一个GitHub问题,要求增强/澄清
@GetMapping("/")
public String index(Model model,
    @AuthenticationPrincipal Saml2AuthenticatedPrincipal principal) {
    String emailAddress = principal.getFirstAttribute("emailAddress");
    model.addAttribute("emailAddress", emailAddress);
    model.addAttribute("userAttributes", principal.getAttributes());
    return "index";
}