shiro 實現自定義許可權規則校驗
阿新 • • 發佈:2019-01-09
<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判斷!