shiro系列7:攔截器


一、簡介:

在shiro中配置攔截器可以攔截客戶端發送來的請求,並可以控制是對該請求進行認證還是放行。

 

 

二、shiro攔截器的特點

簡寫(加粗為常用) 名稱 優先級(1為最高) 說明 對應Java類
anon 匿名攔截器 1 不需要登錄就能訪問,一般用於靜態資源,或者移動端接口 org.apache.shiro.web.filter.authc.AnonymousFilter
authc 登錄攔截器 2 需要登錄認證才能訪問的資源 org.apache.shiro.web.filter.authc.FormAuthenticationFilter
authcBasic Http攔截器 3 Http身份驗證攔截器,非常用類型,不太了解 org.apache.shiro.web.filter.authc.BasicHttpAuthenticationFilter
logout 登出攔截器 4 用戶登出攔截器,主要屬性:redirectURL退出登錄后重定向的地址 org.apache.shiro.web.filter.authc.LogoutFilter
noSessionCreation 不創建會話攔截器 5 調用 subject.getSession(false) 不會有什么問題,但是如果 subject.getSession(true) 將拋出 DisabledSessionException 異常 org.apache.shiro.web.filter.authc.NoSessionCreationFilter
prems 權限攔截器 6 驗證用戶是否擁有資源權限 org.apache.shiro.web.filter.authc.PermissionsAuthorizationFilter
port 端口攔截器 7 其主要屬性: port(80) 如果用戶訪問該頁面是非 80,將自動將請求端口改為 80 並重定向到該 80 端口 org.apache.shiro.web.filter.authc.PortFilter
rest rest風格攔截器 8 rest 風格攔截器,自動根據請求方法構建權限字符串構建權限字符串;非常用類型攔截器 org.apache.shiro.web.filter.authc.HttpMethodPermissionFilter
roles 角色攔截器 9 驗證用戶是否擁有資源角色 org.apache.shiro.web.filter.authc.RolesAuthorizationFilter
ssl SSL攔截器 10 只有請求協議是https才能通過,否則你會自動跳轉到https端口(443) org.apache.shiro.web.filter.authc.SslFilter
user 用戶攔截器 11 用戶攔截器,用戶已經身份驗證 / 記住我登錄的都可; org.apache.shiro.web.filter.authc.UserFilter

 

 

三、使用:

1、自定義攔截器

public class CustomAccessControlerFilter extends AccessControlFilter {
    @Override
    protected boolean isAccessAllowed(ServletRequest servletRequest, ServletResponse servletResponse, Object o) throws Exception {
        return false;
    }

    // 對需要被shiro攔截的請求進行攔截
    @Override
    protected boolean onAccessDenied(ServletRequest servletRequest, ServletResponse servletResponse) throws Exception {
        /* 里面可以寫一些校驗token的邏輯,返回true表示認證通過,返回false表示認證失敗*/
       
        return true;
    }
}

 

2、將自定義攔截器設置到shiro中

  /**
     * shiro過濾器,配置攔截哪些請求
     */
    @Bean
    public ShiroFilterFactoryBean shiroFilterFactoryBean(SecurityManager securityManager){
        ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
        shiroFilterFactoryBean.setSecurityManager(securityManager);
        LinkedHashMap<String, Filter> filtersMap = new LinkedHashMap<>();
        //用來校驗token
        filtersMap.put("token", new CustomAccessControlerFilter());
        shiroFilterFactoryBean.setFilters(filtersMap);
        Map<String, String> filterChainDefinitionMap = new LinkedHashMap<>();
        // 配置不會被攔截的鏈接 順序判斷
        filterChainDefinitionMap.put("/api/user/login", "anon");
        filterChainDefinitionMap.put("/upload/image/**","anon");
        filterChainDefinitionMap.put("/index/**","anon");
        filterChainDefinitionMap.put("/login","anon");
        filterChainDefinitionMap.put("/register","anon");
        filterChainDefinitionMap.put("/images/**", "anon");
        filterChainDefinitionMap.put("/js/**", "anon");
        filterChainDefinitionMap.put("/layui/**", "anon");
        filterChainDefinitionMap.put("/css/**", "anon");
        filterChainDefinitionMap.put("/treetable-lay/**", "anon");
        filterChainDefinitionMap.put("/api/user/token", "anon");
        //放開swagger-ui地址
        filterChainDefinitionMap.put("/swagger/**", "anon");
        filterChainDefinitionMap.put("/v2/api-docs", "anon");
        filterChainDefinitionMap.put("/swagger-ui.html", "anon");
        filterChainDefinitionMap.put("/swagger-resources/**", "anon");
        filterChainDefinitionMap.put("/webjars/**", "anon");
        filterChainDefinitionMap.put("/druid/**", "anon");
        filterChainDefinitionMap.put("/favicon.ico", "anon");
        filterChainDefinitionMap.put("/captcha.jpg", "anon");
        filterChainDefinitionMap.put("/","anon");
        filterChainDefinitionMap.put("/csrf","anon");
        filterChainDefinitionMap.put("/**","token,authc");
        shiroFilterFactoryBean.setLoginUrl("/api/user/login");
shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap);
        return shiroFilterFactoryBean;
    }

 


免責聲明!

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



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