shiro subject.getprincipal()为null_(变强、变秃)Java从零开始之Shiro安全框架
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)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: BugkuCTF-Misc:隐写2
- 下一篇: java美元兑换,(Java实现) 美元