与Apache Shiro和自定义授权领域混淆

时间:2012-02-09 10:18:59

标签: java security shiro

我正在尝试为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;
    }
}

正如您所看到的,它并不关心用户是谁 - 它只返回一个角色和一个特定的权限。

现在,我试图在下面的snipptet中测试它:

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打印???)!!

有人可以向我解释我做错了什么吗?

TIA!

1 个答案:

答案 0 :(得分:4)

你刚刚使用这个领域吗?您可能配置了多个领域;试试看你目前拥有的领域:

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

您的安全经理可能会询问多个领域的授权信息;这可能是造成这个问题的原因。