对于Apache Shiro和自定义授权领域感到困惑

4
我正在尝试为Apache Shiro创建一个简单的授权领域进行测试:
public class MyAuthRealm extends AuthorizingRealm {
    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
        SimpleAuthorizationInfo sai = new SimpleAuthorizationInfo();
        sai.addRole("kota");
        sai.addStringPermission("koko:*:view");
        return sai;
    }
@Override protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException { return null; } }
如您所见,它不关心用户是谁——它只返回一个角色和一个特定的权限。
现在,我正在尝试在以下片段中进行测试:
if(SecurityUtils.getSubject().hasRole("kota")) {
    out.write("kota ");
}
if(SecurityUtils.getSubject().hasRole("kota2")) {
    out.write("kota2 ");
}  
if(SecurityUtils.getSubject().isPermitted("koko:toto:view")) {
    out.write("koko ");
}
if(SecurityUtils.getSubject().isPermitted("koko2:toto:view")) {
    out.write("koko2 ");
} 
然后我收到以下输出
kota koko koko2 
看来角色已经正确配置(因为用户只有角色kota),但权限不正确(为什么会打印koko2?)!!!
可以有人向我解释一下我做错了什么吗?
感谢!
1个回答

5

您只是在使用这个领域吗?您可能配置了多个领域;尝试以下操作以查看当前拥有的领域:

for (Realm realm : ((RealmSecurityManager) SecurityUtils.getSecurityManager()).getRealms())
    System.out.println(realm.getName());

您的安全管理器可能会向多个领域请求授权信息;这可能是问题的原因。


是的,你说得对 - 实际上还有两个其他的领域:iniRealm和ldapRealm。可能错误是由于iniRealm,我已经纠正了。然而,我想仅使用ldapRealm进行身份验证(因为我不确定它返回的授权信息),并使用自己的AuthRealm进行授权。我如何手动“禁用”ldapRealm的授权,并仅允许从我的AuthRealm进行授权?我应该开一个新问题吗?谢谢! - Serafeim
类JndiLdapRealm的文档实际上回答了我的问题:“默认情况下,由于默认的doGetAuthorizationInfo(org.apache.shiro.subject.PrincipalCollection)实现返回null,授权实际上被禁用。如果您希望基于LDAP模式执行授权,则必须子类化此方法并覆盖该方法以反映您组织的数据模型。” - Serafeim

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接