2012-02-09 45 views
2

我想创建的Apache四郎一个简单的境界中授权测试:感到困惑与Apache四郎和自定义中授权的国度

 
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!

回答

3

你刚使用这个领域?您可能配置了多个领域;试试这个看什么境界,你目前有:

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

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

+0

是的,你是对的 - 实际上有两个领域:iniRealm和ldapRealm。可能错误是因为iniRealm,我纠正了这一点。但是,我想仅将ldapRealm用于身份验证(因为我不确定它返回的授权信息)并使用我自己的AuthRealm进行授权。我如何手动“禁用”ldapRealm的授权,并只允许从我的AuthRealm授权?我应该开一个新的问题吗?谢谢 ! – Serafeim 2012-02-13 06:32:14

+0

JndiLdapRealm类的文档实际上回答了我的问题:“默认情况下,由于默认的doGetAuthorizationInfo(org.apache.shiro.subject.PrincipalCollection)实现返回null,所以授权被禁用。如果您希望基于LDAP模式执行授权,您必须继承此类并覆盖该方法以反映您组织的数据模型。“ – Serafeim 2012-02-13 06:55:47

+0

很高兴看到您解决了问题! – 2012-02-13 13:37:02