1. 程式人生 > >shiro許可權框架簡單入門demo

shiro許可權框架簡單入門demo

shiro和spring security都是開源的許可權框架,shiro相對於spring security來說更簡單學習成本更低,並且提供的API也明瞭,下面是shiro官方的一個圖:

這裡寫圖片描述

  • 其中把上面的東西抽象出來主要分為幾個塊(網上找的文件摳出來的):

1.Subject

Subject即主體,外部應用與subject進行互動,subject記錄了當前操作使用者,將使用者的概念理解為當前操作的主體,可能是一個通過瀏覽器請求的使用者,也可能是一個執行的程式。 Subject在shiro中是一個介面,介面中定義了很多認證授相關的方法,外部程式通過subject進行認證授,而subject是通過SecurityManager安全管理器進行認證授權

2.SecurityManager

SecurityManager即安全管理器,對全部的subject進行安全管理,它是shiro的核心,負責對所有的subject進行安全管理。通過SecurityManager可以完成subject的認證、授權等,實質上SecurityManager是通過Authenticator進行認證,通過Authorizer進行授權,通過SessionManager進行會話管理等。

SecurityManager是一個介面,繼承了Authenticator, Authorizer, SessionManager這三個介面。

3.Authenticator

Authenticator即認證器,對使用者身份進行認證,Authenticator是一個介面,shiro提供ModularRealmAuthenticator實現類,通過ModularRealmAuthenticator基本上可以滿足大多數需求,也可以自定義認證器。

4.Authorizer

Authorizer即授權器,使用者通過認證器認證通過,在訪問功能時需要通過授權器判斷使用者是否有此功能的操作許可權。

5.realm

Realm即領域,相當於datasource資料來源,securityManager進行安全認證需要通過Realm獲取使用者許可權資料,比如:如果使用者身份資料在資料庫那麼realm就需要從資料庫獲取使用者身份資訊。

注意:不要把realm理解成只是從資料來源取資料,在realm中還有認證授權校驗的相關的程式碼。

6.sessionManager

sessionManager即會話管理,shiro框架定義了一套會話管理,它不依賴web容器的session,所以shiro可以使用在非web應用上,也可以將分散式應用的會話集中在一點管理,此特性可使它實現單點登入。

7.SessionDAO

SessionDAO即會話dao,是對session會話操作的一套介面,比如要將session儲存到資料庫,可以通過jdbc將會話儲存到資料庫。

8.CacheManager

CacheManager即快取管理,將使用者許可權資料儲存在快取,這樣可以提高效能。

9.Cryptography

Cryptography即密碼管理,shiro提供了一套加密/解密的元件,方便開發。比如提供常用的雜湊、加/解密等功能。

  • 下面來一個小demo:

結構如下:

這裡寫圖片描述

User類:

用於封裝使用者的資訊

    private String username;
    private String password;
    private String salt;
    private List<String> permis;

自定義的Realm:

其中,認證和授權都是在realm中實現的,我們需要繼承AuthorizingRealm抽象類並且實現裡面的doGetAuthenticationInfo(認證方法)、doGetAuthorizationInfo(授權方法)即可,其中當我們認證的時候會呼叫subject的login方法,會發現最後執行的認證方法是這個:this.authenticator.authenticate(token)

這裡寫圖片描述

而authenticator在原始碼中在構造方法初始化是:this.authenticator = new ModularRealmAuthenticator();

這裡寫圖片描述

所以最後呼叫的是ModularRealmAuthenticator的authenticate這個方法,其中authenticate是屬於父類的AbstractAuthenticator的一個方法,所以跳到AbstractAuthenticator的authenticate方法:

這裡寫圖片描述

認證就會去執行doAuthenticate(token)方法,其中先會判斷使用者是否存在,如果不存在(為null)會丟擲:org.apache.shiro.authc.UnknownAccountException異常
如果存在但是憑證不匹配會丟擲:
org.apache.shiro.authc.IncorrectCredentialsException異常

授權也是一樣,如果沒被授權會丟擲:
org.apache.shiro.authc.IncorrectCredentialsException異常

public class MyRealm extends AuthorizingRealm {


    /**
     * 用於認證
     *
     * @param authenticationToken
     * @return
     * @throws AuthenticationException
     */
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {

        // 取出登入使用者名稱字
        String username = (String) authenticationToken.getPrincipal();

        // 根據名字查詢資料庫得到密碼
        User user = getPassword(username);

        // 如果查詢為空就返回空 丟擲org.apache.shiro.authc.UnknownAccountException
        if (null == user) {
            return null;
        }

        // 查詢到就組裝資訊返回 密碼錯誤丟擲:org.apache.shiro.authc.IncorrectCredentialsException
        SimpleAuthenticationInfo info = new SimpleAuthenticationInfo(user, user.getPassword(), ByteSource.Util.bytes(user.getSalt()), this.getClass().getName());

        return info;
    }

    /**
     * 用於授權
     *
     * @param principalCollection
     * @return
     */
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {

        // 取出身份資訊
        User user = (User) principalCollection.getPrimaryPrincipal();

        // 查詢資料庫獲取該使用者的許可權資訊
        List<String> permiss = getPermiss(user.getUsername());

        // 組裝授權資訊 沒有許可權丟擲:org.apache.shiro.authc.IncorrectCredentialsException
        SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();

        info.addStringPermissions(permiss);

        return info;
    }

    /**
     * 模擬資料庫查詢認證資訊
     *
     * @param username
     * @return
     */
    private User getPassword(String username) {
        User user = new User();
        user.setUsername(username);
        user.setPassword("749d3c663c547ddf1ec5f7a39a7cef19");
        user.setSalt("salt1");
        return user;
    }


    /**
     * 模擬資料庫查詢授權資訊
     *
     * @param username
     * @return
     */
    private List<String> getPermiss(String username) {
        List<String> permis = new ArrayList<String>();
        permis.add("user:create");
        permis.add("user:query");
        return permis;
    }

}

主方法Bootstrap:

主要做測試用

public class MyBootstrap {
    public static void main(String[] args) {

        // 使用者輸入的賬號密碼
        String username = "lijie";
        String password = "111111";

        // 建立SecurityManager工廠
        Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:realm.ini");

        // 建立SecurityManager
        SecurityManager securityManager = factory.getInstance();

        // 將SecurityManager設定到系統執行環境
        SecurityUtils.setSecurityManager(securityManager);

        // 建立subject
        Subject subject = SecurityUtils.getSubject();

        // 建立token
        UsernamePasswordToken token = new UsernamePasswordToken(username, password);

        // 認證
        try {
            subject.login(token);
        } catch (AuthenticationException e) {
            e.printStackTrace();
        }

        System.out.println("認證是否成功--> " + subject.isAuthenticated());

        boolean permitted = subject.isPermitted("user:create1");

        System.out.println("是否被授權--> " + permitted);
    }
}

realm.ini 檔案:

以後會用spring配置

[main]
credentialsMatcher=org.apache.shiro.authc.credential.HashedCredentialsMatcher
credentialsMatcher.hashAlgorithmName=md5
credentialsMatcher.hashIterations=1

#相當於注入MyRealm
myRealm= cn.lijie.realm.MyRealm
myRealm.credentialsMatcher=$credentialsMatcher
securityManager.realms=$myRealm

執行結果:

這裡寫圖片描述

相關推薦

shiro許可權框架簡單入門demo

shiro和spring security都是開源的許可權框架,shiro相對於spring security來說更簡單學習成本更低,並且提供的API也明瞭,下面是shiro官方的一個圖: 其中把上面的東西抽象出來主要分為幾個塊(網上找的文件摳出來的):

Flask 框架簡單入門

Flask框架介紹 Flask 框架 什麼是Flask? flask是一種基於python ,並且依賴於Jinja2模板引擎(提供網頁解析)和 Werkzeug WSGI服務(python web應用與web 服務之間的介面)的一種微型框架。其中: Jinja2模板引擎:通俗來講

MyBatis框架簡單入門

· MyBatis 起步: (1)MyBatis 是一個優秀的資料庫持久化框架 (2)可以解決java中進行JDBC操作時的繁雜步驟 將物件作為SQL的引數傳入 將查詢的結果轉換為Java物件 (3)

簡介Shiro安全框架簡單流程

shiro安全框架流程: 1.Apache Shiro (更輕量, 使用更簡單, 並不完全依賴 spring,可以獨立使用 ),Spring Security (使用複雜, 依賴 Spring) 2.體系結構分為6大類: Authentication 認證 ---- 使用者登入,

scrapy爬蟲框架簡單入門例項(二)

接著上一篇文章,我們已經可以用爬蟲訪問目標網站爬取頁面了,現在需要自動提交表單查詢資料,並且從頁面中篩選出每期中獎號碼儲存為json檔案匯出。首先建立一個scrapy.Item類(開啟專案資料夾下的items.py檔案): import scrapy class SsqSpiderIte

scrapy爬蟲框架簡單入門例項(一)

scrapy是一個用於爬取網站資料,提取結構性資料的python應用框架。爬取的資料一般用於資料分析,資料處理,儲存歷史資料等。scrapy的整體架構大致如下: 主要包括了以下元件: 引擎(Scrapy) 用來處理整個系統的資料流, 觸發事務(框架核心) 排程器(

shiro許可權框架-(二)與Springboot整合

首先引入shiro與Spring的依賴。 Shiro和Spring整合的依賴 <dependency> <groupId>org.apache.shiro<

Shiro許可權框架之一 --------簡介

一. Shiro是什麼 Shiro是一個Java平臺的開源許可權框架,用於認證和訪問授權。具體來說,滿足對如下元素的支援: 使用者,角色,許可權(僅僅是操作許可權,資料許可權必須與業務需求緊密結合),資源(url)。 使用者分配角色,角色定義許可權。 訪問授權時支援角色或者許可

在前後端分離的SpringBoot專案中整合Shiro許可權框架

出自 目錄 專案背景 解決方案 參考文章 專案背景        公司在幾年前就採用了前後端分離的開發模式,前端所有請求都使用ajax。這樣的專案結構在與CAS單點登入等許可權管理框架整合時遇到了很多問題,使得許可權部分的程式碼冗長醜陋,CAS的各種重定向也使得使

基於BOS系統的Shiro許可權框架基本使用

目錄 1.Shiro框架的基本概念 Shiro框架的核心功能有4個,即認證、授權、會話管理、加密,shiro基本使用這一方面我們主要討論認證與授權兩個基本用法。認證,顧名思義,即登陸時期資料庫使用者物件與表單的使

shiro許可權框架__由淺入深 2

需求: 1、使用者是否已經登入 2、這個使用者有哪些許可權,說白了 就是可以看到哪些操作按鈕 需要一個統一的許可權資料管理中心、可以對每一次請求進行比對 Realm:Shiro 從 Realm 獲取安全資料(如使用者、角色、許可權),就是說SecurityManager 要驗證

shiro許可權框架__由淺入深 1

1、實現思路:工廠啟動時載入 .ini檔案許可權、使用者、角色資訊到一個集合中 2、通過 工廠獲取 SecurityManager 元件 3、通過 SecurityUtils.getSubject(); 獲取使用者元件 Subject:應用程式碼直接互動的物件是 Subject,也就是說 S

SpringMVC+Shiro許可權管理簡單例子

什麼是許可權呢?舉個簡單的例子:我有一個論壇,註冊的使用者分為normal使用者,manager使用者。對論壇的帖子的操作有這些:新增,刪除,更新,檢視,回覆我們規定:normal使用者只能:新增,檢視,回覆manager使用者可以:刪除,更新normal,manager對應

Shiro許可權框架簡介

       最近加入了gxpt專案組,被安排做許可權模組,所以也有幸第一次接觸到了Shiro框架。讓我們來一起領略Shiro的風采吧。 什麼是Apache Shiro?        Apache

shiro許可權框架詳解06-shiro與web專案整合(下)

shiro和web專案整合,實現類似真實專案的應用 web專案中認證 web專案中授權 shiro快取 sessionManager使用 驗證碼功能實現 記住我功能實現 web專案中認證 實現方式 修改CustomRealm 的 doGe

Shiro許可權框架認證和授權原理介紹

1、簡介shiro是一個安全框架,是Apache的一個子專案。shiro提供了:認證、授權、加密、會話管理、與web整合、快取等模組。   1.1、模組介紹Authentication:使用者身份識別,可以認為是登入;Authorization:授權,即許可權驗證,驗證某個已

shiro許可權框架整理

Shiro簡介SpringMVC整合Shiro,Shiro是一個強大易用的Java安全框架,提供了認證、授權、加密和會話管理等功能。 Authentication:身份認證/登入,驗證使用者是不是擁有相應的身份;Authorization:授權,即許可權驗證,驗證某個已認證的

shiro許可權框架詳解06-shiro與web專案整合(上)

shiro和web專案整合,實現類似真實專案的應用 本文中使用的專案架構是springMVC+mybatis,所以我們是基於搭建好的專案進行改造的。 將shiro整合到web應用中 登入 退出 認證資訊在頁面展現,也就是顯示選單 shiro的過濾器

Quartz學習——Quartz簡單入門Demo(二)

要學習Quartz框架,首先大概瞭解了Quartz的基本知識後,在通過簡單的例子入門,一步一個腳印的走下去。 下面介紹Quartz入門的示例,由於Quartz的儲存方式分為RAM和JDBC,分別對這兩種進行簡單的說明。並附上程式碼! 首先需要新增Quartz

SpringMVC整合Shiro許可權框架

最近在學習Shiro,首先非常感謝開濤大神的《跟我學Shiro》系列,在我學習的過程中發揮了很大的指導作用。學習一個新的東西首先就是做一個demo,多看不如多敲,只有在實踐中才能發現自己的欠缺,下面記錄下來我整合shiro的過程。如果有不足之處,還望各位看官多多指出。 一、