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安全框架的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: BugkuCTF-Misc:隐写2
- 下一篇: java session 生命周期_Ja