【Shiro】03 ini認證實現
阿新 • • 發佈:2020-08-01
【基本概念】
1、身份驗證
即在應用中誰能證明他就是他本人。
一般提供如他們的身份ID 一些標識資訊來表明他就是他本人,如提供身份證,使用者名稱/密碼來證明。
在 shiro 中,使用者需要提供principals (身份)和credentials(證明)給shiro,從而應用能驗證使用者身份:
2、身份principals 【/'prɪnsəpl】
身份,即主體的標識屬性,可以是任何東西,如使用者名稱、郵箱等,唯一即可。
一個主體可以有多個principals,但只有一個Primary principals,一般是使用者名稱/密碼/手機號。
3、憑證credentials 【/krə'dɛnʃlz/】
證明/憑證,即只有主體知道的安全值,如密碼/數字證書等。
最常見的principals和credentials組合就是使用者名稱/密碼了。
【認證流程】
新建一個Maven工程,如果後續功能很多,我們可以刪除主工程的SRC目錄
再新建一個一個模組來開發學習。
需要的依賴包的座標:
<dependencies> <!-- https://mvnrepository.com/artifact/org.apache.shiro/shiro-core --> <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-core</artifactId> <version>1.5.3</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-simple</artifactId> <version>1.7.21</version> <scope>test</scope> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>jcl-over-slf4j</artifactId> <version>1.7.21</version> <scope>test</scope> </dependency> </dependencies>
日誌配置檔案:
log4j.properties
# Global logging configuration log4j.rootLogger=DEBUG, stdout # MyBatis logging configuration... log4j.logger.org.mybatis.example.BlogMapper=TRACE # Console output... log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
認證資訊配置:
shiro.ini
#配置使用者 [users]admin=123456user=123456
存放位置:
編寫測試類:
程式碼中的使用者資訊即表示我們的目標主體的資訊
我們使用資訊生成令牌進行登陸,對安全管理器載入好的ini認證資訊進行核對
import org.apache.shiro.SecurityUtils; import org.apache.shiro.authc.AuthenticationToken; import org.apache.shiro.authc.UsernamePasswordToken; import org.apache.shiro.mgt.DefaultSecurityManager; import org.apache.shiro.realm.text.IniRealm; import org.apache.shiro.subject.Subject; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * @author DaiZhiZhou * @file Shiro * @create 2020-08-01 16:47 */ public class AuthenticationTest { // 日誌輸出工具 private static final transient Logger log = LoggerFactory.getLogger(AuthenticationTest.class); @SuppressWarnings("deprecation") public static void main(String[] args) { String username = "admin"; String password = "123456"; log.info("My First Apache Shiro Application"); // 新版已經擯棄了工廠模式建立物件,直接使用DefaultSecurityManager建立例項 DefaultSecurityManager defaultSecurityManager = new DefaultSecurityManager(); // 認證配置資訊單獨由IniRealm建立載入 IniRealm iniRealm = new IniRealm("classpath:shiro.ini"); // 在安全管理器中註冊認證 defaultSecurityManager.setRealm(iniRealm); // 在安全工具類中設定安全管理器 SecurityUtils.setSecurityManager(defaultSecurityManager); // 得到目標主體 Subject subject = SecurityUtils.getSubject(); // 建立令牌例項 AuthenticationToken userToken = new UsernamePasswordToken(username, password); try { // 主體攜帶令牌登陸 subject.login(userToken); } catch (Exception exception) { exception.printStackTrace(); } Subject subject2 = SecurityUtils.getSubject(); aaaa(); System.out.println(subject == subject2); } public static void quickStart(){ // 1,建立安全管理器的工廠物件 org.apache.shiro.mgt.SecurityManager; 不能使用java.lang.SecurityManager //Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:shiro.ini"); // 2,使用工廠建立安全管理器 //SecurityManager securityManager = factory.getInstance(); // 3,把當前的安全管理器綁定當到線的執行緒 //SecurityUtils.setSecurityManager(securityManager); // 4,使用SecurityUtils.getSubject得到主體物件 //Subject subject = SecurityUtils.getSubject(); // 5,封裝使用者名稱和密碼 //AuthenticationToken token = new UsernamePasswordToken(username, password); // 6,得到認證 //try { // subject.login(token); // System.out.println("認證通過"); //} catch (AuthenticationException e) { // System.out.println("使用者名稱或密碼不正確"); //} /*} catch (IncorrectCredentialsException e) { System.out.println("密碼不正確"); } catch (UnknownAccountException e) { System.out.println("使用者名稱不存在"); }*/ //Subject subject2 = SecurityUtils.getSubject(); //System.out.println(subject); //System.out.println(subject2); //aaaa(); } public static void aaaa() { Subject subject2 = SecurityUtils.getSubject(); System.out.println(subject2); } }