SpringBoot+shiro2 前后端分離 螃蟹和駱駝先生Yvan

shiro1 我只是想讓大家明白shiro的認證是很簡單的潮峦。

現(xiàn)在說一下shiro的前后端分離的權限問題

幾位朋友讓我寫Demo或者類似前后端分離相關辆床,這是很多初級程序員都不是太懂得問題:

先說一下原理仔引,其實shiro的權限分離唯一用到的是cookie芝薇。shiro是通過請求中的cookie存儲一個session會話的id搓幌,來進行區(qū)分用戶的權限,你要明白這一點豆茫,下面就是重寫shiro中獲取cookie中的sessionId的方法來獲取請求頭Authorization中的密鑰侨歉,而密鑰儲存的便是登錄是返回的sessionId,進而可以前后端分離的項目中使用shiro框架

首先看一下前后端分離的controller:

這里第一個標記是認證用戶登錄是否成功揩魂,如果成功繼續(xù)幽邓,第二個人標記就是cookie的id,之后你就要重寫SessionManager這個方法火脉,為什么要重寫這個方法說明一下:通過重寫不但可以拿到cookie的id同時可以讓shiro不走默認的cookie颊艳,默認的cookie里面什么都沒有,所以必須重寫拿到id密鑰這樣shiro就會知道這個請求的用戶的權限:

packagecom.neil.config;

importorg.apache.shiro.web.servlet.ShiroHttpServletRequest;

importorg.apache.shiro.web.session.mgt.DefaultWebSessionManager;

importorg.apache.shiro.web.util.WebUtils;

importorg.slf4j.Logger;

importorg.slf4j.LoggerFactory;

importorg.springframework.stereotype.Component;

importorg.springframework.stereotype.Service;

importjavax.servlet.ServletRequest;

importjavax.servlet.ServletResponse;

importjavax.servlet.http.HttpServletRequest;

importjava.io.Serializable;

/**

* Created by Palerock

*/

@Component

public classSessionManagerextendsDefaultWebSessionManager {

private static finalLoggerlog= LoggerFactory.getLogger(DefaultWebSessionManager.class);

privateStringauthorization="Authorization";

/**

* 重寫獲取sessionId的方法調用當前Manager的獲取方法

*/

@Override

protectedSerializable getSessionId(ServletRequest request, ServletResponse response) {

return this.getReferencedSessionId(request, response);

}

/**

* 獲取sessionId從請求中

*/

privateSerializable getReferencedSessionId(ServletRequest request, ServletResponse response) {

String id =this.getSessionIdCookieValue(request, response);

/* String id = request.getParameter("JSESSIONID");*/

if(id !=null) {

request.setAttribute(ShiroHttpServletRequest.REFERENCED_SESSION_ID_SOURCE,"cookie");

}else{

id =this.getUriPathSegmentParamValue(request,"JSESSIONID");

if(id ==null) {

// 獲取請求頭中的session

id = WebUtils.toHttp(request).getHeader(this.authorization);

if(id ==null) {

String name =this.getSessionIdName();

id = request.getParameter(name);

if(id ==null) {

id = request.getParameter(name.toLowerCase());

}

}

}

if(id !=null) {

request.setAttribute(ShiroHttpServletRequest.REFERENCED_SESSION_ID_SOURCE,"url");

}

}

if(id !=null) {

request.setAttribute(ShiroHttpServletRequest.REFERENCED_SESSION_ID, id);

request.setAttribute(ShiroHttpServletRequest.REFERENCED_SESSION_ID_IS_VALID, Boolean.TRUE);

}

returnid;

}

privateString getSessionIdCookieValue(ServletRequest request, ServletResponse response) {

if(!this.isSessionIdCookieEnabled()) {

log.debug("Session ID cookie is disabled - session id will not be acquired from a request cookie.");

return null;

}else if(!(requestinstanceofHttpServletRequest)) {

log.debug("Current request is not an HttpServletRequest - cannot get session ID cookie.? Returning null.");

return null;

}else{

HttpServletRequest httpRequest = (HttpServletRequest) request;

return this.getSessionIdCookie().readValue(httpRequest, WebUtils.toHttp(response));

}

}

privateString getUriPathSegmentParamValue(ServletRequest servletRequest, String paramName) {

if(!(servletRequestinstanceofHttpServletRequest)) {

return null;

}else{

HttpServletRequest request = (HttpServletRequest) servletRequest;

String uri = request.getRequestURI();

if(uri ==null) {

return null;

}else{

intqueryStartIndex = uri.indexOf(63);

if(queryStartIndex >=0) {

uri = uri.substring(0, queryStartIndex);

}

intindex = uri.indexOf(59);

if(index <0) {

return null;

}else{

String TOKEN = paramName +"=";

uri = uri.substring(index +1);

index = uri.lastIndexOf(TOKEN);

if(index <0) {

return null;

}else{

uri = uri.substring(index + TOKEN.length());

index = uri.indexOf(59);

if(index >=0) {

uri = uri.substring(0, index);

}

returnuri;

}

}

}

}

}

privateString getSessionIdName() {

String name =this.getSessionIdCookie() !=null?this.getSessionIdCookie().getName() :null;

if(name ==null) {

name ="JSESSIONID";

}

returnname;

}

}

接下來在ShiroConfiguration注入一下就ok拉忘分,報錯是因為警告不能引入不影響代碼運行:

這里源碼資源不是前后端分離的棋枕,是前后端在一起的,前后端分離改一下就行啦:

http://pan.baidu.com/s/1mh9EGWC

需要本人同意:

qq:179061434??

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末妒峦,一起剝皮案震驚了整個濱河市重斑,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌肯骇,老刑警劉巖窥浪,帶你破解...
    沈念sama閱讀 212,718評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異笛丙,居然都是意外死亡漾脂,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,683評論 3 385
  • 文/潘曉璐 我一進店門胚鸯,熙熙樓的掌柜王于貴愁眉苦臉地迎上來骨稿,“玉大人,你說我怎么就攤上這事√构冢” “怎么了形耗?”我有些...
    開封第一講書人閱讀 158,207評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長辙浑。 經常有香客問我激涤,道長,這世上最難降的妖魔是什么判呕? 我笑而不...
    開封第一講書人閱讀 56,755評論 1 284
  • 正文 為了忘掉前任倦踢,我火速辦了婚禮,結果婚禮上侠草,老公的妹妹穿的比我還像新娘硼一。我一直安慰自己,他們只是感情好梦抢,可當我...
    茶點故事閱讀 65,862評論 6 386
  • 文/花漫 我一把揭開白布般贼。 她就那樣靜靜地躺著,像睡著了一般奥吩。 火紅的嫁衣襯著肌膚如雪哼蛆。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,050評論 1 291
  • 那天霞赫,我揣著相機與錄音腮介,去河邊找鬼。 笑死端衰,一個胖子當著我的面吹牛叠洗,可吹牛的內容都是我干的。 我是一名探鬼主播旅东,決...
    沈念sama閱讀 39,136評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼灭抑,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了抵代?” 一聲冷哼從身側響起腾节,我...
    開封第一講書人閱讀 37,882評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎荤牍,沒想到半個月后案腺,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 44,330評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡康吵,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,651評論 2 327
  • 正文 我和宋清朗相戀三年劈榨,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片晦嵌。...
    茶點故事閱讀 38,789評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡同辣,死狀恐怖拷姿,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情邑闺,我是刑警寧澤,帶...
    沈念sama閱讀 34,477評論 4 333
  • 正文 年R本政府宣布棕兼,位于F島的核電站陡舅,受9級特大地震影響,放射性物質發(fā)生泄漏伴挚。R本人自食惡果不足惜靶衍,卻給世界環(huán)境...
    茶點故事閱讀 40,135評論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望茎芋。 院中可真熱鬧颅眶,春花似錦、人聲如沸田弥。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,864評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽偷厦。三九已至商叹,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間只泼,已是汗流浹背剖笙。 一陣腳步聲響...
    開封第一講書人閱讀 32,099評論 1 267
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留请唱,地道東北人弥咪。 一個月前我還...
    沈念sama閱讀 46,598評論 2 362
  • 正文 我出身青樓,卻偏偏與公主長得像十绑,于是被迫代替她去往敵國和親聚至。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,697評論 2 351

推薦閱讀更多精彩內容

  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理本橙,服務發(fā)現(xiàn)晚岭,斷路器,智...
    卡卡羅2017閱讀 134,638評論 18 139
  • =========================================================...
    lavor閱讀 3,484評論 0 5
  • 這部分主要是與Java Web和Web Service相關的面試題勋功。 96坦报、闡述Servlet和CGI的區(qū)別? 答...
    雜貨鋪老板閱讀 1,400評論 0 10
  • 1. Java基礎部分 基礎部分的順序:基本語法,類相關的語法狂鞋,內部類的語法片择,繼承相關的語法,異常的語法骚揍,線程的語...
    子非魚_t_閱讀 31,602評論 18 399
  • 第一次遇見手拿玫瑰的小女孩,大概是在五六年前嘲叔。小女孩手拿一束玫瑰花亡呵,跟在我們身后,說硫戈,哥哥你買一個送給姐姐吧锰什。怎么...
    一根藍色骨頭閱讀 568評論 0 2