1. 程式人生 > >Springmvc+Shiro+zTree 實戰(四):系統登入邏輯與實現授權

Springmvc+Shiro+zTree 實戰(四):系統登入邏輯與實現授權

登入頁面:

LoginController:

@GetMapping
public ModelAndView toLogin() {
	// 跳轉登入頁面
	ModelAndView mv = new ModelAndView("login");
	return mv;
}


@PostMapping()
public ModelAndView login(User user, HttpServletRequest request) {

	ModelAndView mv = new ModelAndView();
    //得到subject
	Subject subject = SecurityUtils.getSubject();
		
	//建立使用者名稱和MD5加密過的密碼身份驗證Token
	UsernamePasswordToken token = new UsernamePasswordToken(
				user.getUserName(), new Md5Hash(user.getPassword()).toString());
	try {
		subject.login(token);// 登入,即使用者身份認證
	} catch (AuthenticationException e) {// 登入失敗,跳轉登入頁面
		log.error("使用者登入失敗", e);
		mv.addObject("msg", "使用者名稱或密碼錯誤");
		mv.setViewName("login");
		return mv;
	}
	if (subject.isAuthenticated()) {// 登入成功,儲存使用者資訊,跳轉首頁
		request.getSession().setAttribute("user", user.getUserName());
		mv.setViewName("redirect:/user.do");
		return mv;
	} else {
		log.error("使用者登入失敗");
		mv.addObject("msg", "使用者名稱或密碼錯誤");
		mv.setViewName("login");
		return mv;
	}

}

登入失敗:

登入成功:

系統登出操作

上一節在xml配置了shiro登出過濾器,它的作用是在使用者退出系統時,清空快取等操作。解決更新使用者許可權後不立馬起作用的小問題。

登出按鈕如下,不需要寫loginOut對應的Controller,shiro自動攔截,然後跳轉登入介面,詳見上一節配置

<li class="xxx"><a href="loginOut"> 退出 </a></li>

shiro授權常用方式一:基於註解

註解 意義 案例
@RequiresAuthentication 驗證使用者是否登入
@RequiresUser 當前使用者已經驗證過了或則記住我了
@RequiresGuest 是否是遊客身份
@RequiresRoles 判斷subject中有aRoleName角色才可以訪問方法someMethod @RequiresRoles({“admin”})
@RequiresPermissions 需要擁有許可權 @RequiresPermissions({“file:read”, “write:aFile.txt”} )

Controller方法上面新增相應註解

@DeleteMapping(value="/{id}")
@ResponseBody
@RequiresRoles({"admin"})
public ResponseEntity<Integer> delUser(@PathVariable("id")int id) {
	try{
		userService.delUser(id);
	}catch(Exception e){
		log.error("刪除使用者失敗",e);
		return new ResponseEntity<Integer>(HttpStatus.INTERNAL_SERVER_ERROR);
	}
	return new ResponseEntity<Integer>(Common.common_success,HttpStatus.OK);

}

shiro授權常用方式二:jsp頁面授權,基於<shiro>標籤

匯入<shiro>標籤庫:<%@ taglib uri="http://shiro.apache.org/tags" prefix="shiro"%>

標籤名稱

標籤條件(均是顯示標籤內容)

<shiro:authenticated>

登入之後

<shiro:notAuthenticated>

不在登入狀態時

<shiro:guest>

使用者在沒有RememberMe時

<shiro:user>

使用者在RememberMe時

<shiro:hasAnyRoles name="abc,123" >

在有abc或者123角色時

<shiro:hasRole name="abc">

擁有角色abc

<shiro:lacksRole name="abc">

沒有角色abc

<shiro:hasPermission name="abc">

擁有許可權資源abc

<shiro:lacksPermission name="abc">

沒有abc許可權資源

<shiro:principal>

顯示使用者身份名稱

1:實現粗粒度許可權控制,通過判斷使用者是否有角色/許可權,控制左側選單欄的顯示和隱藏

<shiro:hasPermission name="systemUser">
	<i class="fa fa-sitemap"></i> 使用者中心					   
    <shiro:hasPermission name="userManager">
		<a href="user.do">使用者管理</a>
	</shiro:hasPermission> 
					
	<shiro:hasPermission name="roleManager">
		<a href="role.do">角色管理</a>
	</shiro:hasPermission>			
</shiro:hasPermission>

2:實現細粒度許可權控制,通過判斷使用者是否有角色/許可權,決定是否顯示刪除/編輯按鈕

<shiro:hasPermission name="roleManagerDelete">
	<button id="del" onclick="del(${role.id})">刪除</button>
</shiro:hasPermission>
<shiro:hasPermission name="roleManagerUpdate">
	<button id="upd" onclick="upd(${role.id})">修改</button>
</shiro:hasPermission>

注意1:除錯過程中,可能會遇到自定義的DbRealm中授權方法進不去,這是因為,你在跳轉的方法上面沒有使用shiro授權註解,同時在要跳轉的頁面沒有使用<shiro>標籤授權。必須有授權行為,才能進入授權方法。

注意2:實踐過程中,可能需要在js中拼接<shiro>標籤,生成html程式碼,這是這樣生成的<shiro>標籤不起作用

例如:

var htm = '';
htm += '<shiro:hasPermission name="roleManagerDelete">';
htm += '<button>刪除</button>';
htm += '</shiro:hasPermission>';
return htm;

解決思路:先在頁面通過<shiro>標籤生成一個變數,js根據這個變數來判斷是否需要拼接刪除按鈕的html

<!-- jsp程式碼 -->
<shiro:hasPermission name="roleManagerDelete">
	<input type="text" id="isDelete" hidden="true" value="true">
</shiro:hasPermission>

<!-- js程式碼 -->
var htm = '';
if($("#isDelte").val() == "t"){
   htm += '<button>刪除</button>';
}
return htm;

相關推薦

Springmvc+Shiro+zTree 實戰系統登入邏輯實現授權

登入頁面: LoginController: @GetMapping public ModelAndView toLogin() { // 跳轉登入頁面 ModelAndView mv = new ModelAndView("login"); return

Android項目實戰ViewPager切換動畫3.0版本以上有效果

技術 code info utf-8 play draw pos support addview 原文:Android項目實戰(四):ViewPager切換動畫(3.0版本以上有效果)學習內容來自“慕課網” 一般APP進去之後都會有幾張圖片來導航,

演算法的實戰LeetCode -- Palindrome Number

一 題目描述 判斷一個整數是否是迴文數。迴文數是指正序(從左向右)和倒序(從右向左)讀都是一樣的整數。 示例 1: 輸入: 121 輸出: true 示例 2: 輸入: -121 輸出: false 解釋: 從左向右讀, 為 -121 。 從右向左讀, 為 121

Docker實戰Docker安裝JDK

Docker安裝JDK 安裝JDK7和JDK8基本沒有區別,只是Dockerfile有所不同,但是他們都繼承了之前tools的Docker映象,下面給出了JDK7和JDK8的Dockerfile原始檔。 大概步驟: 上傳jdk7到宿主機 編寫Dock

python爬蟲實戰selenium爬蟲抓取阿里巴巴採購批發商品

一、前言 二、學習資料(感謝分享) 三、開始爬取 1、先分析目標網址,為什麼選擇selenium 在搜尋中輸入女裝,用F12檢視原始碼,看看網頁顯示的內容是不是Ajax。點選Network,選擇下面的XHR,按F5重新整理頁面,下

Webpack實戰教教你如何輕鬆搞定-前處理器loader

前面三節,我主要給大家分享了有關webpack的一些配置的知識點,如何打包js檔案,而如果我們遇到其他型別的資源如圖片、css、字型font等等,我們該如何處理呢?今天會介紹前處理器(loader),它賦予了Webpack可處理不同資源型別的能力,極大豐富了其可擴充套件性。 如果想了解Webpack的基礎配

Linux基礎命令高階鍵盤操作許可權控制——history、自動補全、命令列快捷鍵、歷史命令展開、id、chmod、umask、su、sudo、chown、chgrp、passwd

高階鍵盤操作 Linux終端支援各種快捷鍵操作。掌握這些快捷鍵以及命令列互動式編輯特性,基本可以告別滑鼠操作了。 clear - 清空螢幕 history - 顯示歷史列表內容 小技巧:Linux的圖形使用者介面中,非最大化的視窗是預設隱藏頂部選項卡的,可以通過保持按

樹形結構的處理——組合模式透明組合模式安全組合模式

11.4 透明組合模式與安全組合模式 通過引入組合模式,Sunny公司設計的防毒軟體具有良好的可擴充套件性,在增加新的檔案型別時,無須修改現有類庫程式碼,只需增加一個新的檔案類作為AbstractFile類的子類即可,但是由於在AbstractFile中聲明瞭

代理模式代理模式效果適用場景

15.7 代理模式效果與適用場景        代理模式是常用的結構型設計模式之一,它為物件的間接訪問提供了一個解決方案,可以對物件的訪問進行控制。代理模式型別較多,其中遠端代理、虛擬代理、保護代理等在軟體開發中應用非常廣泛。 15.7.1 模式優點       

linux網路程式設計之posix 執行緒posix 條件變數互斥鎖 示例生產者--消費者問題

#include <unistd.h>#include <sys/types.h>#include <pthread.h>#include <semaphore.h>#include <stdlib.h>#include <stdio.h>

Kubernetes筆記詳解Namespace資源限制ResourceQuota,LimitRange

前面我們對K8s的基本元件與概念有了個大致的印象,並且基於K8s實現了一個初步的CI/CD流程,但對裡面涉及的各個物件(如Namespace, Pod, Deployment, Service, Ingress, PVC等)及各物件的管理可能還缺乏深入的理解與實踐,接下來的文章就讓我們一起深入K8s的各元件內

MVC之排球比賽計分程序 ——視圖的設計實現

元素 role view logs image 技術 size 之前 log (view)視圖 視圖是用戶看到並與之交互的界面。對老式的Web應用程序來說,視圖就是由HTML元素組成的界面,在新式的Web應用程序中,HTML依舊在視圖中扮演著重要的角色,但一些新的技術

理解SpringAOP 的概念實現原理

[TOC] ## 什麼是 AOP AOP(Aspect Oriented Programming,面向切面程式設計)是一種程式設計正規化,它是對 OOP(Object Oriented Programming,面向物件程式設計)的一個補充。 OOP 允許我們通過類來定義物件的屬性和行為,由於物件的行

構建NetCore應用框架之實戰BitAdminCore框架1.0登錄功能細化及技術選型

1.0 dmi 也會 繼承 blank bit 技術選型 cor 我會 本篇承接上篇內容,如果你不小心點擊進來,建議從第一篇開始完整閱讀,文章內容繼承性連貫性。 構建NetCore應用框架之實戰篇系列 一、BitAdminCore框架1.0版本 1、1.0版本是指

Mybatis實戰

準備工作 pom.xml <!--mybatis--> <dependency> <groupId>org.mybatis.spring.boot</groupId> &l

安卓專案實戰之強大的網路請求框架okGo使用詳解Cookie的管理

Cookie概念相關 具體來說cookie機制採用的是在客戶端保持狀態的方案,而session機制採用的是在伺服器端保持狀態的方案。同時我們也看到,由於採用伺服器端保持狀態的方案在客戶端也需要儲存一個標識,所以session機制是需要藉助於cookie機制來達到儲存標識的目的,所謂ses

【AI實戰】快速掌握TensorFlow損失函式

在前面的文章中,我們已經學習了TensorFlow激勵函式的操作使用方法(見文章:快速掌握TensorFlow(三)),今天我們將繼續學習TensorFlow。 本文主要是學習掌握TensorFlow的損失函式。 一、什麼是損失函式 損失函式(loss function)是機器學習

SpringMVC】10.REST風格的CRUD實戰之刪除操作

注意!!! 一、前情提要 刪除操作 URL:emp/{id} 請求方式:DELETE 刪除後效果:對應記錄從資料表中刪除 二、具體步驟 1.配置HiddenHttpMethodFilter 由於HTML只支援常見的Get和POST方法,而DELE

SpringBoot+Shiro學習Realm授權

上一節我們講了自定義Realm中的認證(doGetAuthenticationInfo),這節我們繼續講另一個方法doGetAuthorizationInfo授權 授權流程 流程如下: 首先呼叫Subject.isPermitted/hasRole介面,其會委託給Security

機器學習實戰讀書筆記樸素貝葉斯演算法

樸素貝葉斯 優點: 在資料較少的情況下仍然有效 可以處理多類別問題 缺點:對輸入的資料的準備方式較為敏感 適用資料型別:標稱型資料 p1(x,y)>p2(x,y) 那麼類別是1 p2(x,y)>p1(x,y) 那麼類別是2 貝葉斯決策的核心是選擇具有最高概率的決策