Subject 認證主體
Subject認證主體包含兩個信息
- Principals : 身份,可以是用戶名、郵箱、手機號等,用來標識一個登錄主體身份。
- Credentials : 憑證,常見有密碼,數字證書。
Realm
Realm 意思是域,Shiro 從 Realm 中獲取驗證數據。
Realm 有很多種類,常見的有 jdbc realm , jndi realm , text realm
重點看下jdbc realm的使用。
- 新建數據庫 db_shiro
- 新建 users 表,表名只能是 users
- users 中有三個字段,id , userName , password ,名稱固定。
- 新建 jdbc_realm.ini 文件,內容如下:
[main] jdbcRealm=org.apache.shiro.realm.jdbc.JdbcRealm dataSource=com.mchange.v2.c3p0.ComboPooledDataSource dataSource.driverClass=com.mysql.jdbc.Driver dataSource.jdbcUrl=jdbc:mysql://localhost:3306/db_shiro dataSource.user=root dataSource.password=123qwe jdbcRealm.dataSource=$dataSource securityManager.realms=$jdbcRealm
securityManager.realms :設置realms,可以有多個,用逗號隔開
- 新建測試類,代碼如下:
package com.zhen.shiro; import org.apache.shiro.SecurityUtils; import org.apache.shiro.authc.AuthenticationException; 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.apache.shiro.util.Factory; public class JdbcRealmTest { public static void main(String[] args) { //讀取配置文件,初始化SecurityManager工廠 Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:jdbc_realm.ini"); //獲取securityManager實例 SecurityManager securityManager = factory.getInstance(); //把securityManager綁定到SecurityUtils SecurityUtils.setSecurityManager(securityManager); //獲取當前用戶 Subject currentUser = SecurityUtils.getSubject(); //創建token令牌,用戶名/密碼 UsernamePasswordToken token = new UsernamePasswordToken("zhen", "123"); try { //身份認證 currentUser.login(token); System.out.println("身份認證成功!"); } catch (AuthenticationException e) { e.printStackTrace(); System.out.println("身份認證失敗!"); } //退出 currentUser.logout(); } }