1. 程式人生 > >shiro 實現自定義許可權規則校驗

shiro 實現自定義許可權規則校驗

<span style="font-family: Arial, Helvetica, sans-serif;">在系統中使用shiro進行許可權管理,當用戶訪問沒有許可權的資源時會跳轉到指定的登入url。</span>

但是如果系統中支援手機app,手機訪問時沒有使用session進行登入憑證管理,而是使用token,有兩種解決方法:

1:支援手機客戶端訪問的資源在許可權配置中配置成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判斷!