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

Posted

技术标签:

【中文标题】对 Apache Shiro 和自定义授权领域感到困惑【英文标题】:Getting confused with Apache Shiro and Custom Authorizing Realms 【发布时间】:2012-03-01 19:31:27 【问题描述】:

我正在尝试为 Apache Shiro 创建一个简单的授权领域以进行测试:

公共类 MyAuthRealm 扩展 AuthorizingRealm @覆盖 受保护的 AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) SimpleAuthorizationInfo sai = new SimpleAuthorizationInfo(); sai.addRole("kota"); sai.addStringPermission("koko:*:view"); 返回赛; @覆盖 protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException 返回空值;

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

现在,我正在尝试在以下代码段中对其进行测试:

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】:

你只是在使用这个领域吗?您可能配置了多个领域;试试这个看看你目前有哪些领域:

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

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

【讨论】:

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

以上是关于对 Apache Shiro 和自定义授权领域感到困惑的主要内容,如果未能解决你的问题,请参考以下文章

webapp的Apache Shiro授权和身份验证配置

Apache Shiro 使用手册Shiro 授权

自动装配在 Apache Shiro 自定义领域类中不起作用

Apache Shiro - 自定义 jdbc 领域 - 读取角色/权限

如何仅使用 Apache Shiro 进行授权?

使用 Apache Shiro 的 Restful Web 服务身份验证和授权