日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

shiro初步学习

發布時間:2023/12/3 编程问答 55 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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,注意對象名大小寫。

[main] securityManager.屬性=值 key=value securityManager.對象屬性=com.bjsxt.pojo.People #后面值是字符串 peo=com.bjsxt.pojo.People securityManager.對象屬性=$peo #出現$時才表示是引用對象

2 [users]

定義用戶,密碼及用戶可以具有的角色.

[users] 用戶名=密碼,角色1,角色2 #角色部分可以省略. zhangsan=zs zhangsan=zs,role1,role2

3 [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:表示必須存在用戶。

[urls] 控制器名稱=過濾器名稱 /login=authc /**=anon

四、 Shiro環境搭建及認證實現

1 認證流程
獲取主體,通過主體Subject對象的login方法進行登錄
把Subject中內容傳遞給Security Manager
Security Manager內部組件Authenticator進行認證,
認證數據使用InI Realm,調用Ini文件中數據.

2 名詞解釋

Principal: 身份。用戶名,郵箱,手機等能夠唯一確認身份的信息.
Credential: 憑證,代表密碼等。
AuthenticationInfo:認證時存儲認證信息。

五、 第一個Shiro演示

Shiro是不依賴于容器的,所以建立一個普通的Maven項目就可以。
1 添加依賴

<dependencies><dependency><groupId>org.apache.shiro</groupId><artifactId>shiro-core</artifactId><version>1.4.2</version></dependency><dependency><groupId>commons-logging</groupId><artifactId>commons-logging</artifactId><version>1.2</version></dependency> </dependencies>

2 新建配置文件
在resources下新建shiro.ini,文件名稱任意,擴展名必須是ini。

[users] zhangsan=zs lisi=ls

3 新建測試類
新建com.bjsxt.ShiroRun。

public class ShiroRun {public static void main(String[] args) {Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:shiro.ini");SecurityManager securityManager = factory.getInstance();SecurityUtils.setSecurityManager(securityManager);Subject subject = SecurityUtils.getSubject();//web項目時,用戶名和密碼是客戶端表單傳遞過來的用戶名和密碼。AuthenticationToken token = new UsernamePasswordToken("admin", "pwd");try {//login()方法沒有返回值,只能通過是否有異常判斷是否登錄成功。subject.login(token);System.out.println("登錄成功");} catch (UnknownAccountException e) {System.out.println("賬號不存在");} catch (IncorrectCredentialsException e) {System.out.println("密碼錯誤");} catch (AuthenticationException e) {e.printStackTrace();}} }

六、 授權

1 判斷角色

1.1 修改配置文件
直接在密碼后面添加用戶包含的角色名即可。

[users] zhangsan=zs,role1,role2 lisi=ls

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,permission2

2.2 添加測試代碼
通過是否出現AuthenticationException異常控制是否有指定權限。

SecurityUtils.getSubject().checkPermission("permission");

七、 加密及憑證匹配器

在實際開發中數據庫中一些敏感信息經常會被加密存儲。如:用戶密碼等。
Shiro框架內嵌了很多加密算法。如MD5等。使用Shiro框架時可以很方便的實現加密功能。

String password = "smallming"; //md5加密 Md5Hash md5Hash = new Md5Hash(password); System.out.println(md5Hash.toHex()); //帶鹽的MD5加密。鹽就是在原有字符串后面拼接鹽形成新的字符串,然后加密。 Md5Hash md5Hash2 = new Md5Hash(password, "bjsxt"); System.out.println(md5Hash2); //無論是否加鹽都可以很容易的被破解,可以多次迭代加密保證數據安全性。 //第三個參數表示迭代加密次數 Md5Hash md5Hash3 = new Md5Hash(password, "bjsxt", 2); System.out.println(md5Hash3);//使用Md5的父類也也實現 SimpleHash simpleHash = new SimpleHash("md5",password,"bjsxt",2); System.out.println(simpleHash);

八、 自定義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=$myrealm

3 測試結果

在ShiroRun中修改用戶名和密碼,當用戶名和密碼為admin、pwd時可以正常登錄。
此時無論shiro.ini是否配置了[users],都按照Realm中配置的邏輯進行比較用戶名和密碼。

九、 憑證匹配器

在實際應用中數據庫密碼都是加密的。Shiro內置了憑證匹配器,通過簡單配置就可以實現明文數據和數據庫中加密數據匹配的效果。

1 修改自定義Realm

AuthenticationInfo 的構造方法由三個參數變成四個參數的。新增第三個參數表示加鹽。
一般都是拿用戶數據的id作為鹽。

//密碼必須是MD5加密后的密碼 String password= "7614fd642608ca0755b78d2b2c352e19"; //假設id是從數據庫中取出的id Long id = 123L; //第三個參數是加密的鹽 AuthenticationInfo info = new SimpleAuthenticationInfo(token.getPrincipal(), password, ByteSource.Util.bytes(id+"") ,token.getPrincipal().toString());

2 修改配置文件
在配置文件中配置憑證匹配器配置。

[main] md5CredentialsMatcher=org.apache.shiro.authc.credential.Md5CredentialsMatcher md5CredentialsMatcher.hashIterations=2myrealm=com.bjsxt.shiro.MyRealm myrealm.credentialsMatcher=$md5CredentialsMatcher securityManager.realms=$myrealm

總結

以上是生活随笔為你收集整理的shiro初步学习的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。