shiro(一)簡介、理論知識

2019獨角獸企業重金招聘Python工程師標準>>> hot3.png

開濤學shiro:http://jinnianshilongnian.iteye.com/blog/2018398

shiro+spirngmvc參考:

https://www.cnblogs.com/sharpest/p/5865732.html

http://peirenlei.iteye.com/blog/2086639

https://blog.csdn.net/crazylai1996/article/details/76222431

Authentication身份認證/登錄,驗證用戶是不是擁有相應的身份;

Authorization授權,即權限驗證,驗證某個已認證的用戶是否擁有某個權限;即判斷用戶是否能做事情,常見的如:驗證某個用戶是否擁有某個角色。或者細粒度的驗證某個用戶對某個資源是否具有某個權限;

Session Manager會話管理,即用戶登錄后就是一次會話,在沒有退出之前,它的所有信息都在會話中;會話可以是普通JavaSE環境的,也可以是如Web環境的;

Cryptography加密,保護數據的安全性,如密碼加密存儲到數據庫,而不是明文存儲;

Web SupportWeb支持,可以非常容易的集成到Web環境;

Caching:緩存,比如用戶登錄后,其用戶信息、擁有的角色/權限不必每次去查,這樣可以提高效率;

Concurrencyshiro支持多線程應用的并發驗證,即如在一個線程中開啟另一個線程,能把權限自動傳播過去;

Testing提供測試支持;

Run As允許一個用戶假裝為另一個用戶(如果他們允許)的身份進行訪問;

Remember Me記住我,這個是非常常見的功能,即一次登錄后,下次再來的話不用登錄了。

?

記住一點,Shiro不會去維護用戶、維護權限;這些需要我們自己去設計/提供;然后通過相應的接口注入給Shiro即可。

?

接下來我們分別從外部和內部來看看Shiro的架構,對于一個好的框架,從外部來看應該具有非常簡單易于使用的API,且API契約明確;從內部來看的話,其應該有一個可擴展的架構,即非常容易插入用戶自定義實現,因為任何框架都不能滿足所有需求。

?

首先,我們從外部來看Shiro吧,即從應用程序角度的來觀察如何使用Shiro完成工作。如下圖:

?

可以看到:應用代碼直接交互的對象是Subject,也就是說Shiro的對外API核心就是Subject;其每個API的含義:

Subject主體,代表了當前“用戶”,這個用戶不一定是一個具體的人,與當前應用交互的任何東西都是Subject,如網絡爬蟲,機器人等;即一個抽象概念;所有Subject都綁定到SecurityManager,與Subject的所有交互都會委托給SecurityManager;可以把Subject認為是一個門面;SecurityManager才是實際的執行者;

SecurityManager安全管理器;即所有與安全有關的操作都會與SecurityManager交互;且它管理著所有Subject;可以看出它是Shiro的核心,它負責與后邊介紹的其他組件進行交互,如果學習過SpringMVC,你可以把它看成DispatcherServlet前端控制器;

Realm域,Shiro從從Realm獲取安全數據(如用戶、角色、權限),就是說SecurityManager要驗證用戶身份,那么它需要從Realm獲取相應的用戶進行比較以確定用戶身份是否合法;也需要從Realm得到用戶相應的角色/權限進行驗證用戶是否能進行操作;可以把Realm看成DataSource,即安全數據源。

?

也就是說對于我們而言,最簡單的一個Shiro應用:

1、應用代碼通過Subject來進行認證和授權,而Subject又委托給SecurityManager;

2、我們需要給Shiro的SecurityManager注入Realm,從而讓SecurityManager能得到合法的用戶及其權限進行判斷。

?

從以上也可以看出,Shiro不提供維護用戶/權限,而是通過Realm讓開發人員自己注入。

?

接下來我們來從Shiro內部來看下Shiro的架構,如下圖所示:


??

Subject主體,可以看到主體可以是任何可以與應用交互的“用戶”;

SecurityManager相當于SpringMVC中的DispatcherServlet或者Struts2中的FilterDispatcher;是Shiro的心臟;所有具體的交互都通過SecurityManager進行控制;它管理著所有Subject、且負責進行認證和授權、及會話、緩存的管理。

Authenticator認證器,負責主體認證的,這是一個擴展點,如果用戶覺得Shiro默認的不好,可以自定義實現;其需要認證策略(Authentication Strategy),即什么情況下算用戶認證通過了;

Authrizer授權器,或者訪問控制器,用來決定主體是否有權限進行相應的操作;即控制著用戶能訪問應用中的哪些功能;

Realm可以有1個或多個Realm,可以認為是安全實體數據源,即用于獲取安全實體的;可以是JDBC實現,也可以是LDAP實現,或者內存實現等等;由用戶提供;注意:Shiro不知道你的用戶/權限存儲在哪及以何種格式存儲;所以我們一般在應用中都需要實現自己的Realm;

SessionManager如果寫過Servlet就應該知道Session的概念,Session呢需要有人去管理它的生命周期,這個組件就是SessionManager;而Shiro并不僅僅可以用在Web環境,也可以用在如普通的JavaSE環境、EJB等環境;所有呢,Shiro就抽象了一個自己的Session來管理主體與應用之間交互的數據;這樣的話,比如我們在Web環境用,剛開始是一臺Web服務器;接著又上了臺EJB服務器;這時想把兩臺服務器的會話數據放到一個地方,這個時候就可以實現自己的分布式會話(如把數據放到Memcached服務器);

SessionDAODAO大家都用過,數據訪問對象,用于會話的CRUD,比如我們想把Session保存到數據庫,那么可以實現自己的SessionDAO,通過如JDBC寫到數據庫;比如想把Session放到Memcached中,可以實現自己的Memcached SessionDAO;另外SessionDAO中可以使用Cache進行緩存,以提高性能;

CacheManager緩存控制器,來管理如用戶、角色、權限等的緩存的;因為這些數據基本上很少去改變,放到緩存中后可以提高訪問的性能

Cryptography密碼模塊,Shiro提高了一些常見的加密組件用于如密碼加密/解密的。

轉載于:https://my.oschina.net/u/3234821/blog/1823953

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

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

相關文章

2019.04.24筆記

*)關于swing 今天同學誤解了我的意思,以為我要用java代碼做頁面和圖形,給我推薦了swing。 swing真是眼熟,大學課程里的。通過后臺代碼操作頁面和圖形。記得當年大學時,swing就已經淪為一種過時的技術了。到現在&#x…

Teams 的 Meeting App

Teams 的 Meeting App 已經正式推出了一段時間,相應的文檔也已經較為完善了,我接下來會寫一系列的文章,來介紹如何開發一個自己的Meeting app。這篇文章作為這個系列的第一篇,將介紹 meeting app 是如何被使用的,有哪些…

Github上最受歡迎的Python輕量級框架Flask入門

flask最近終于發布了它的1.0版本更新,從項目開源到最近的1.0版本flask已經走過了8個年頭。# app.py from flask import Flask app Flask(__name__)app.route("/") def hello():return "Hello World!"if __name__ "__main__":app.ru…

mysql表關聯

mysql的表關聯: left join(左聯接) 返回包括左表中的所有記錄和右表中聯結字段相等的記錄 right join(右聯接) 返回包括右表中的所有記錄和左表中聯結字段相等的記錄 inner join(等值連接) 只返回兩個表中聯結字段相等的行 轉載于:https://www.cnblogs.com/bloghua…

開發第一個Meeting App

今天我們來看一下如何使用c# net6 來開發一個 teams的 meeting app。首先先確保本地安裝了最新版本的 net6。創建一個目錄,然后在目錄下輸入下面的命令行,讓 dotnet 來生成一個初步的asp.net core 代碼框架。 dotnet new razor代碼框架生成如下的目錄和…

solrCloud搭建

一.什么是solrCloud? SolrCoud(solr云)是solr提供的分布式搜索方案。當一個系統搜索請求并發很高的時候,就需要使用solrCloud來滿足這些需求 solrCloud是基于solr和zookeeper的分布式的搜索方案,它的主要思想是使用zookeeper作為擠集群配置的…

Linux 添加新用戶賬號并賦予root權限

除了root用戶之外,通常需要為每個管理創建各自的用戶賬號,方便每個管理員登錄使用, 步驟如下: 1. 添加新用戶賬號 useradd mary.lee 2. 為新用戶賬號設置密碼 passwd mary.lee 3. 為新用戶賬號賦予root權限 usermod -a -G root…

如何獲取 Teams Meeting 的上下文信息

我們上一篇文章講了如果使用 net6 和 c# 來快速開發一個最簡單的 teams meeting app。為了讓大家比較容易理解,上個sample非常簡單,簡單到沒有什么功能,那我們現在就來慢慢擴展這個app的功能:看看如何獲取 meeting 的上下文。 打…

php的運行流程

1、Zend引擎:Zend整體用純C實現,是PHP的內核部分,他將PHP代碼翻譯(詞法、語法解析等一系列編譯過程)為可執行opcode的處理并實現相應的處理方法、實現了基本的數據結構(如:hashtable、OO&#x…

內置方法

isinstance(obj,cls)和issubclass(sub,super) isinstance(obj,cls)檢查是否obj是否是類 cls 的對象 class Foo(object):pass obj Foo() isinstance(obj, Foo) issubclass(sub, super)檢查sub類是否是 super 類的派生類 class Foo(object):pass class Bar(Foo):pass issubclass…

會議中的Meeting App

接著我們上兩篇博客文章,我們說了如何開發會議前和會議后的 meeting app,那如何開發一個會議中的 app 呢,實際上比較簡單,我們只需要在 tab 的配置項中勾選下面這兩個選項即可。 勾選后,我們安裝app到我們的一個會議中…

0-2歲的app開發人員必讀,Android開發APP前的準備事項

2019獨角獸企業重金招聘Python工程師標準>>> 隨著移動互聯網的興起,各行各業對移動應用的需求越來越大,從事APP開發的人也越來越多,APP開發行業可以說是方興未艾。APP開發是比較復雜的事情,涉及產品、美工設計、服務器…

FixedThreadPool吞掉了異常

為了方便遍描述問題,如下是簡化后的 public class RunException {public static void main(String[] args) { ExecutorService readerPool Executors.newFixedThreadPool(3); readerPool.submit(new Runnable() { public void run() { throw new RuntimeException(…

Teams Meeting App的 task 彈出框

前幾篇文章我們介紹了 Teams Meeting App 的各種類型和如何從無到有的使用 net6 和 c# 來開發一個 Teams Meeting app,那今天我們開始討論一些 meeting app 的高級互動: task 彈出框。我們先來快速修改一下之前的代碼,看看什么是 task 彈出框…

react 學習

react官網地址:http://facebook.github.io/react/ webpack官網地址:http://webpack.js.org/ 英文 https://www.webpackjs.com/ 中文 參考資料: React 入門實例教程-阮一峰 webpack的學習 學習列表: 了解react的語法&#x…

如何獲取Teams Meeting 詳情

最近有一些朋友問我,有沒有可能獲取到會議的詳情,我搜索了目前所有的 teams 文檔,發現有一個api可以獲取,不過在我寫這篇文章的時候,這個 api 還在 preview 階段,可能在正式發布前,還會有一些變…

C++ : 內聯函數和引用變量

一.內聯函數 內聯函數和普通函數的使用方法沒有本質區別&#xff0c;我們來看一個例子&#xff0c;下面展示了內聯函數的使用方法&#xff1a; #include <iostream> using namespace std; //下面展示內聯函數的使用 inline double square(double x) {return (x*x);} int…

Teams Meeting 實時事件通知

Microsoft Teams最近推出了很多新的功能和api&#xff0c;我們今天就來一起看一下 teams 會議的實時事件通知&#xff0c;我覺得有了這個功能&#xff0c;我們的app&#xff0c;我們的bot又可以有很多可以實現的場景了。 我們來看看如何在 c# 里處理會議開始和結束這兩個事件。…

error記錄 | 不能將參數 1 從“const char [5]”轉換為“LPCTSTR

Windows使用兩種字符集ANSI和UNICODE&#xff0c;前者就是通常使用的單字節方式&#xff0c;但這種方式處理象中文這樣的雙字節字符不方便&#xff0c;容易出現半個漢字的情況。而后者是雙字節方式&#xff0c;方便處理雙字節字符。Windows NT的所有與字符有關的函數都提供兩…

JMM 學習筆記

并發編程的模型 并發編程需要解決的兩個問題&#xff1a;線程之間如何同步&#xff0c;線程之間如何通信。 線程之間通信&#xff1a;共享內存&#xff0c;消息傳遞。 共享內存通過線程之間讀-寫程序的公共狀態進行通信。消息傳遞要通過線程之間主動傳遞消息進行通信。 線程之間…