使用Apache Shiro根据所有者或管理员角色限制操作



我正在用Shiro重构一个Web应用程序的安全模块,在多身份验证过滤器上的逻辑操作出现问题。

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

为了实现这一点,我创建了一个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的逻辑OR结果来授权操作。

有人暗示如何实现这一点吗?

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

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

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

然后解析字符串并应用所需的正确授权逻辑。