我有一个Spring项目,我正在将当前的身份验证转换为使用SAML2。
我认为一切正常,但是我很难获得SAML2扩展以将我的自定义UserDetails对象插入Spring Security Context身份验证对象。
我有一个自定义UserDetailsService,定义如下:
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
。
有什么想法吗? 感谢
答案 0 :(得分:5)
默认情况下,委托人必须强制为String(为了始终允许复制Principal,以前是一个不可序列化的NameID)。
可以通过将SAMLAuthenticationProvider
中的false
设置为SAMLUserDetailsService
来更改此问题,这将使Spring SAML将Authentication
提供的对象作为SAMLUserDetailsService
中的主体提供对象。
调用SecurityContextHolder.getContext().getAuthentication().getDetails()
的结果始终位于$keywordse
下。