【问题标题】:Use Apache Shiro to restrict operation based on owner or admin role使用 Apache Shiro 根据所有者或管理员角色限制操作
【发布时间】:2014-06-16 22:24:12
【问题描述】:

我正在使用 Shiro 重构 webapp 的安全模块,但在多身份验证过滤器的逻辑操作上遇到了问题。

例如文章实体。每个人都可以发布新文章,但只有文章所有者/创建者或系统管理员角色可以修改现有文章。

为此,我创建了一个OwnerAuthzFilter(扩展org.apache.shiro.web.filter.authz.AuthorizationFilter)来检查当前用户是否是实体的创建者。

我想在shiro.ini[urls] 部分配置限制,比如

[main]
ownerOf = my.OwnerAuthzFilter
[urls]
#ownerOf checks if a user is owner of entity "article" with request parameter "id"
/article/update*=authc, ownerOf["article","id"] OR roles["admin"] 

Shiro 似乎没有提供 url 过滤器的逻辑表达式。它的Logical 仅适用于注解,并且仅适用于注解和相同类型的过滤器(如 RequiresRoles、RequiresPermissions)。

就我而言,我需要通过检查自定义OwnerAuthzFilter 和内置RolesAuthorizationFilter 的逻辑或结果来授权操作。

任何机构都有提示如何实现这一点?

【问题讨论】:

标签: java shiro


【解决方案1】:

为什么不为此编写一个特殊的过滤器呢?您可以将任何字符串放入过滤器数组中,这样您就可以编写自己的逻辑运算符。

你可以想到任何东西,例如:

/article/update*=authc, ownerOf["article","id", or(roles(admin))"] 

然后解析字符串并应用你想要的正确授权逻辑。

【讨论】:

  • 好建议。我终于将自定义过滤器实现为/article/update* = logical[ownerOf{"article,id"} || roles{admin}]。它接受()||&& 的逻辑操作数,例如logical[ownerOf{"article,id"} || (roles{admin} && perms{community:123})]
猜你喜欢
  • 2015-05-29
  • 2013-04-28
  • 2019-03-31
  • 2013-06-28
  • 2020-01-21
  • 2011-01-26
  • 2013-09-14
  • 2016-09-22
  • 2011-09-28
相关资源
最近更新 更多