Java Shiro多个主体必须是唯一的
我在web程序中使用v1.2.2进行身份验证。每个用户有两个主体,一个主值和一些其他值,因此我使用存储这两个主体 我遇到的问题是,如果这两个主体是相同的值(尽管它们在我的系统中代表了两个不同的概念),Java Shiro多个主体必须是唯一的,java,shiro,Java,Shiro,我在web程序中使用v1.2.2进行身份验证。每个用户有两个主体,一个主值和一些其他值,因此我使用存储这两个主体 我遇到的问题是,如果这两个主体是相同的值(尽管它们在我的系统中代表了两个不同的概念),SimplePrincipalCollection只存储1个值,因此对SecurityUtils.getSubject().getPrincipals()的调用只有1个值 我的领域实现如下所示: @Override protected AuthenticationInfo doGetAuthenti
SimplePrincipalCollection
只存储1个值,因此对SecurityUtils.getSubject().getPrincipals()的调用只有1个值
我的领域实现如下所示:
@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;
}
调试后,我发现这种行为是由使用存储主体的SimplePrincipalCollection
引起的
我知道我可以定义自己的自定义主体对象并使用构造函数,但是我必须更改调用SecurityUtils.getSubject().getPrincipal()
的代码
我是否使用了SimplePrincipalCollection
错误的方法?是否有一种方法可以在不定义自定义主体的情况下绕过这个独特的主体问题?您能否举例说明如何使用主体?它们是简单的字符串吗?此外,你可以从你的主题中获取主体集合,而不是获得单一主体,并使用more来获取您正在寻找的主体。只需确认:在同一领域中,您有两个具有相同价值的主体,它们在您的域中代表不同的概念?@greenSocksRockYes@BrianDemers主体都是整数。我使用的是principal集合,但是集合只给我1个值,即使我用2构造它。这就是我的问题所在。@user2718281我现在明白了。主体存储在基于集的地图中。一门学科的原则应该是独一无二的。您最好创建自己的对象来表示您的主体,支持bean(或其他对象)?它们是简单的字符串吗?此外,你可以从你的主题中获取主体集合,而不是获得单一主体,并使用more来获取您正在寻找的主体。只需确认:在同一领域中,您有两个具有相同价值的主体,它们在您的域中代表不同的概念?@greenSocksRockYes@BrianDemers主体都是整数。我使用的是principal集合,但是集合只给我1个值,即使我用2构造它。这就是我的问题所在。@user2718281我现在明白了。主体存储在基于集的地图中。一门学科的原则应该是独一无二的。您最好创建自己的对象来表示您的主体、一个bean(或其他对象)。
@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
}