如何根据HTTP请求方法使用Apache Shiro进行基于角色的授权

时间:2013-09-16 09:31:43

标签: rest basic-authentication shiro

我正在努力弄清楚如何根据请求使用的HTTP方法执行基于角色的授权。我使用HTTP基本身份验证,并且根据用户角色和使用的HTTP方法,请求应该成功或失败。

示例:

  • 应始终允许向http://localhost/rest/发送GET请求,即使是未经身份验证的用户(匿名访问)
  • 只有在经过身份验证
  • 的情况下,才允许向http://localhost/rest/(同一资源!)发送PUT请求
  • 只有当用户经过身份验证并且具有“管理员”
  • 的角色时,才允许向http://localhost/rest/(同一资源!)发出删除请求

我当前(非工作)配置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

但它仍然无效。似乎只有最后一条规则匹配。此外,提交注释似乎也表明这仅适用于基于权限的授权。是否没有基于角色的authz的等效实现?

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

我和Shiro以及我的REST应用程序有类似的情况。虽然可能有更好的方法(我没见过SHIRO-107),但我的解决方案是创建一个扩展Authc过滤器的自定义过滤器(org.apache.shiro.web.filter.authc.FormAuthenticationFilter)。您可以执行类似的扩展authcBasic过滤器或角色过滤器(尽管我认为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,所以我没有尝试过那种技术,可能不会因为我已经发明了自己的自定义滤镜。然而,这可能提供比我所做的更清晰的解决方案。

希望有所帮助!