Shiro多个主体必须​​是唯一的

时间:2017-02-06 04:49:06

标签: java shiro

我正在使用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;
}

因此,如果primaryPrincipalsecondaryPrincipal的值相同,则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并且有没有办法在不定义自定义主体的情况下解决这个独特的主要问题?

0 个答案:

没有答案