如何根据 HTTP 请求方法使用 Apache Shiro 进行基于角色的授权
Posted
技术标签:
【中文标题】如何根据 HTTP 请求方法使用 Apache Shiro 进行基于角色的授权【英文标题】:How to do role-based authorization with Apache Shiro depending on HTTP request method 【发布时间】:2013-09-20 09:43:45 【问题描述】:我正在努力弄清楚如何根据请求使用的 HTTP 方法进行基于角色的授权。我使用 HTTP 基本身份验证,根据用户角色和使用的 HTTP 方法,请求应该成功还是失败。
例子:
应始终允许对http://localhost/rest/
的 GET 请求,即使是未经身份验证的用户(匿名访问)
只有在用户经过身份验证时才允许向http://localhost/rest/
(相同的资源!)发出 PUT 请求
只有当用户经过身份验证并且具有管理员角色时,才应允许对http://localhost/rest/
(相同资源!)的DELETE请求
我当前(无效)配置shiro.ini
的尝试如下所示:
/rest = authcBasic[PUT], roles[SERVICE_PROVIDER]
/rest = authcBasic[POST], roles[EXPERIMENTER]
/rest = authcBasic[DELETE], roles[ADMINISTRATOR]
/rest = authcBasic
更新
我刚刚找到 https://issues.apache.org/jira/browse/SHIRO-107 并将我的 shiro.ini 更新为
/rest/**:put = authcBasic, roles[SERVICE_PROVIDER]
/rest/**:post = authcBasic, roles[EXPERIMENTER]
/rest/**:delete = authcBasic, roles[ADMINISTRATOR]
/rest/** = authcBasic
但它仍然不起作用。似乎只有最后一条规则匹配。此外,提交评论似乎也表明这仅适用于基于权限的授权。基于角色的身份验证没有等效的实现吗?
【问题讨论】:
【参考方案1】:我认为 HttpMethodPermissionFilter 是您需要配置的:http://shiro.apache.org/static/1.2.2/apidocs/org/apache/shiro/web/filter/authz/HttpMethodPermissionFilter.html 这应该使您能够将 HTTP 方法映射到 Shiro 的“创建、读取、更新、删除”权限,如该类的 javadoc 中所述。
【讨论】:
【参考方案2】:Shiro 和我的 REST 应用程序也有类似的情况。虽然可能有更好的方法(我没有看到 SHIRO-107),但我的解决方案是创建一个扩展 Authc 过滤器的自定义过滤器(org.apache.shiro.web.filter.authc.FormAuthenticationFilter)。你可以做一些类似的扩展 authcBasic 过滤器或 Roles 过滤器(虽然我认为 authcBasic 会更好,因为它可能更复杂)。
您要覆盖的方法是“protected boolean isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue)”。您的论点(例如“ADMINISTRATOR”)将以 String[] 形式出现在 mappedValue 中,其中论点用逗号分隔。
由于我需要方法和角色的可能性,我最终让我的争论看起来像“-”。例如:
/rest/** = customFilter[DELETE-ADMINISTRATOR]
这让我可以通过执行以下操作将执行删除所需的角色从 POST 所需的角色中分离出来:
/rest/** = customFilter[DELETE-ADMINISTRATOR,POST-EXPERIMENTER]
我认为,如果您使用它,您将能够获得所需的功能。
顺便说一句,我没有见过 SHIRO-107,所以我没有尝试过这种技术,可能也不会,因为我已经发明了自己的自定义过滤器。但是,这可能会提供比我所做的更清洁的解决方案。
希望有帮助!
【讨论】:
嗨,斯蒂芬,非常感谢您的建议。事实上,当你写这篇文章的时候,我有同样的想法,我现在已经实现了。我认为在 *** 上发布此解决方案都很好。我会尝试看看 Shiro 项目的人是否有兴趣将我的实现作为贡献...以上是关于如何根据 HTTP 请求方法使用 Apache Shiro 进行基于角色的授权的主要内容,如果未能解决你的问题,请参考以下文章
Apache HTTP 客户端,POST 请求。如何正确设置请求参数?
当 HTTP 方法是 Apache .htaccess 上的 OPTIONS 时,如何避免请求基本身份验证?
如何配置 Apache 让 PHP 处理 OPTIONS HTTP 请求? [关闭]