3

我正在努力弄清楚如何根据请求使用的 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

但它仍然不起作用。似乎只有最后一条规则匹配。此外,提交评论似乎也表明这仅适用于基于权限的授权。基于角色的身份验证没有等效的实现吗?

4

2 回答 2

1

我认为 HttpMethodPermissionFilter 是您需要配置的:http://shiro.apache.org/static/1.2.2/apidocs/org/apache/shiro/web/filter/authz/HttpMethodPermissionFilter.html 这应该使您能够映射Shiro 的“创建、读取、更新、删除”权限的 HTTP 方法,如该类的 javadoc 中所述。

于 2013-09-20T15:32:08.690 回答
0

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,所以我没有尝试过这种技术,可能也不会,因为我已经发明了自己的自定义过滤器。但是,这可能会提供比我所做的更清洁的解决方案。

希望有帮助!

于 2013-09-16T15:14:20.273 回答