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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > java >内容正文

java

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

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

Shiro安全框架

一、Shiro簡(jiǎn)介

二、Shiro架構(gòu)圖

三、Shiro涉及常見名詞

四、Shiro配置文件詳解

shiro.ini 文件放在 classpath 下 ,shiro 會(huì)自動(dòng)查找。其中格式是 key/value 鍵值對(duì)配置。 INI 配置文件一般適用于用戶少且不需要在運(yùn)行時(shí)動(dòng)態(tài)創(chuàng)建的 情景下使用。 ini 文件中主要配置有四大類: main , users , roles , urls 示例:

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

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

3 、 [roles] [roles] 將角色和權(quán)限關(guān)聯(lián)起來,格式為:角色名= = 權(quán)限字符串1 1 ,權(quán)限字符 串 2…..

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

五、認(rèn)證實(shí)現(xiàn)

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

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

5.3 實(shí)現(xiàn)步驟 5.3.1 導(dǎo)入jar包 5.3.2 從源碼的示例項(xiàng)目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;/*** 實(shí)現(xiàn)簡(jiǎn)單認(rèn)證* @author Administrator**/public class AuthenticationTest {@Testpublic void testAuthentication(){//1.構(gòu)建SecurityManager工廠IniSecurityManagerFactory smf = new IniSecurityManagerFactory("classpath:shiro.ini");//2.通過SecurityManager工廠獲取SecurityManager實(shí)例SecurityManager sm = smf.getInstance();//3.將securityMananger設(shè)置到運(yùn)行環(huán)境中SecurityUtils.setSecurityManager(sm);//4.獲取subject實(shí)例Subject sub = SecurityUtils.getSubject();//5.創(chuàng)建用戶名密碼驗(yàn)證令牌TokenUsernamePasswordToken token = new UsernamePasswordToken("victor","123456");//6.進(jìn)行身份驗(yàn)證sub.login(token);System.out.println(sub.isAuthenticated());}}?

六、JDBCRealm

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

配置文件shiro.ini

[main]#配置RealmjdbcRealm = org.apache.shiro.realm.jdbc.JdbcRealm?#配置數(shù)據(jù)源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更加靈活的安全數(shù)據(jù)源(例如, JDBCRealm中表和字段都限定了) 通過實(shí)現(xiàn)Realm接口,或根據(jù)需求繼承他的相應(yīng)子類即可。 需求:使用自定義Realm提供數(shù)據(jù)源,從而實(shí)現(xiàn)認(rèn)證 實(shí)現(xiàn)步驟: 6.1添加jar包 6.2編寫自定義Realm 6.3編寫shiro.ini 6.4編寫測(cè)試類 【代碼示例】

[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,從數(shù)據(jù)庫(kù)獲取數(shù)據(jù)String principal = null;String credentials = null;ResultSet rs = null;Statement state = null;Connection conn = null;try {//1.注冊(cè)驅(qū)動(dòng)Driver driver = new Driver();DriverManager.registerDriver(driver);//2.獲取連接對(duì)象String url="jdbc:mysql:///project";String user="root";String password="123456";conn = DriverManager.getConnection(url,user,password);//3.創(chuàng)建操作對(duì)象state = conn.createStatement();//4.執(zhí)行sql語句String sql = "select userName,password from mylogin ";rs = state.executeQuery(sql);//5.處理結(jié)果集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;}}

八、密碼加密實(shí)現(xiàn)方案

對(duì)稱非對(duì)稱比較:

8.3 憑證匹配器

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

總結(jié)

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

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。