1. 程式人生 > >Springboot 整合Shiro自定義Filter

Springboot 整合Shiro自定義Filter

網上自定義Filter的實現很多,這裡我提供一種Springboot在程式碼中的實現。

Shiro提供的Filter我這裡不一一介紹了,一般基於web會話的都是使用authc(這是FormAuthenticationFilter)。根據我無狀態的登陸需求,選擇了AccessControlFilter,網上也有說這個是最被廣泛使用的,具體還是看自己需求吧。

Filter程式碼:

/**
 * @author Created by pangkunkun on 2017/11/18.
 */
public class MyAccessControlFilter extends AccessControlFilter
{
private static final Logger log= LoggerFactory.getLogger(MyAccessControlFilter.class); /** * * 表示是否允許訪問;mappedValue就是[urls]配置中攔截器引數部分,如果允許訪問返回true,否則false; * (感覺這裡應該是對白名單(不需要登入的介面)放行的) * 如果isAccessAllowed返回true則onAccessDenied方法不會繼續執行 * 這裡可以用來判斷一些不被通過的連結(個人備註) * * 表示是否允許訪問 ,如果允許訪問返回true,否則false; * @param
servletRequest * @param servletResponse * @param object 表示寫在攔截器中括號裡面的字串 mappedValue 就是 [urls] 配置中攔截器引數部分 * @return * @throws Exception * */
@Override public boolean isAccessAllowed(ServletRequest servletRequest, ServletResponse servletResponse, Object object) throws Exception{ // Subject subject = getSubject(servletRequest,servletResponse);
// String url = getPathWithinApplication(servletRequest); // log.info("當前使用者正在訪問的 url => " + url); // log.info("subject.isPermitted(url);"+subject.isPermitted(url)); return false; } /** * 表示當訪問拒絕時是否已經處理了;如果返回true表示需要繼續處理;如果返回false表示該攔截器例項已經處理了,將直接返回即可。 * onAccessDenied是否執行取決於isAccessAllowed的值,如果返回true則onAccessDenied不會執行;如果返回false,執行onAccessDenied * 如果onAccessDenied也返回false,則直接返回,不會進入請求的方法(只有isAccessAllowed和onAccessDenied的情況下) * */ @Override public boolean onAccessDenied(ServletRequest request, ServletResponse response) throws Exception{ System.out.println("onAccessDenied"); String username=request.getParameter(Constant.CRS_KEY); String signature=request.getParameter(Constant.SIGNATURE); String type=request.getParameter("type"); //TODO 通過其它引數驗證signature的正確性 String digestValue=MD5Utils.MD5SendParame(signature); MyUsernamePasswordToken token=new MyUsernamePasswordToken(username,type, digestValue); Subject subject= SecurityUtils.getSubject(); try { subject.login(token); }catch (Exception e){ log.info("登陸失敗"); log.info(e.getMessage()); onLoginFail(response); return false; } log.info("登陸成功"); return true; }

繼承這個filter 要實現兩個方法,每個方法我都有給出解釋。

isAccessAllowed這裡,根據從網上找的實現,我感覺這個是類似白名單被放行的。如果有些特殊的url不需要登入,可以直接在這裡通過,或者做其它的判斷。當然,這裡也可以砸Shiro配置中直接把相應的方法對應的filter欄設定成none,同樣不會經過這裡。

onAccessDenied是我主要邏輯功能處理的模組。在這裡主要是UsernamePasswordToken這塊,生成token物件後使用subject進行登入,以便後邊方法中許可權/角色的驗證。

將自定義filter整合進shiro配置:

@Bean
    public ShiroFilterFactoryBean shirFilter(SecurityManager securityManager){
        log.info("ShiroConfiguration.shirFilter()");
        ShiroFilterFactoryBean shiroFilterFactoryBean  = new ShiroFilterFactoryBean();

        // 必須設定 SecurityManager
        shiroFilterFactoryBean.setSecurityManager(securityManager);
        //自定義攔截器
        Map<String, Filter> filtersMap = new LinkedHashMap<String, Filter>();
        filtersMap.put("myAccessControlFilter", new MyAccessControlFilter());
        shiroFilterFactoryBean.setFilters(filtersMap);

        //攔截器.
        Map<String,String> filterChainDefinitionMap = new LinkedHashMap<String,String>();

        filterChainDefinitionMap.put("/createPermission", "anon");
        filterChainDefinitionMap.put("/**", "myAccessControlFilter");


        shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap);
        return shiroFilterFactoryBean;
    }
        //自定義攔截器
        Map<String, Filter> filtersMap = new LinkedHashMap<String, Filter>();
        filtersMap.put("myAccessControlFilter", new MyAccessControlFilter());
        shiroFilterFactoryBean.setFilters(filtersMap);

這塊程式碼是將自定義的攔截器設定進shiro的filterchain中。

filterChainDefinitionMap.put("/**", "myAccessControlFilter");

這裡是設定使用自定義攔截器的url。我這裡設定的是,如果沒有其他攔截器定義的,都有走這個自定義的攔截器。

相關推薦

Springboot 整合Shiro定義Filter

網上自定義Filter的實現很多,這裡我提供一種Springboot在程式碼中的實現。 Shiro提供的Filter我這裡不一一介紹了,一般基於web會話的都是使用authc(這是FormAuthenticationFilter)。根據我無狀態的登陸需求,選擇

SpringBoot整合Shiro定義Redis存儲

min locked 訪問控制 ride ora efault protect contex lan Shiro   Shiro 主要分為 安全認證 和 接口授權 兩個部分,其中的核心組件為 Subject、 SecurityManager、 Realms,公共部分 Sh

SpringBoot整合thymeleaf(定義)模板中文亂碼的解決辦法

樓主今天在學習SpringBoot整合thymelaf的時候報了中文亂碼的錯誤,經過網上的搜尋,現在得到解決的辦法,分享給大家: package com.imooc.config; import org.springframework.beans.BeansExcepti

SpringBoot整合Mybatis定義攔截器,實現拼接sql和修改

一、應用場景 1.分頁,如com.github.pagehelper的分頁外掛實現; 2.攔截sql做日誌監控; 3.統一對某些sql進行統一條件拼接,類似於分頁。 二、MyBatis的攔截器簡介 然後我們要知道攔截器攔截什麼樣的物件,攔截物件的什麼行為,什麼時候攔截? &n

springboot初步認識---定義filter

自動添加 println int ring resp () value mva https Spring Boot自動添加了OrderedCharacterEncodingFilter和HiddenHttpMethodFilter,直接自定義Filter。 步驟: 1.實現

SpringBoot 整合AOP 定義註解

SpringBoot 整合Aop 完成自定義註解功能 前提是需要掌握一定的Spring Aop知識 第一步:引入jar <dependency> <groupId>org.springframewo

### shiro定義filter【解決某個請求 需要同時擁有多種許可權】

1. shiro的filter介紹 <bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">         <property name="s

springboot整合shiro遭遇定義filter異常(定義FormAuthenticationFilter)

最近忙著研究在 Springboot 上使用 Shiro 的問題。剛好就遇到個詭異事,百度 Google 也沒找到啥有價值的資訊,幾番周折自己解決了,這裡稍微記錄下。 自定義 Filter Shiro 支援自定義 Filter 大家都知道,也經常用,這裡我也用到了一個自定義 Filter,主

springboot整合Shiro,新增定義filtershiro的預設filter無法使用

在springboot中整合shiro,發現再添加了自定義的filter後預設的filter無法使用。 猜測是自定義的filter被放在了預設的filter前面,導致先被自定義的filter攔截了。 證實了的確是我所猜想的那般,自定義的filter被放在了shiro預

解決Shiro+SpringBoot定義Filter不生效問題2

解決Shiro+SpringBoot自定義Filter不生效問題 在SpringBoot+Shiro實現安全框架的時候,自定義擴充套件了一些Filter,並註冊到ShiroFilter,但是執行的時候發現總是在ShiroFilter之前就進入了自定義Filter,結果當然是不對的。 &

springboot整合shiro認證時"username"更改為"account"或定義的ShiroConfig配置

springboot整合shiro認證時"username"更改為"account"或自定義的配置package com.sxt.zhy.springboot.config; import java.util.HashMap; import java.util.Linked

SpringBoot整合shiro(二)定義sessionManager

傳統結構專案中,shiro從cookie中讀取sessionId以此來維持會話,在前後端分離的專案中(也可在移動APP專案使用),我們選擇在ajax的請求頭中傳遞sessionId,因此需要重寫shiro獲取sessionId的方式。自定義ShiroSessio

前後分離,使用定義token作為shiro認證標識,實現springboot整合shiro

直接進入主題,專案是使用springboot,框架用的shiro做許可權,mybatis做orm框架,專案需要做前後分離,這樣就會

springboot(八)定義Filter

frame ide inf 執行權 tps pattern n) filters nts 自定義Filter   我們常常在項目中會使用filters用於錄調用日誌、排除有XSS威脅的字符、執行權限驗證等等。   Spring Boot自動添加了OrderedChara

【系統學習SpringBootSpringBoot定義Filter

SpringBoot自定義Filter SpringBoot自動添加了OrderedCharacterEncodingFilter和HiddenHttpMethodFilter,當然我們可以自定 義Filter。 自定義Filter需要兩個步驟:

spring boot配置shiro定義shiro filter匹配異常

原文地址:http://www.hillfly.com/2017/179.html最近忙著研究在 Springboot 上使用 Shiro 的問題。剛好就遇到個詭異事,百度 Google 也沒找到啥有價值的資訊,幾番周折自己解決了,這裡稍微記錄下。自定義 FilterTOCS

shiro框架之八-------定義filter

寫在前面 我們知道,shiro框架在Java Web應用中使用時,本質上是通過filter方式整合的。 也就是說,它是遵循過濾器鏈規則的:filter的執行順序與在web.xml中定義的順序一致,如下所示: <filter> <filter-name>s

SpringBoot中Beetl定義標籤的完美整合

今天接手一個專案,專案中使用SpringBoot,發現之前實現Beetl自定義標籤註冊的方式有些傻大粗,做了些修改,整理之後釋出,作為回顧。 Beetl自定義標籤 下面說一下在SpringBoot中關於Beetl自定義標籤的定義以及注入: 自定義標籤

SpringBoot 定義filter 和 interceptor,定義靜態檔案存放位置

上篇分享我們已經有了一個最基礎具有登陸驗證功能 的SpringBoot web專案,本篇對照之前SpringMVC 的xml配置,闡述SpringBoot 中的filter 和 interceptor。 一、web.xml中的filter 和 SpringBo

springboot定義filter學習筆記

開發十年,就只剩下這套架構體系了! >>>