1. 程式人生 > >shiro自定義登陸和推出的過濾器,實現登陸之後根據條件跳轉不同頁面,推出登陸根據條件跳轉不同頁面

shiro自定義登陸和推出的過濾器,實現登陸之後根據條件跳轉不同頁面,推出登陸根據條件跳轉不同頁面

shiro中我們可以通過自定義過濾器的方式來實現自己想要的結果,比如想要登陸之後跳轉不同頁面

@Bean(name = "shiroFilter")
    public ShiroFilterFactoryBean getShiroFilterFactoryBean(DefaultWebSecurityManager securityManager,
            AuthenticationFilter authenticationFilter) {
        ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();

        shiroFilterFactoryBean.setSecurityManager(securityManager);

        shiroFilterFactoryBean.setSuccessUrl("/"
); shiroFilterFactoryBean.setLoginUrl("/login"); shiroFilterFactoryBean.setUnauthorizedUrl("/login"); filterChainDefinitionMap.put("/login", "authc"); filterChainDefinitionMap.put("/logout", "logout"); filterChainDefinitionMap.put("/", "authc"); Map<String, Filter> filtersMap = new
LinkedHashMap<String, Filter>(); filtersMap.put ("authc",new LoginFormAuthenticationFilter());//自定義登陸的過濾器 filtersMap.put ("logout",new LogoutFormAuthenticationFilter());//自定義退出的過濾器 shiroFilterFactoryBean.setFilters (filtersMap); shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap); return
shiroFilterFactoryBean; }

上面這個配置我們可以看到,將login連線配置成登陸訪問的連線,但我們進行登陸提交的時候會執行authc許可權的過濾器也就是這段

  filtersMap.put ("authc",new LoginFormAuthenticationFilter());//自定義登陸的過濾器

我們執行登出的時候就會執行下面這個過濾器

   filtersMap.put ("logout",new LogoutFormAuthenticationFilter());//自定義退出的過濾器

現在我們看一下兩個過濾器的寫法

import com.yssoft.fs.business.comm.ShiroDbRealm;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.AuthenticationToken;
import org.apache.shiro.subject.Subject;
import org.apache.shiro.web.filter.authc.FormAuthenticationFilter;
import org.apache.shiro.web.util.WebUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;

/**
 * 說明
 *
 * @author chenyidong
 * @建立時間 2018-07-2018/7/30/030 19:50
 * @copyright © 2018
 */
public class LoginFormAuthenticationFilter extends FormAuthenticationFilter {

    private static Logger logger = LoggerFactory.getLogger(LoginFormAuthenticationFilter.class);

    @Override
    protected boolean onLoginSuccess(AuthenticationToken token, Subject subject, ServletRequest request,
                                     ServletResponse response) throws Exception {

        ShiroDbRealm.ShiroUser user = (ShiroDbRealm.ShiroUser) SecurityUtils.getSubject().getPrincipal();

        if(user != null) {
            HttpServletRequest req = (HttpServletRequest) request;
            String clientType = (String) req.getParameter("isPhone");

            logger.debug("[LOGIN]login success(user:" + user.loginName + ", client:" + clientType + ")");

                if("null".equals (clientType) || null==clientType) { // 正常情況下跳轉的頁面    
                return super.onLoginSuccess(token, subject, request, response);
            } else { // 根據型別跳轉指定頁面

                WebUtils.getAndClearSavedRequest(request); // 清除登入前請求路徑

                req.getSession ().setAttribute ("isPhone","true");
                //其他情況自己想要跳轉的頁面
                String fallbackUrl = "/manager/service/list";
                WebUtils.redirectToSavedRequest(request, response, fallbackUrl);
            }
        }
        return false;
    }


}

import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;

/**
 * 說明
 *
 * @author chenyidong
 * @建立時間 2018-07-2018/7/30/030 19:59
 * @copyright © 2018
 */
public class LogoutFormAuthenticationFilter extends LogoutFilter {
    private static Logger logger = LoggerFactory.getLogger(LogoutFormAuthenticationFilter.class);

    @Override
    protected boolean preHandle (ServletRequest request, ServletResponse response) throws Exception {
        //return super.preHandle (request, response);
        Subject subject = getSubject(request, response);
        String redirectUrl = getRedirectUrl(request, response, subject);
        HttpServletRequest req = (HttpServletRequest) request;
        String clientType =  req.getSession().getAttribute ("isPhone")+"";//在前面登陸的過濾器中儲存的資料,用來分辨是不是app登陸
        subject.logout();
        logger.debug("[LOGIN]logout success( client:" + clientType + ")");
        if(!"null".equals (clientType) && null!=clientType) { // 請求方為pc,執行原方法
            issueRedirect(request, response, "/app/login");
        }else{
            issueRedirect(request, response, "/login");
        }
        return false;
    }
}

上面是登陸過濾器和登出過濾器程式碼,當然實現其他的功能和著兩個過濾器同樣配置,使用如下方式

  Map<String, Filter> filtersMap = new LinkedHashMap<String, Filter>();
        filtersMap.put ("authc",new LoginFormAuthenticationFilter());//自定義登陸的過濾器
        filtersMap.put ("logout",new LogoutFormAuthenticationFilter());//自定義退出的過濾器
        shiroFilterFactoryBean.setFilters (filtersMap);

        shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap);

相關推薦

shiro定義登陸推出過濾器實現登陸之後根據條件不同頁面推出登陸根據條件不同頁面

shiro中我們可以通過自定義過濾器的方式來實現自己想要的結果,比如想要登陸之後跳轉不同頁面 @Bean(name = "shiroFilter") public ShiroFilterFactoryBean getShiroFilterFacto

18)django-模板的過濾器tag定義simple_tagfilter

hello 直接 結果 from simple 使用 span 裝飾 san 模板過濾器是在變量被顯示前修改它的值的一個簡單方法。 過濾器使用管道字符 . 模板標簽(template tag) 。標簽(tag)定義比較明確,即: 僅通知模板系統完成某些工作的標簽。 一:d

)python 全棧開發Day70(模板定義標籤過濾器,模板繼承 (extend),Django的模型層-ORM簡介)

昨日內容回顧 檢視函式: request物件 request.path 請求路徑 request.GET GET請求資料 QueryDict {} request.POST POST請求資料 Que

IntelliJ IDEA如何設置頭註釋定義authordate

技術分享 spa 分享圖片 es2017 log tel auth bsp image 下面這張圖,保證你一看就會: 下面這個模板,你拿去改一改就行了。 1 /** 2 * @Author: Gosin 3 * @Date: ${DATE} ${TIME} 4 */

使用定義註解反射 自動生成查詢語句

runt entity forname == rop ava stat pri string 1.自定義表名註解 package com.lf.annotation; import java.lang.annotation.ElementType; import jav

SSH開發 | 配合定義註解 Stratus攔截器實現 方法級粒度 用戶鑒權

struts OS action gin 所有 具體實現 getmethod red nal 1.提要   本文是 小小商城-SSH版的 細節詳解系列 之一,項目 github:https://github.com/xenv/S-mall-ssh 本文代碼大部分在 gith

django定義模板過濾器

-自定義過濾器 -1 先app是不是已經在setting中註冊 -2 在app下建立一個templatetags(****名字不能變***)的資料夾(模組) -3 在模組下建立一個py檔案,名字隨意:mytag.py

19 Django模板定義標籤過濾器,模板繼承 (extend),Django的模型層-ORM簡介

一、模板自定義標籤和過濾器 標籤,是為了做一些功能。過濾器,是對斜槓前面的資料做過濾。 為什麼要自定義標籤和過濾器?因為自帶的不夠用,需要結合需求,來自定義。 自定義標籤和過濾器需要執行3個步驟: 1、在settings中的INSTALLED_APPS配置當前app,不然django無法找到自定

shiro定義過濾器

就是自定義過濾規則 一些特殊的請求路徑 需要進過自定義的過濾器 在自定義的過濾器中 認證規則是自己定的 spring檔案: <!-- 引入資料來源 --> <context:property-placeholder lo

【JS】json匯出到excel定義檔名字尾名

json匯出excel表格 HTML <el-button type="danger" class="ml10 fr" @click="exportForm">匯出表格</el-button> JS 表格輸出的數字,如果太長,會自動計算

django中定義標籤過濾器

準備(必需)工作: 1  在某個app下建立一個名為templatetags(必需,且包名不可變)的包。假設我們在名為polls的app下建立了一個templatetags的包,並在該包下建立了一個名為mytags的檔案。那麼目錄結構看起來應該就像這樣: polls/

springmvc+shiro定義過濾器

實現需求: 1.使用者未登入,跳轉到登入頁,登入完成後會跳到初始訪問頁。 2.使用者自定義處理(如需要啟用),跳轉到啟用頁面,啟用完成後會跳到初始訪問頁。 使用到的框架 springmvc 的攔截器 shiro 自定義過濾器 實現: 1.編寫攔截器通過sessi

python在終端輸出不同顏色的列印定義日誌定義log輸出級別

實現過程:       終端的字元顏色是用轉義序列控制的,是文字模式下的系統顯示功能,和具體的語言無關。       轉義序列是以ESC開頭,即用\033來完成(ESC的ASCII碼用十進位制

angular應用一個input上有定義directiveng-model怎麼在directive更新input的value時更新model

https://segmentfault.com/q/1010000000347476 wise.directive('upload', function ($parse) { return { link: function ($scope, iEl

shiro 定義FormAuthenticationFilter記住我

驗證碼 思路 shiro使用FormAuthenticationFilter進行表單認證,驗證校驗的功能應該加在FormAuthenticationFilter中,在認證之前進行驗證碼校驗。 需要寫FormAuthenticationFilter的子類,繼承FormAuth

安卓 定義 日期時間選擇器在一個佈局中可以直接呼叫

廢話不多說先看效果,效果不符合,就不要用看了。 安卓提供自己的日期選擇和時間選擇,但是樣式並不是自己想要的,如果非要把他們放在一起,會發現,樣式不好看,而且時間和日期選擇控制元件的大小不好控制,甚至根本沒法放在一行上,所以實現自定義日期時間選擇器有兩種方式 1.自己寫自定

com4j學習(2):Visio定義模具形狀並新增連線點

前言: 既然我們想繪製跟自己業務相關的圖形,並讀取Visio圖形中的結構資訊,那麼我們自然會想到要自定義圖形,本文詳細講解如何自定義圖形。 正文: 首先我們要明白什麼是模具,什麼是形狀,以及兩者之間的關係?模具就相當於一個容器,裡面有很多個形狀,我們可

Qt-網易雲音樂介面實現-7 訊息中心實現主要是QListWidget 定義Item QTabwidget使用

最近寫的有點煩躁, 感覺內容真的很多!很多!很多。目前真的想知道網易官方在出這款產品是,用了多少人和多長時間。今天寫的這個訊息中心,有點糙,只是原理實現了沒有完全複製過來,心裡有團火,不想寫了。看下效果吧其實這個訊息中心的內容到時很簡單,最底層一個Qtabwidgte,構成@

label模擬radio、checkbox定義radiocheckbox

最近做的專案選項框比較多,為了讓介面看起來更加美觀,決定自定義radio和checkbox,功能不變的情況下提高使用者體驗。這裡比較關鍵的一點是用到label的for屬性。 w3c的label介紹: <label> 標籤為 input 元素定義標註(標記)。 l

自己實現的資料表格控制元件(dataTable)支援定義樣式標題資料、ajax等各種定義設定以及分頁定義

一、前言 也沒什麼好說的嘛,用了蠻多github上開源的能夠實現dataTable功能的表格外掛,不過都預設繫結樣式啊,資料格式也設定的比較死,所以忍不住自己實現了一個簡單的可自定義樣式和自定義資料返回格式的資料表格外掛,原生js是保留的,後面如果更新新版本的話會去除對jq