在實際項目上,我們針對不同的用戶(guste,user,admin,mobile user)等等,需要進入不同的頁面,比如,手機端用戶需要進入Mobile/這個路徑下的,這個時候,我們需要自定義攔截url,就比如下面的url:
電腦端用戶登錄頁面 http://localhost:8080/login
手機端用戶登錄頁面 http://localhost:8080/mobile/login
而在我們通用的配置中是這樣配置的:
<!--Shiro配置 --> <!-- Shiro 的Web過濾器 web.xml中shiro的filter對應的bean --> <bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean"> <property name="securityManager" ref="securityManager" /> <property name="loginUrl" value="/login" /> <!-- 登陸成功后要跳轉的連接 --> <!--<property name="successUrl" value="/success" />--> <!-- 沒有權限要跳轉的鏈接 --> <!--<property name="unauthorizedUrl" value="/regester" />--> <!-- 過慮器鏈定義,從上向下順序執行,一般將/**放在最下邊 --> <property name="filterChainDefinitions"> <value> <!-- 對靜態資源設置匿名訪問 --> /resources/** = anon /login = anon /** = authc </value> </property> </bean>
這樣的配置很明顯,不符合我們的要求,那么怎么辦呢?下面先看最終的配置的xml,然后一個一個解析:
<!--手機權限認證bean--> <bean id="mobileFormAuthenticationFilter" class="com.unisits.zngkpt.framework.privilegeframe.bojo.CustomAccessControlFilter"> <!-- 手機登錄的url --> <property name="mobileLoginUrl" value="/mobile/login" /> </bean> <!--Shiro配置 --> <!-- Shiro 的Web過濾器 web.xml中shiro的filter對應的bean --> <bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean"> <property name="securityManager" ref="securityManager" /> <property name="loginUrl" value="/login" /> <!-- 登陸成功后要跳轉的連接 --> <!--<property name="successUrl" value="/success" />--> <!-- 沒有權限要跳轉的鏈接 --> <!--<property name="unauthorizedUrl" value="/regester" />--> <!-- 過慮器鏈定義,從上向下順序執行,一般將/**放在最下邊 --> <property name="filterChainDefinitions"> <value> <!-- 對靜態資源設置匿名訪問 --> /resources/** = anon <!--手機登錄路徑--> /mobile/checkname = anon /mobile/login = anon /mobile/** = mobileAuthc /login = anon /** = authc </value> </property> <!-- 自定義filter配置 --> <property name="filters"> <map> <!-- 將自定義 的FormAuthenticationFilter注入shiroFilter中 --> <entry key="mobileAuthc" value-ref="mobileFormAuthenticationFilter" /> </map> </property> </bean>
這里,我們自定義了一個過濾規則:mobileAuthc,然后這個過濾規則對應一個過濾器:mobileFormAuthenticationFilter。
下面是自定義攔截器:
package com.unisits.zngkpt.framework.privilegeframe.bojo; import org.apache.shiro.subject.Subject; import org.apache.shiro.web.filter.AccessControlFilter; import org.apache.shiro.web.util.WebUtils; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; /** * @author:lyy * @Date: 2014/9/20 13:30 * @version: * @Description: 自定義url過濾器 */ public class CustomAccessControlFilter extends AccessControlFilter { private String mobileLoginUrl; public String getMobileLoginUrl() { return getLoginUrl(); } public void setMobileLoginUrl(String mobileLoginUrl) { this.mobileLoginUrl = mobileLoginUrl; } @Override protected boolean isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue) throws Exception { Subject subject = getSubject(request, response); if (!subject.isAuthenticated() && !subject.isRemembered()) { WebUtils.issueRedirect(request, response, mobileLoginUrl); return false; } return true; } @Override protected boolean onAccessDenied(ServletRequest request, ServletResponse response) throws Exception { Subject subject = getSubject(request, response); if (!subject.isAuthenticated() && !subject.isRemembered()) { return false; } return true; } }
其實,這個只是針對移動端新增了一個規則,但是普遍性還是不夠,如果多個url都用一個過濾規則呢?其實也是可以的,可以自定義一個類,這個類有一個map對的屬性,里面是規則,還有一個默認規則。然后根據url的匹配,來設定不同的規則對應不同的url
附錄:
shiro的過濾器
Filter Name |
Class |
anon |
org.apache.shiro.web.filter.authc.AnonymousFilter |
authc |
org.apache.shiro.web.filter.authc.FormAuthenticationFilter |
authcBasic |
org.apache.shiro.web.filter.authc.BasicHttpAuthenticationFilter |
logout |
org.apache.shiro.web.filter.authc.LogoutFilter |
noSessionCreation |
org.apache.shiro.web.filter.session.NoSessionCreationFilter |
perms |
org.apache.shiro.web.filter.authz.PermissionsAuthorizationFilter |
port |
org.apache.shiro.web.filter.authz.PortFilter |
rest |
org.apache.shiro.web.filter.authz.HttpMethodPermissionFilter |
roles |
org.apache.shiro.web.filter.authz.RolesAuthorizationFilter |
ssl |
org.apache.shiro.web.filter.authz.SslFilter |
user |
org.apache.shiro.web.filter.authc.UserFilter |