我正在用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))"]
然后解析字符串并应用所需的正确授权逻辑。