前提
现在做一个前后端分离的应用,后台用shiro做权限控制,用jwt
代替session的无状态web应用,自定义了一个shiro filter.url用restful
风格.所有的接口url都以/api
开头,我想让所有这种/api
开头的url,如果需要认证就走我自定义的filter.
问题
现在我有四个rul:
-
/api/user/1
--GET -
/api/user
--POST -
/api/user
--PATCH -
/api/user
--PUT
我现在仅仅想对POST
方法做权限控制,让他走我自定义的那个filter,shiro不知道如何控制.
我的自定义filter在shiro.xml中的配置如下:
<bean id="JWTFilter" class="com.test.web.shiro.stateless.JWTStatelessFilter"/>
<!-- Shiro的Web过滤器 -->
<bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
<property name="securityManager" ref="securityManager"/>
<property name="filters">
<util:map>
<entry key="jwt" value-ref="JWTFilter"/>
</util:map>
</property>
<property name="filterChainDefinitions">
<value>
/api/**=jwt
/**=anon
</value>
</property>
</bean>
我刚开始想过不配置/api/**=jwt
,然后在方法上加@RequiresAuthentication
注解,但是这样子,那个方法不走我的JWTFilter
,如何让这个需要认证的url走我的自定义filter,该如何配置,求解.谢谢.
按照tomsun28/bootshiro这里的提示,阅读了他的文章:基于shiro的改造集成真正支持restful请求
PathMatchingFilterChainResolver
的getChain
方法:ShiroFilterFactoryBean
的createInstance
方法:然后更改shiro配置文件使用自定义的
RestShiroFilterFactoryBean
:在这里由于我是写在配置文件中的,所以
==
的格式不行,换成了--
的格式.测试了两个方法,/api/user/test
分别有get
和post
请求,然后post添加不用认证,如上xml配置文件所示,测试通过,暂时只用到认证,以上可以解决认证的问题.看基于shiro的改造集成真正支持restful请求还重写了
RestPathMatchingFilter
的pathsMatch
方法,在他的文章中这个类主要是给BJwtFilter
继承做授权使用,我现在暂时只用到认证,所以还没有深入了解.以上已经能够解决同一个url不同的httpMethod请求时的授权问题,如有什么问题,还请大家指出.