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!
是的,你是对的 - 实际上有两个领域:iniRealm和ldapRealm。可能错误是因为iniRealm,我纠正了这一点。但是,我想仅将ldapRealm用于身份验证(因为我不确定它返回的授权信息)并使用我自己的AuthRealm进行授权。我如何手动“禁用”ldapRealm的授权,并只允许从我的AuthRealm授权?我应该开一个新的问题吗?谢谢 ! – Serafeim 2012-02-13 06:32:14
JndiLdapRealm类的文档实际上回答了我的问题:“默认情况下,由于默认的doGetAuthorizationInfo(org.apache.shiro.subject.PrincipalCollection)实现返回null,所以授权被禁用。如果您希望基于LDAP模式执行授权,您必须继承此类并覆盖该方法以反映您组织的数据模型。“ – Serafeim 2012-02-13 06:55:47
很高兴看到您解决了问题! – 2012-02-13 13:37:02