我正在使用shiro v1.2.2在网络程序中进行身份验证。我为每个用户设置了2个主体,一个主值和一些其他值,因此我使用SimplePrincipalCollection
来存储这两个主体。
我遇到的问题是,如果2个主体是相同的值(虽然它们代表我系统中的2个不同的概念),SimplePrincipalCollection
只存储1个值,因此只调用SecurityUtils.getSubject().getPrincipals()
有1个值。
我的领域doGetAuthenticationInfo
实现看起来像这样:
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authcToken) throws AuthenticationException {
...
List<Integer> principalList = new ArrayList<>();
principalList.add(primaryPrincipal); // This is the primary principal so should be first in the list
principalList.add(secondaryPrincipal);
PrincipalCollection principals = new SimplePrincipalCollection(principalList, getName());
AuthenticationInfo authInfo = new SimpleAuthenticationInfo(principals, credentials);
return authInfo;
}
因此,如果primaryPrincipal
和secondaryPrincipal
的值相同,则SimplePrincipalCollection
仅存储1个值。我通过一个简单的测试验证了这一点:
@Test
public void testMultiplePrincipal() {
final String realmName = "TestRealm";
List<Integer> principalList = new ArrayList<>();
principalList.add(1);
principalList.add(2);
PrincipalCollection principals = new SimplePrincipalCollection(principalList, realmName);
assertThat((List<?>) principals.asList(), hasSize(2)); // This passes
principalList = new ArrayList<>();
principalList.add(1);
principalList.add(1);
principals = new SimplePrincipalCollection(principalList, realmName);
assertThat((List<?>) principals.asList(), hasSize(2)); // This fails because size = 1
}
调试后,我发现此行为是由SimplePrincipalCollection
使用LinkedHashSet
来存储主体造成的。
我知道我可以定义自己的自定义主体对象并使用构造函数SimpleAuthenticationInfo(Object principal, Object credentials, String realmName)
但是我必须更改调用SecurityUtils.getSubject().getPrincipal()
的代码。
我是否以错误的方式使用SimplePrincipalCollection
并且有没有办法在不定义自定义主体的情况下解决这个独特的主要问题?