如何根据 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 请求? [关闭]

使用Apache HttpClient 4.x进行异常重试

初步实现Apache功能——根据不同的网络请求路径访问不同的内容

如何使用 Apache HttpComponentst 创建和发布多部分/混合 http 请求?