【问题标题】:How to do role-based authorization with Apache Shiro depending on HTTP request method如何根据 HTTP 请求方法使用 Apache Shiro 进行基于角色的授权
【发布时间】: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

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

【问题讨论】:

    标签: rest basic-authentication shiro


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

      希望有帮助!

      【讨论】:

      • 嗨,斯蒂芬,非常感谢您的建议。事实上,当你写这篇文章的时候,我有同样的想法,我现在已经实现了。我认为在 StackOverflow 上发布此解决方案都很好。我会尝试看看 Shiro 项目的人是否有兴趣将我的实现作为贡献...
      猜你喜欢
      • 2016-06-06
      • 2016-07-20
      • 1970-01-01
      • 2021-05-23
      • 2015-09-30
      • 2012-05-11
      • 1970-01-01
      • 2012-08-28
      • 2022-01-01
      相关资源
      最近更新 更多