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_tag和filter
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如何設置頭註釋,自定義author和date
技術分享 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上有自定義directive和ng-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,自定義radio和checkbox
最近做的專案選項框比較多,為了讓介面看起來更加美觀,決定自定義radio和checkbox,功能不變的情況下提高使用者體驗。這裡比較關鍵的一點是用到label的for屬性。 w3c的label介紹: <label> 標籤為 input 元素定義標註(標記)。 l
自己實現的資料表格控制元件(dataTable),支援自定義樣式和標題資料、ajax等各種自定義設定以及分頁自定義
一、前言 也沒什麼好說的嘛,用了蠻多github上開源的能夠實現dataTable功能的表格外掛,不過都預設繫結樣式啊,資料格式也設定的比較死,所以忍不住自己實現了一個簡單的可自定義樣式和自定義資料返回格式的資料表格外掛,原生js是保留的,後面如果更新新版本的話會去除對jq