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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

shiro subject.getprincipal()为null_(变强、变秃)Java从零开始之Shiro安全框架

發布時間:2025/3/15 java 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 shiro subject.getprincipal()为null_(变强、变秃)Java从零开始之Shiro安全框架 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Shiro安全框架

一、Shiro簡介

二、Shiro架構圖

三、Shiro涉及常見名詞

四、Shiro配置文件詳解

shiro.ini 文件放在 classpath 下 ,shiro 會自動查找。其中格式是 key/value 鍵值對配置。 INI 配置文件一般適用于用戶少且不需要在運行時動態創建的 情景下使用。 ini 文件中主要配置有四大類: main , users , roles , urls 示例:

1 、 [main] main 主要配置 shiro 的一些對象,例如 securityManager , Realm , authenticator , authcStrategy 等等, , 例如:

2 2 、 [users] [users] 允許你配置一組靜態的用戶,包含用戶名,密碼,角色,一個用戶 可以有多個角色,可以配置多個角色,例如:

3 、 [roles] [roles] 將角色和權限關聯起來,格式為:角色名= = 權限字符串1 1 ,權限字符 串 2…..

4 4 、 [urls] 這部分配置主要在 web 應用中,格式為: url= 攔截器[ [ 參數] ] ,攔截器[ [ 參 數 ]…… ,例如:

五、認證實現

認證:驗證用戶是否合法 在 shiro 中,用戶需要提供 principals (身份)和 credentials (憑證) 給 shiro

5 .1.principals 身份,即主體的標識屬性,可以是任何東西,如用戶名、郵箱等,唯一即可。 例如:用戶名/ / 郵箱/ / 手機號等。 5 5 .2.credentials 憑證,即只有主體知道的安全值,如密碼/ / 數字證書等。 最常見的 principals 和 credentials 組合就是用戶名/ / 密碼了。

5.3 實現步驟 5.3.1 導入jar包 5.3.2 從源碼的示例項目quickstart中拷貝shiro.ini放到src下,并 配置 5.3.3 編寫代碼

package com.sxt.test;?import org.apache.shiro.SecurityUtils;import org.apache.shiro.authc.UsernamePasswordToken;import org.apache.shiro.config.IniSecurityManagerFactory;import org.apache.shiro.mgt.SecurityManager;import org.apache.shiro.subject.Subject;import org.junit.Test;/*** 實現簡單認證* @author Administrator**/public class AuthenticationTest {@Testpublic void testAuthentication(){//1.構建SecurityManager工廠IniSecurityManagerFactory smf = new IniSecurityManagerFactory("classpath:shiro.ini");//2.通過SecurityManager工廠獲取SecurityManager實例SecurityManager sm = smf.getInstance();//3.將securityMananger設置到運行環境中SecurityUtils.setSecurityManager(sm);//4.獲取subject實例Subject sub = SecurityUtils.getSubject();//5.創建用戶名密碼驗證令牌TokenUsernamePasswordToken token = new UsernamePasswordToken("victor","123456");//6.進行身份驗證sub.login(token);System.out.println(sub.isAuthenticated());}}?

六、JDBCRealm

Shiro默認使用自帶的IniRealm,IniRealm從ini配置文件中讀取用戶的信息。 大部分情況下需要從系統的數據庫中讀取用戶信息,所以需要使用 JDBCRealm或自定義Realm。 需求:使用JDBCRealm提供數據源,從而實現認證 實現步驟: 6.1建users表(表名、字段對應上) 6.2添加jar包(數據庫驅動、數據庫連接池、beanutils等) 6.3編寫shiro.ini 6.4編寫測試代碼 【代碼示例】

配置文件shiro.ini

[main]#配置RealmjdbcRealm = org.apache.shiro.realm.jdbc.JdbcRealm?#配置數據源dataSource = com.mchange.v2.c3p0.ComboPooledDataSourcedataSource.driverClass = com.mysql.jdbc.DriverdataSource.jdbcUrl = jdbc:mysql://localhost:3306/projectdataSource.user = rootdataSource.password = 123456?jdbcRealm.dataSource = $dataSource?#將Realm注入給SecurityManagersecurityManager.realm = $jdbcRealm

七、如何自定義Realm

自定義Realm,可以注入給securityManager更加靈活的安全數據源(例如, JDBCRealm中表和字段都限定了) 通過實現Realm接口,或根據需求繼承他的相應子類即可。 需求:使用自定義Realm提供數據源,從而實現認證 實現步驟: 6.1添加jar包 6.2編寫自定義Realm 6.3編寫shiro.ini 6.4編寫測試類 【代碼示例】

[main]#配置RealmmyRealm = com.sxt.realm.MyRealm?#將Realm注入給SecurityManagersecurityManager.realm = $myRealm

自定義realm類繼承 AuthenticatingRealm

package com.sxt.realm;?import java.sql.Connection;import java.sql.DriverManager;import java.sql.ResultSet;import java.sql.SQLException;import java.sql.Statement;?import org.apache.shiro.authc.AuthenticationException;import org.apache.shiro.authc.AuthenticationInfo;import org.apache.shiro.authc.AuthenticationToken;import org.apache.shiro.authc.SimpleAuthenticationInfo;import org.apache.shiro.realm.AuthenticatingRealm;?import com.mysql.jdbc.Driver;?public class MyRealm extends AuthenticatingRealm {?@Overrideprotected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {//使用JDBC,從數據庫獲取數據String principal = null;String credentials = null;ResultSet rs = null;Statement state = null;Connection conn = null;try {//1.注冊驅動Driver driver = new Driver();DriverManager.registerDriver(driver);//2.獲取連接對象String url="jdbc:mysql:///project";String user="root";String password="123456";conn = DriverManager.getConnection(url,user,password);//3.創建操作對象state = conn.createStatement();//4.執行sql語句String sql = "select userName,password from mylogin ";rs = state.executeQuery(sql);//5.處理結果集while(rs.next()){principal = rs.getString("userName");credentials = rs.getString("password");}} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();} finally{try {if(rs!=null){rs.close();}if(conn!=null){conn.close();}if(state!=null){state.close();}} catch (Exception e2) {e2.printStackTrace();}} SimpleAuthenticationInfo sai = new SimpleAuthenticationInfo(principal, credentials, "myRealm");return sai;}}

八、密碼加密實現方案

對稱非對稱比較:

8.3 憑證匹配器

在Realm接口的實現類AuthenticatingRealm中有credentialsMatcher屬性。 意為憑證匹配器。常用來設置加密算法及迭代次數等。

總結

以上是生活随笔為你收集整理的shiro subject.getprincipal()为null_(变强、变秃)Java从零开始之Shiro安全框架的全部內容,希望文章能夠幫你解決所遇到的問題。

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