1. 程式人生 > >Shiro學習筆記(一)--- 認證與授權

Shiro學習筆記(一)--- 認證與授權

一、簡介

Apache Shiro是一個強大且易用的Java安全框架,執行身份驗證、授權、密碼和會話管理。使用Shiro的易於理解的API,您可以快速、輕鬆地獲得任何應用程式,從最小的移動應用程式到最大的網路和企業應用程式。

主要功能

三個核心元件:Subject, SecurityManager 和 Realms.

       Subject即“當前操作使用者”。但是,在Shiro中,Subject這一概念並不僅僅指人,也可以是第三方程序、後臺帳戶(Daemon Account)或其他類似事物。它僅僅意味著“當前跟軟體互動的東西”。但考慮到大多數目的和用途,你可以把它認為是Shiro的“使用者”概念。
  Subject代表了當前使用者的安全操作,SecurityManager則管理所有使用者的安全操作。
  SecurityManager

:它是Shiro框架的核心,典型的Facade模式,Shiro通過SecurityManager來管理內部元件例項,並通過它來提供安全管理的各種服務。
  RealmRealm充當了Shiro與應用安全資料間的“橋樑”或者“聯結器”。也就是說,當對使用者執行認證(登入)和授權(訪問控制)驗證時,Shiro會從應用配置的Realm中查詢使用者及其許可權資訊。
  從這個意義上講,Realm實質上是一個安全相關的DAO:它封裝了資料來源的連線細節,並在需要時將相關資料提供給Shiro。當配置Shiro時,你必須至少指定一個Realm,用於認證和(或)授權。配置多個Realm是可以的,但是至少需要一個。
  Shiro內建了可以連線大量安全資料來源(又名目錄)的Realm,如LDAP、關係資料庫(JDBC)、類似INI的文字配置資源以及屬性檔案等。如果預設的Realm不能滿足需求,你還可以插入代表自定義資料來源的自己的Realm實現。

以上摘抄自百度百科,侵刪,點選跳轉~!

二、maven引入依賴,pom.xml

<dependency>
			<groupId>org.apache.shiro</groupId>
			<artifactId>shiro-core</artifactId>
			<version>1.4.0</version>
		</dependency>

 

三、單元測試編碼

這裡的Realm使用的是simpleRealm,在後面的章節會演示iniRealm,jdbcRealm和自定義的Realm

@RunWith(SpringRunner.class)
@SpringBootTest
public class HqjyShiroApplicationTests {
    SimpleAccountRealm simpleAccountRealm = new SimpleAccountRealm();

    @Before
    public void initUser() {
        // 初始化使用者
        simpleAccountRealm.addAccount("admin", "123456", "user");
    }

    @Test
    public void contextLoads() {
        // 構建DefaultSecurityManager
        DefaultSecurityManager defaultSecurityManager = new DefaultSecurityManager();
        // 設定Realm
        defaultSecurityManager.setRealm(simpleAccountRealm);
        // 設定構建DefaultSecurityManager
        SecurityUtils.setSecurityManager(defaultSecurityManager);


        // 建立驗證物件
        UsernamePasswordToken usernamePasswordToken = new UsernamePasswordToken("admin", "123456");
        // 建立subject物件並提交登陸token請求
        Subject subject = SecurityUtils.getSubject();
        subject.login(usernamePasswordToken);

        System.out.println("驗證是否有許可權:" + subject.isAuthenticated());

        // 驗證使用者是否有user角色,若沒有改許可權會丟擲 UnauthorizedException 異常
        // 同時checkRoles 可以傳多個引數,同時驗證多個角色
        subject.checkRoles("user1");
    }
}