1. 程式人生 > 實用技巧 >【Shiro】03 ini認證實現

【Shiro】03 ini認證實現

【基本概念】

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);
    }
}