Shiro-14-subject 主體

理解Apache Shiro中的主題

毫無疑問,Apache Shiro中最重要的概念是主題。

“主題”只是一個安全術語,它指的是應用程序用戶特定于安全的“視圖”。Shiro主題實例代表了單個應用程序用戶的安全狀態和操作。

這些操作包括:

  • 身份驗證(登錄)

  • 授權(訪問控制)

  • 會話的訪問

  • 注銷

我們最初想叫它“用戶”,因為這“很有意義”,但我們決定不叫它:太多的應用程序已經有了它們自己的用戶類/框架的api,我們不想與它們沖突。

此外,在安全領域,術語“主體”實際上是公認的命名法。

Shiro的API鼓勵應用程序采用以主題為中心的編程范式。

在編寫應用程序邏輯時,大多數應用程序開發人員都想知道當前執行的用戶是誰。

雖然應用程序通常可以通過自己的機制(UserService,等等)查找任何用戶,但當涉及到安全性時,最重要的問題是“當前用戶是誰?”

雖然任何主題都可以通過使用SecurityManager獲得,但僅基于當前用戶/主題的應用程序代碼更加自然和直觀

當前正在執行的主體

在幾乎所有的環境中,你都可以通過使用 org.apache.shiro.SecurityUtils 來獲取當前正在執行的主題:

Subject currentUser = SecurityUtils.getSubject();

在獨立的應用程序中,getSubject()調用可能會根據應用程序特定位置的用戶數據返回一個主題,而在服務器環境(例如web應用程序)中,它會根據與當前線程或傳入請求相關聯的用戶數據獲取主題。

在你學習了現在的課程之后,你能做些什么呢?

如果你想讓用戶在他們當前的會話中使用這些東西,你可以得到他們的會話:

Session session = currentUser.getSession();
session.setAttribute( "someKey", "aValue" );

Session是一個特定于shiro的實例,它提供了常規httpsession所使用的大部分功能,但也有一些額外的好處和一個很大的區別:它不需要HTTP環境!

如果在web應用程序中部署,默認情況下會話將是基于HttpSession的。但是,

在一個非web環境中,比如這個簡單的快速入門,Shiro默認情況下會自動使用它的企業會話管理。這意味著無論部署環境如何,您都可以在應用程序的任何層中使用相同的API。這打開了一個全新的應用程序世界,因為任何需要會話的應用程序都不需要強制使用HttpSession或EJB有狀態會話bean。而且,任何客戶機技術現在都可以共享會話數據。

所以現在你可以獲得一個對象和他們的會話。那么真正有用的東西呢,比如檢查它們是否被允許做一些事情,比如檢查角色和權限?

登陸驗證

我們只能對已知的用戶做這些檢查。上面的Subject實例表示當前用戶,但是誰是當前用戶呢?嗯,他們是匿名的——也就是說,直到他們至少登錄一次。

那么,讓我們這樣做:

if ( !currentUser.isAuthenticated() ) {//collect user principals and credentials in a gui specific manner//such as username/password html form, X509 certificate, OpenID, etc.//We'll use the username/password example here since it is the most common.//(do you know what movie this is from? ;)UsernamePasswordToken token = new UsernamePasswordToken("lonestarr", "vespa");//this is all you have to do to support 'remember me' (no config - built in!):token.setRememberMe(true);currentUser.login(token);
}

就是這樣!再簡單不過了。

但是,如果他們的登錄嘗試失敗怎么辦?你可以捕捉各種特定的異常,告訴你到底發生了什么:

try {currentUser.login( token );//if no exception, that's it, we're done!
} catch ( UnknownAccountException uae ) {//username wasn't in the system, show them an error message?
} catch ( IncorrectCredentialsException ice ) {//password didn't match, try again?
} catch ( LockedAccountException lae ) {//account for that username is locked - can't login.  Show them a message?
}... more types exceptions to check if you want ...
} catch ( AuthenticationException ae ) {//unexpected condition - error?
}

作為應用程序/GUI開發人員,您可以選擇是否根據異常顯示最終用戶消息(例如,“系統中沒有具有該用戶名的帳戶”)。

有許多不同類型的異常你可以檢查,或者拋出你自己的Shiro可能無法解釋的自定義條件。

更多信息請參閱AuthenticationException JavaDoc。

現在,我們有了一個登錄用戶。

權限校驗

我們還能做什么?

讓我們說說他們是誰:

//print their identifying principal (in this case, a username): 
log.info( "User [" + currentUser.getPrincipal() + "] logged in successfully." );

我們也可以測試他們是否有特定的角色:

if ( currentUser.hasRole( "schwartz" ) ) {log.info("May the Schwartz be with you!" );
} else {log.info( "Hello, mere mortal." );
}

是否擁有權限:

if ( currentUser.isPermitted( "lightsaber:weild" ) ) {log.info("You may use a lightsaber ring.  Use it wisely.");
} else {log.info("Sorry, lightsaber rings are for schwartz masters only.");
}

此外,我們還可以執行非常強大的實例級權限檢查——查看用戶是否有能力訪問特定類型的實例的能力:

if ( currentUser.isPermitted( "winnebago:drive:eagle5" ) ) {log.info("You are permitted to 'drive' the 'winnebago' with license plate (id) 'eagle5'.  " +"Here are the keys - have fun!");
} else {log.info("Sorry, you aren't allowed to drive the 'eagle5' winnebago!");
}

最后,登陸的用戶也可以登出:

currentUser.logout(); //removes all identifying information and invalidates their session too.

在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/696450.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/696450.shtml
英文地址,請注明出處:http://en.pswp.cn/news/696450.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

了解JSON的作用及其方法

什么是json JSON(JavaScript Object Notation)是一種輕量級的數據交換格式采用完全獨立編程語言的文本格式存儲和表示數據(就是字符串)。它基于JavaScript語法,但可以被多種編程語言使用和解析。JSON以鍵值對的形式存…

高光譜圖像降噪方法(2D Wavelet, 3D Wavelet, FORPDN, HyRes等方法)

近年來,隨著遙感應用的不斷深入,高光譜圖像研究已經成為遙感領域發展最迅速的技術之一。與其他傳統成像技術相比,高光譜圖像具有更多優勢:更豐富的信息量、納米級的光譜分辨率以及范圍更廣且連續的光譜。因此,在農業、…

C#用反射實現兩個類的對象之間相同屬性的值的復制

目錄 1.適用于創建實體的時候從一個實體作為數據源賦值 2.適用于沒有創建實體&#xff0c;兩個實體之間數據的轉換 1.適用于創建實體的時候從一個實體作為數據源賦值 /// <summary> /// 反射實現兩個類的對象之間相同屬性的值的復制 /// 適用于初始化新實體 /// </…

選擇VR全景行業,需要了解哪些內容?

近年來&#xff0c;隨著虛擬現實、增強現實等技術的持續發展&#xff0c;VR全景消費市場得以穩步擴張。其次&#xff0c;元宇宙行業的高速發展&#xff0c;也在進一步拉動VR全景技術的持續進步&#xff0c;帶動VR產業的高質量發展。作為一種戰略性的新興產業&#xff0c;國家和…

OJ_學生信息系統

題干 輸入樣例&#xff1a; 5 zhaoyi 70 80 90 240 qianer 65 32 77 174 sunsan 100 55 68 223 lisi 86 77 90 253 wangwu 100 59 66 225 輸出樣例&#xff1a; *[qianer] 65 32 77 *[sunsan] 100 55 68 *[wangwu] 100 59 66 lisi 86 77 90 zhaoyi 70 80 90 wangwu 100 59 6…

k8s-權限管理

1. 身份認證 我們在目前的k8s集群環境里面&#xff0c;只能在master節點上執行kubectl的一些命令&#xff0c;在其他節點上執行就會報錯 # 看一下是不是 [rootnode1 ~]# kubectl get nodes E0220 12:50:15.695133 6091 memcache.go:238] couldnt get current server API gro…

云打印api搭建,云打印api怎么對接?

相信近來一段時間云打印概念的火熱讓很多企業和App都有開展打印業務的想法&#xff0c;但是云打印技術的開發又需要有打印設備的支持&#xff0c;這個時候我們可以找到專業的云打印服務平臺進行api對接。那么云打印api搭建&#xff0c;云打印api怎么對接&#xff1f;今天來一起…

es6 中字符串、函數、對象、數組分別新增了哪些擴展

es6 中字符串的擴展 includesstartsWithendsWith padStartpadEnd模版字符串 es6 中函數的擴展 箭頭函數 this 對象指向定義時所在的對象不可以當作構造函數&#xff0c;不可以使用 new 命令不可以使用 arguments 對象&#xff0c;可以使用 rest 參數不可以適用 yield 命令&a…

C語言自定義類型:結構體的使用及其內存對齊【超詳細建議點贊收藏】

目錄 1. 結構體類型的聲明1.1 結構的聲明1.2 結構體變量的創建和初始化1.3 結構的特殊聲明---匿名結構體1.4 結構的自引用 2.結構體內存對齊&#xff08;重點&#xff01;&#xff01;&#xff09;2.1 對齊規則2.2 例題講解2.3 為什么存在內存對齊&#xff1f;2.4 修改默認對齊…

OpenGauss數據庫本地搭建并結合內網穿透實現遠程訪問

文章目錄 前言1. Linux 安裝 openGauss2. Linux 安裝cpolar3. 創建openGauss主節點端口號公網地址4. 遠程連接openGauss5. 固定連接TCP公網地址6. 固定地址連接測試 前言 openGauss是一款開源關系型數據庫管理系統&#xff0c;采用木蘭寬松許可證v2發行。openGauss內核深度融合…

云渲染農場服務給力嗎?全天候不間斷服務如何保障?

近年來&#xff0c;云渲染農場以其強大的計算能力和高效的渲染速度而聞名&#xff0c;為各行各業的視覺創作提供了不可或缺的支持。但是&#xff0c;人們普遍關心的是&#xff0c;云渲染農場服務是否真的給力&#xff1f;全天候的服務又是如何保障呢&#xff1f; 實際上&#…

用Python插入頁碼到PDF文檔

頁碼是許多類型文件中的重要內容&#xff0c;它能方便讀者在文檔中的導航。在創建PDF文檔時&#xff0c;添加頁碼對于組織和引用內容特別有用。在本文中&#xff0c;我們將探討如何利用Python程序高效地插入頁碼到PDF文檔中&#xff0c;簡化工作流程并創建出精美、結構合理的PD…

【JavaEE】_synchronized關鍵字——監視器鎖monitor lock

目錄 1. synchronized的特性 2. synchronized的使用 3. Java標準庫中的線程安全類 1. synchronized的特性 &#xff08;1&#xff09;互斥&#xff1a; 前文已經介紹&#xff0c;某個線程執行到某個對象的synchronized中時&#xff0c;其他線程如果也執行到同一個對象&…

2024 Sora來了!“手機Agent智能體”也來了!

近日&#xff0c;Open AI發布了能夠根據文本生成超現實視頻的工具Sora&#xff0c;多款震撼視頻引爆科技圈刷屏&#xff0c;熱度持續發酵占據AI領域話題中心&#xff0c;被認為是AGI實現過程里的重大里程碑事件。新一輪的人工智能浪潮給人類未來的生產和生活方式帶來巨大而深遠…

VPN | 世界那么大,我想“魔法”上網看看,可以嗎?

Hi&#xff0c;大家好&#xff0c;我是半畝花海。世界那么大&#xff0c;我想“魔法”上網看看&#xff0c;可以嗎&#xff1f;隨著網絡的發展與普及&#xff0c;暢游網絡世界已成為人們生活的一部分。它給我們開拓了視野&#xff0c;增長了見聞&#xff0c;豐富了知識&#xf…

FISCO BCOS(二)———配置及使用控制臺

一、前言 FISCO BCOS是由金融區塊鏈合作聯盟&#xff08;深圳&#xff09;與微眾銀行共同發起的開源區塊鏈項目&#xff0c;支持多鏈多賬本&#xff0c;滿足金融行業復雜業務需求。本文將介紹如何在Ubuntu操作系統上使用Linux命令配置FISCO BCOS的控制臺并進行get/set操作。 目…

React 模態框的設計(一)拖動組件的設計

春節終結束了&#xff0c;忙得我頭疼。終于有時間弄自己的東西了。今天來寫一個關于拖動的實例講解。先看效果&#xff1a; 這是一個簡單的組件設計&#xff0c;如果用原生的js設計就很簡單&#xff0c;但在React中有些事件必須要多考慮一些。這是一個系列的文章&#xff0c;…

SpringBoot3整合elasticsearch8

版本 SpringBoot 3.0 Elasticsearch 8.12.1 依賴 我使用的 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-elasticsearch</artifactId> </dependency> 還可以用&#xff0c;但我沒用…

YOLOv9來咧!

文章目錄 論文:主要內容一、提出使用PGI&#xff08;Programmable Gradient Information&#xff0c;可編程梯度信息&#xff09;來解決信息瓶頸問題和深度監督機制不適合輕量級神經網絡的問題。二、設計了GELAN&#xff08;Generalized ELAN &#xff0c;廣義ELAN&#xff09;…

LLM 模型融合實踐指南:低成本構建高性能語言模型

編者按&#xff1a;隨著大語言模型技術的快速發展&#xff0c;模型融合成為一種低成本但高性能的模型構建新途徑。本文作者 Maxime Labonne 利用 mergekit 庫探索了四種模型融合方法&#xff1a;SLERP、TIES、DARE和passthrough。通過配置示例和案例分析&#xff0c;作者詳細闡…