shiro 实现自己定义权限规则校验

<span style="font-family: Arial, Helvetica, sans-serif;">在系统中使用shiro进行权限管理,当用户訪问没有权限的资源时会跳转到指定的登录url。

</span>

可是假设系统中支持手机app。手机訪问时没有使用session进行登录凭证管理。而是使用token,有两种解决方法:

1:支持手机client訪问的资源在权限配置中配置成anon

2:实现自己定义认证拦截器,对用户请求资源进行认证

显然第一种方法不适用,这些资源应该仅仅能让我们自己的app进行訪问。

第二中实现方式:

 

<bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
		<property name="securityManager" ref="securityManager" />
		<!-- 登录的页面 -->
		<property name="loginUrl" value="/login/login.jsp" />
		<property name="successUrl" value="/success.jsp" />
		<property name="unauthorizedUrl" value="/error.jsp" />
		<property name="filterChainDefinitions">
			<value>
				/android.html**=anon
				/pets/android**=android
				/pets/login/**=anon
				/**=authc
			</value>
		</property>
		<property name="filters">
			<map>
				<entry key="android">
					<bean class="com.pets.shiro.filter.MobileTokenAuthentication">
					</bean>
				</entry>
				<entry key="authc">
					<bean class="com.pets.shiro.filter.LoginAuthenticationFilter">
					</bean>
					<!-- <bean class="org.apache.shiro.web.filter.authc.FormAuthenticationFilter">
					</bean> -->
				</entry>
			</map>
		</property>
	</bean>

/pets/android**=android 指定认证的拦截器,这里是自己定义的拦截器
<pre name="code" class="java">/**
 * 移动设备认证基类。提供未登录用户操作认证权限
 *
 * 2014年7月8日
 */
public abstract class AbstractMobileAuthenticationFilter extends
		AuthenticationFilter {

	public static final String TOKEN = "token";
	protected Logger log = Logger.getLogger(getClass());

	@Override
	protected boolean onAccessDenied(ServletRequest request,
			ServletResponse response) throws Exception {

		log.info("安卓用户进入校验!

" + getLoginUrl()); HttpServletRequest req = (HttpServletRequest) request; String token = req.getParameter(TOKEN); if (isAccess(token)) { return onAccessSuccess(req, (HttpServletResponse) response); } return onAccessFail(req, (HttpServletResponse) response); } /** * 推断token的合法性 * * @param token * @return */ public abstract boolean isAccess(String token); /** * 认证成功进行的操作处理 * * @param request * @param response * @return true 继续兴许处理。false 不须要兴许处理 */ public abstract boolean onAccessSuccess(HttpServletRequest request, HttpServletResponse response); /** * 认证失败时处理结果 * * @param request * @param response * @return true 继续兴许处理。false 不须要兴许处理 */ public abstract boolean onAccessFail(HttpServletRequest request, HttpServletResponse response); }


仅仅须要重写onAccessDenied方法,进行token推断!






posted @ 2017-07-26 09:27  wzzkaifa  阅读(926)  评论(0编辑  收藏  举报