我正在努力弄清楚如何根据请求使用的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的等效实现?
答案 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,所以我没有尝试过那种技术,可能不会因为我已经发明了自己的自定义滤镜。然而,这可能提供比我所做的更清晰的解决方案。希望有所帮助!