Spring绕过shiro权限校验,对外提供HTTP接口
在一些边缘分享系统或分析系统或计算系统中,涉及到一些需要需要放权的接口,也就是可以在不鉴权的情况下访问。这种情况在Spring中如何实现呢?
Spring绕过shiro权限校验,对外提供HTTP接口
问题:管控台用到了shiro的权限校验,但是需要通过这个web服务提供对外的HTTP接口,这个时候需要绕过shiro的权限校验,直接访问接口,怎么办?
配置filter
第一步:在ApplicationContext-shiro.xml中配置filterChainDefinitions,在其中添加你需要过滤的路径。
如下代码:(注意,不要添加到最后一行/**之后,因为这个表示所有的,authc表示需要经过权限校验,anon表示匿名的,即不用校验权限)
<!-- Shiro Filter -->
<bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
<property name="securityManager" ref="securityManager" />
<property name="loginUrl" value="/" />
<property name="successUrl" value="/main/index" />
<property name="unauthorizedUrl" value="/login_toLogin" />
<property name="filterChainDefinitions">
<value>
/static/login/** = anon
/plugins/keypad/** = anon
/static/js/myjs/** = authc
/static/js/** = anon
/uploadFiles/uploadImgs/** = anon
/code.do = anon
/login_login = anon
/monitor/deviceinfo = anon
/app_deviceinfo/isActive = anon
/lot_omger/omger = anon
/app**/** = anon
/weixin/** = anon
/api_lotdevicemonitorinfo/** = anon
/versionAudit/getVersionState = anon
/** = authc
</value>
</property>
</bean>
访问拦截配置放行
第二步:在ApplicationContext-mvc.xml的LoginHandlerInterceptor类调用的Const.NO_INTERCEPTOR_PATH中,添加其过滤的常量:
ApplicationContext-mvc.xml:
<!-- 访问拦截 -->
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**/**"/>
<bean class="com.hct.lot.interceptor.LoginHandlerInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>
LoginHandlerInterceptor:
if(path.matches(Const.NO_INTERCEPTOR_PATH)){
return true;//表示不拦截
}else{
//拦截的处理
}
Const.NO_INTERCEPTOR_PATH:
static final String NO_INTERCEPTOR_PATH = ".*/((login)|(logout)|(code)|(app)|(weixin)|(static)|(main)|(websocket)|(deviceinfo)|(omger)|(getVersionState)|(isActive)).*"; //不对匹配该值的访问路径拦截(正则)
小结
搞定关键步骤,就可以轻松的实现放行了。
不过在确定接口是否需要放行,一定要业务上的严格把关,以及对接口进行幂等、压测,避免造成服务压力。