shiro初步学习
文章目錄
- 一、 Shiro 簡介
- 二、 *Shiro 架構原理*
- 三、 INI文件介紹
- 四、 Shiro環境搭建及認證實現
- 五、 第一個Shiro演示
- 六、 授權
- 七、 加密及憑證匹配器
- 八、 自定義Realm
- 九、 憑證匹配器
一、 Shiro 簡介
1 概述
權限體系在現代軟件應用中有著非常重要的地位。一個應用如果沒有權限體系都會顯著這個系統“特別不安全”,無論是傳統的MIS系統還是互聯網項目出于對業務數據和應用自身的安全,都會設置自己的安全策略。
目前市場上專門的Java權限框架有Apache Shiro 和 Spring Security。相較于Spring Security 來說 Shiro更加老牌,所以就先講解Shiro,在后面的階段中講解Spring Security。學習好Shiro對于以后市場上在出現新型權限框架的學習能帶來很大便利。因為權限的概念是不變的,變得是框架的實現方式。當然了,對于第一次學習權限框架的人來說,相較于權限框架的應用,更難的就是權限方面的概念。
2 Shiro官方解釋
中文:Apache Shiro是一個強大的并且簡單使用的java權限框架.主要應用認證(Authentication),授權(Authorization),cryptography(加密),和Session Manager.Shiro具有簡單易懂的API,使用Shiro可以快速并且簡單的應用到任何應用中,無論是從最小的移動app到最大的企業級web應用都可以使用.
3 核心功能
在Shiro官網首頁上占用了很大的篇幅說明了Shiro的核心功能。
Authentication 認證。如用戶的登錄。
Authorization 授權。用戶是否有權限訪問指定URL等。
Cryptography 密碼學。如密碼的加密。
Session Management Session 管理。
Web Integration Web集成。Shiro不依賴于容器。
二、 Shiro 架構原理
必須會。Shiro學習的重中之重。
1 第一行
第一行中示例出了一些語言。無論是什么語言都需要包含Subject
2 Subject
主體。每個用戶登錄成功后都會對應一個Subject對象,所有用戶信息都存放在Subject中。可以理解:Subject就是Shiro提供的用戶實體類。
3 Security Manager
Shiro最大的容器,此容器中包含了Shiro的絕大多數功能。在非Spring Boot項目中,獲取Security Manager 是編寫代碼的第一步。而在Spring Boot中已經幫助我們自動化配置了。
4 Authenticator
認證器。執行認證過程調用的組件。里面包含了認證策略。
5 Authorizer
授權器。執行授權時調用的組件。
6 Session Manager
Shiro被Web集成后,HttpSession對象會由Shiro的Session Manager進行管理。
7 Cache Manager
緩存管理。Shiro執行很多第三方緩存技術。例如:EHCache等。
8 Session DAO
操作Session內容的組件。
9 Realms
Shiro框架實現權限控制不依賴于數據庫,通過內置數據也可以實現權限控制。但是目前絕大多數應用的數據都存儲在數據庫中,所以Shiro提供了Realms組件,此組件的作用就是訪問數據庫。Shiro內置的訪問數據庫的代碼,通過簡單配置就可以訪問數據庫,也可以自定義Realms實現訪問數據庫邏輯(絕大多數都這么做)
三、 INI文件介紹
INI英文名稱(InitializationFile)
INI文件是Window系統配置文件的擴展名.
Shiro的全局配置文件就是.ini文件,ini中數據都是固定數據,后面會用數據庫中數據替代下面users和roles(固定數據部分)
.ini文件內容的語法和.properties類似都是key=value,value格式.
INI文件中包含了四個部分:
1 [main] 主體部分.
這部分配置類對象,或設置屬性等操作.
內置了根對象:securityManager,注意對象名大小寫。
2 [users]
定義用戶,密碼及用戶可以具有的角色.
[users] 用戶名=密碼,角色1,角色2 #角色部分可以省略. zhangsan=zs zhangsan=zs,role1,role23 [roles]
定于角色具有的權限
[roles] 角色名=權限名,權限名 role1=user:insert,user:update role2=insert,update role3=user:*4 [urls]
定義哪個控制器被哪個過濾器過濾.Shiro內置很多過濾器。此部分主要在WEB應用中使用。
下圖是官網上提供的Shiro內置Filter及名稱。
anon:不認證也可以訪問。例如:/admin/=anon
authc:必須認證。
authcBasic:沒有參數時表示httpBasic認證(客戶端認證方式)。
logout:退出。
noSessionCreation:新增Filter,表示沒有Session創建。
perms:判斷是有具有指定權限。例如:/admin/user/=perms[“per1”,”per2”]。必須同時具有給定權限才可以訪問。如果只有一個權限可以省略雙引號。
port:限制端口。例如:/admin/=port[8081]。只要請求不是8081端口就重新發送URL到8081端口。
rest:請求方式和權限的簡便寫法。例如:/admin/=rest[user],相當于/admin/** = perms[user:方式],方式是http請求的方式:post、get等。
roles:判斷是否具有指定權限。/admin/**=roles[role1]
ssl:表示是安全的請求。協議為https
user:表示必須存在用戶。
四、 Shiro環境搭建及認證實現
1 認證流程
獲取主體,通過主體Subject對象的login方法進行登錄
把Subject中內容傳遞給Security Manager
Security Manager內部組件Authenticator進行認證,
認證數據使用InI Realm,調用Ini文件中數據.
2 名詞解釋
Principal: 身份。用戶名,郵箱,手機等能夠唯一確認身份的信息.
Credential: 憑證,代表密碼等。
AuthenticationInfo:認證時存儲認證信息。
五、 第一個Shiro演示
Shiro是不依賴于容器的,所以建立一個普通的Maven項目就可以。
1 添加依賴
2 新建配置文件
在resources下新建shiro.ini,文件名稱任意,擴展名必須是ini。
3 新建測試類
新建com.bjsxt.ShiroRun。
六、 授權
1 判斷角色
1.1 修改配置文件
直接在密碼后面添加用戶包含的角色名即可。
1.2 添加代碼
hasRole()通過返回值判斷用戶是否具有指定角色。
boolean hasRoleResult = SecurityUtils.getSubject().hasRole("role1"); System.out.println("result:"+hasRoleResult);2 判斷權限
2.1 修改配置文件
[users] zhangsan=zs,role1,role2 lisi=ls [roles] role1=permission1,permission22.2 添加測試代碼
通過是否出現AuthenticationException異常控制是否有指定權限。
七、 加密及憑證匹配器
在實際開發中數據庫中一些敏感信息經常會被加密存儲。如:用戶密碼等。
Shiro框架內嵌了很多加密算法。如MD5等。使用Shiro框架時可以很方便的實現加密功能。
八、 自定義Realm
ShiroRun 代碼不需要做任何變化。
1 自定義Realm類
在項目中新建com.bjsxt.realm.MyRealm
public class MyRealm extends AuthenticatingRealm {@Overrideprotected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {System.out.println("執行認證");//用戶名String username = token.getPrincipal().toString();//密碼String pwd = new String((char[])token.getCredentials());System.out.println(username+" "+pwd);//先從數據庫查詢select * from user where username=? 查看用戶名是否存在if(username.equals("admin")){//假設用戶名為admin時能從數據庫中查詢出來//根據之前查詢出來的用戶信息獲取密碼。假設查詢出來的密碼是pwdString password= "pwd";//此處需要注意,第二個參數是從數據庫查詢出來的密碼,而不是傳遞過來的密碼。//第三個參數自定義。但是盡量不重復了。常直接使用用戶名當做realname名字。AuthenticationInfo info = new SimpleAuthenticationInfo(token.getPrincipal(),password,"realmname");//shiro會判斷從數據庫查詢出來的密碼和客戶端傳遞過來的密碼是否一致。return info;}//返回null說明用戶名不存在。return null;} }2 修改配置文件
在配置文件中添加下面內容
[main] myrealm=com.bjsxt.realm.MyRealm securityManager.realms=$myrealm3 測試結果
在ShiroRun中修改用戶名和密碼,當用戶名和密碼為admin、pwd時可以正常登錄。
此時無論shiro.ini是否配置了[users],都按照Realm中配置的邏輯進行比較用戶名和密碼。
九、 憑證匹配器
在實際應用中數據庫密碼都是加密的。Shiro內置了憑證匹配器,通過簡單配置就可以實現明文數據和數據庫中加密數據匹配的效果。
1 修改自定義Realm
AuthenticationInfo 的構造方法由三個參數變成四個參數的。新增第三個參數表示加鹽。
一般都是拿用戶數據的id作為鹽。
2 修改配置文件
在配置文件中配置憑證匹配器配置。
總結
- 上一篇: 试题让电脑崩溃如何让电脑崩溃
- 下一篇: 文件的上传和下载