shiro自定義攔截url


  在實際項目上,我們針對不同的用戶(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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM