1. 程式人生 > >ABP框架學習之——授權(Authorization)

ABP框架學習之——授權(Authorization)

定義許可權

一個唯一的許可權是為需要授權的每個操作定義的。我們應該在使用許可權之前定義一個許可權。ABP的設計是模組化的,因此不同的模組可以有不同的許可權。為了定義模組的許可權,應該建立一個派生自AuthorizationProvider,通過abp官網建立的模板中包含這樣一個例子:

    public static class PermissionNames
    {
        public const string Pages_Tenants = "Pages.Tenants";

        public const string Pages_Users = "Pages.Users"
; public const string Pages_Roles = "Pages.Roles"; }
    public class MZCAuthorizationProvider : AuthorizationProvider
    {
        public override void SetPermissions(IPermissionDefinitionContext context)
        {
            context.CreatePermission(PermissionNames.Pages_Users, L("Users"
)); context.CreatePermission(PermissionNames.Pages_Roles, L("Roles")); context.CreatePermission(PermissionNames.Pages_Tenants, L("Tenants"), multiTenancySides: MultiTenancySides.Host); } private static ILocalizableString L(string name) { return
new LocalizableString(name, MZCConsts.LocalizationSourceName); } }

IPermissionDefinitionContext有建立和獲取許可權的方法。一個許可權定義了一些屬性:
- Name:系統中 唯一的名字。最好為許可權的名字定義一個const字串而不是變數字串。我們偏向使用“.”符號用於有層次的名字,但這不是強制的。你可以設定任何你喜歡的名字,唯一的一點是保證它必須是唯一的。
- DisplayName:用於以後在UI上顯示許可權的本地化字串。
- Description:用於以後在UI上顯示許可權定義的本地化字串。
- IsGrantedByDefault:表示該許可權是否授予給所有登入的使用者,除非該許可權顯式禁止未授予給使用者。該值一般預設為false。
- MultiTenancySides:對於多租戶應用,租戶或者租主可以使用同一個許可權。這是一個Flags列舉,因此一個許可權可以用於租戶和租主。
- dependedFeature:可以用於宣告一個功能的依賴。因此,只有功能依賴滿足了,該許可權才會被授予。
一個許可權可以有父許可權和子許可權。雖然這不會影響許可權檢查,但是在UI上組合許可權有所幫助,下面是我自己添加了許可權,進行了以下修改。

    public static class PermissionNames
    {
        public const string Pages_Tenants = "Pages.Tenants";

        public const string Pages_Users = "Pages.Users";

        public const string Pages_Roles = "Pages.Roles";
        /// <summary>
        /// 部落格管理頁面許可權
        /// </summary>
        public const string Pages_Blogs = "Pages.Blogs";
        public const string Pages_Blogs_Notes = "Pages.Blogs.Notes";
        public const string Blogs_Notes_Edit = "Pages.Blogs.Notes.Edit";
        public const string Blogs_Notes_Delete = "Pages.Blogs.Notes.Delete";
    }
            var BlogPermission = context.CreatePermission(PermissionNames.Pages_Blogs, L("Blogs"));
            var NotePermission = BlogPermission.CreateChildPermission(PermissionNames.Pages_Blogs_Notes,L("Notes"));
            NotePermission.CreateChildPermission(PermissionNames.Blogs_Notes_Edit, L("EditNotes"));
            NotePermission.CreateChildPermission(PermissionNames.Blogs_Notes_Delete, L("DeleteNotes"));

當建立了授權提供者之後,我們應該在模組的PreIntialize方法中註冊它:我們的模板中是這樣註冊的

    public class MZCApplicationModule : AbpModule
    {
        public override void PreInitialize()
        {
            Configuration.Authorization.Providers.Add<MZCAuthorizationProvider>();
        }
    }

我們的模板中是這樣使用的。

[AbpAuthorize(PermissionNames.Pages_Roles)]
    public class RoleAppService : AsyncCrudAppService<Role, RoleDto, int, PagedResultRequestDto, CreateRoleDto, RoleDto>, IRoleAppService
 {
}

AbpAuthorize特性需要注意的地方

  • ABP對於授權使用了強大的動態方法攔截(interception)。因此,使用AbpAuthorize特性有一些限制:
  • 不能用於私有方法。
  • 不能用於靜態方法。
  • 不能用於非注入類的方法(我們必須要使用依賴注入)。

使用IPermissionChecker驗證許可權

雖然AbpAuthorize特性對於大多數情況相當夠用了,但是肯定存在我們會在一個方法體內檢查許可權的情況。我們可以注入並使用IPermissionChecker。可以看見有兩個方法提供使用。

    //
    // 摘要:
    //     This class is used to permissions for users.
    public interface IPermissionChecker
    {
        Task<bool> IsGrantedAsync(string permissionName);
        Task<bool> IsGrantedAsync(UserIdentifier user, string permissionName);
    }

在ApplicationService基類注入並定義了PermissionChecker屬性。這樣,許可權檢查者不需要在應用服務類中注入就可以使用了。

相關推薦

ABP框架學習——授權Authorization

定義許可權 一個唯一的許可權是為需要授權的每個操作定義的。我們應該在使用許可權之前定義一個許可權。ABP的設計是模組化的,因此不同的模組可以有不同的許可權。為了定義模組的許可權,應該建立一個派生自AuthorizationProvider,通過abp官網

Spring框架學習——Spring框架基本介紹

Spring的出現是為了取代EJB(Enterprise JavaBean)的臃腫、低效、脫離現實的缺點。Spring致力於J2EE應用的各層(表現層、業務層、持久層)的解決方案,Spring是企業應用開發的“一站式”選擇。 1.Spring定義: Spring是分層的J

Netty框架學習—— Java網路IO模型

前言 《Unix網路程式設計:卷1》中介紹了5中IO模型,JAVA作為執行在宿主機上的程式,底層也遵循這5中I/O模型規則。這5中I/O模型分別是: 阻塞式IO 非阻塞式IO I/O複用 訊號驅動式IO 非同步IO 按POSIX標準來分,IO分為同步

Netty框架學習—— EventLoop及事件迴圈機制

在前面的博文中,我們大致分析瞭解了Channel及其相關概念。在Netty的執行緒模型中,每個channel都有唯一的一個eventLoop與之相繫結,那麼在這篇博文中我們來看一下EvenLoop及其相關概念。 在傳統的Java NIO程式設計中,我們經常使用

Netty框架學習—— 引導

前言 之前的博文介紹了Channel、EventLoop及由其衍生出來的相關概念。但這些都是靜態的概念,為了能使Netty程式執行起來,必須要有一個全域性的元件將上述內容串聯起來,這便就是本文所講內容——引導。 引導類 引導類的層次結構如下: 主

ABP框架asp.net core 2.X+Vue模板專案學習

      前言:   第一次接觸ABP的專案是在2018年6月份,但是當時沒有深入具體的研究,而今天因為工作的需要,需要學習、瞭解這個框架,在時隔半年之後,今天重新下載了這個專案,雖然在園子裡有很多前輩們寫的這類的文章,但是我還是會在部落格園中記錄一下學習的過程,一是希

Shiro學習筆記3——授權Authorization

1.什麼是授權 授權,就是訪問控制,控制某個使用者在應用程式中是否有許可權做某件事 2.授權三要素 角色 通常代表一組行為或職責.這些行為演化為你在一個軟體應用中能或者不能做的事情。角色通常是分配給使用者帳戶的,因此,通過分配,使

shiro入門學習--授權Authorization|築基初期

## 寫在前面 經過前面的學習,我們瞭解了shiro中的認證流程,並且學會了如何通過自定義Realm實現應用程式的使用者認證。在這篇文章當中,我們將學習shiro中的授權流程。 ## 授權概述 這裡的授權指的是授予某一系統的某一使用者訪問受保護資源的許可權,分為查詢、修改、插入和刪除幾類。沒有相關許可權

python學習

[1] size class dex epc uri msu 語句 這就是 繼續昨天的學習,學到了數組。 首先有兩個數組,name1和name2.我們可以將兩個數組合並 name1=[1,2,3,4] name2=[5,6,7,8] names=name1.extend(

深入學習mysql表的操作

uniq order fault change incr 相關 約束 設置 type 1、表:是數據庫中的存儲數據的基本單位,一個表包含若幹個字段和值 2、創建表:   CREATE TABLE 表名稱 (   字段名1  數據庫類型1  [約束條件1],   字段名2  

Linux學習幫助命令

查看系統 lin 查看 inux 舉例 config pro nbsp 雜項 幫助命令man .man  命令  #獲取指定命令的幫助 .man  ls    #查看ls的幫助 man的級別 1 查看命令的幫助 2 查看可被內核調用的函數的幫助 3 查看函數的

python學習使用socketserver進行ftp斷點續傳

def += __init__ con 不存在 不為 local 接收 class 最近學習python到socketserver,本著想試一下水的深淺,采用Python3.6. 目錄結構如下: receive_file和file為下載或上傳文件存放目錄,ftp_clie

Hadoop源碼學習HDFS

-a node bsp ima 數據 layout 版本號 name 技術   Hadoop的HDFS可以分為NameNode與DataNode,NameNode存儲所有DataNode中數據的元數據信息。而DataNode負責存儲真正的數據(數據塊)信息以及數據塊的ID。

我的學習SQL盲註學習

網絡安全 dvwa sql盲註 我的學習之路,現在零基礎,是一個小白,請各位大牛批評指正!寫下這篇,是對自己的一個思路的整理,僅供參考。 Dvwa中登錄進入,首先在DVWA Security中設置等級為low,然後進入SQL Injection(blind),隨意輸入一個數字進行抓包,然後找

Hibernate學習

ring int 表示 gen prop generator 需要 blog hibernate 簡述 多對多關系映射 多對多關系映射需要一張中間表來維護關系      一:Role類與Function類 1 publi

Hibernate學習

oid bject 需要 .com build action logs 結果 gin hql:hibernate query language hibernate查詢語言 1、單屬性查詢 1 public void testQuery1(){ 2

Mybbatis學習

org unit primary sas oca manage result ava namespace 本例子為采用的mysql+maven+mybatis構建。   初步學習mybatis:     mybatis為一個半自動框架,相對於hibernate來說他更加輕巧

PHP學習

設有 src fault ... 根據 條件判斷 滿足 循環 獲取 2017.08.13 Day 5  周日  晴 PHP-順序結構 順序結構就像一條直線,按著順序一直往下執行。我們編寫的代碼默認都是按照順序結構執行的。 PHP條件結構之if…else… 條件結

運維學習cifsSamba文件系統服務

linuxsamba1.samba提供cifs協議實現共享文件Samba是在Linux和UNIX系統上實現SMB協議的一個免費軟件,由服務器及客戶端程序構成。SMB(Server Messages Block,信息服務塊)是一種在局域網上共享文件和打印機的一種通信協議,它為局域網內的不同計算機之間提供文件及打

PHP學習

data 循環 marker 輸出 bsp this 兩個 針對 設計 2017.08.23-24 Day 6  周三-周四  晴(臺風) HP數組定義 數組就是一個鍵值對組成的語言結構,鍵類似於酒店的房間號,值類似於酒店房間裏存儲的東西。 如果你去某個酒店住店,服