自定义SAMLUserDetailsS​​ervice不填充自定义UserDetails

时间:2015-11-12 01:55:56

标签: spring-security saml-2.0 spring-saml

我有一个Spring项目,我正在将当前的身份验证转换为使用SAML2。

我认为一切正常,但是我很难获得SAML2扩展以将我的自定义UserDetails对象插入Spring Security Context身份验证对象。

我有一个自定义UserDetailsS​​ervice,定义如下:

public class SAMLAuthManager implements SAMLUserDetailsService {

    private static final Logger logger = Logger.getLogger(JDBCAuthManager.class);

    @Override
    public Object loadUserBySAML(SAMLCredential credential) throws UsernameNotFoundException {
        logger.info("Credential attributes: " + credential.getAttributes());
        for (int x = 0; x < credential.getAttributes().size(); x++) {
            Attribute attr = credential.getAttributes().get(x);
            List<XMLObject> attrValues = attr.getAttributeValues();
            StringBuilder strBuilder = new StringBuilder();
            for (int g = 0; g < attrValues.size(); g++) {
                XMLObject currObj = attrValues.get(g);
                strBuilder.append(currObj.toString()).append(",");
            }
            strBuilder.deleteCharAt(strBuilder.length() - 1);
            logger.info(attr.getFriendlyName() + ", " + strBuilder.toString());
        }
        String username = credential.getNameID().getValue();
            userWrapper.setStaff(s);
            logger.info("Returning wrapper: " + userWrapper);
            return userWrapper;
        } else {
            return null;
        }
    }

}

我还在安全上下文配置中配置了这个userDetails:

    <bean id="samlAuthenticationProvider" class="org.springframework.security.saml.SAMLAuthenticationProvider">
        <property name="userDetails" ref="samlUserDetails" />
    </bean>

但是,当我检查SecurityContextHolder,发布身份验证时,这一行:

SecurityContextHolder.getContext().getAuthentication().getCredentials();

返回org.springframework.security.saml.SAMLCredential类型的对象。

我检查了Spring是否用自定义对象(SecurityContextHolder.getContext().getAuthentication().getPrincipal())填充了Principal,但它没有填充,只是填充了用户名的String

有什么想法吗? 感谢

1 个答案:

答案 0 :(得分:5)

默认情况下,委托人必须强制为String(为了始终允许复制Principal,以前是一个不可序列化的NameID)。

可以通过将SAMLAuthenticationProvider中的false设置为SAMLUserDetailsService来更改此问题,这将使Spring SAML将Authentication提供的对象作为SAMLUserDetailsService中的主体提供对象。

调用SecurityContextHolder.getContext().getAuthentication().getDetails()的结果始终位于$keywordse下。