1. 程式人生 > >ABP+AdminLTE+Bootstrap Table許可權管理系統第八節--ABP錯誤機制及AbpSession相關

ABP+AdminLTE+Bootstrap Table許可權管理系統第八節--ABP錯誤機制及AbpSession相關

((ClaimsPrincipal)Thread.CurrentPrincipal).Claims.FirstOrDefault(c => c.Type == ClaimTypes.NameIdentifier);

       需要獲取會話資訊則必須實現IAbpSession介面。雖然你可以用自己的方式去實現它(IAbpSession),但是它在module-zero專案中已經有了完整的實現。IAbpSession包含還有其他資訊.

 //
    // 摘要:
    //     Defines some session information that can be useful for applications.
public interface IAbpSession { // // 摘要: // TenantId of the impersonator. This is filled if a user with Abp.Runtime.Session.IAbpSession.ImpersonatorUserId // performing actions behalf of the Abp.Runtime.Session.IAbpSession.UserId. int? ImpersonatorTenantId { get
; } // // 摘要: // UserId of the impersonator. This is filled if a user is performing actions behalf // of the Abp.Runtime.Session.IAbpSession.UserId. long? ImpersonatorUserId { get; } // // 摘要: // Gets current multi-tenancy side. MultiTenancySides MultiTenancySide { get
; } // // 摘要: // Gets current TenantId or null. This TenantId should be the TenantId of the Abp.Runtime.Session.IAbpSession.UserId. // It can be null if given Abp.Runtime.Session.IAbpSession.UserId is a host user // or no user logged in. int? TenantId { get; } // // 摘要: // Gets current UserId or null. It can be null if no user logged in. long? UserId { get; } // // 摘要: // Used to change Abp.Runtime.Session.IAbpSession.TenantId and Abp.Runtime.Session.IAbpSession.UserId // for a limited scope. // // 引數: // tenantId: // // userId: IDisposable Use(int? tenantId, long? userId);

AbpSession定義的一些關鍵屬性:

1.UserId: 當前使用者的標識ID,如果沒有當前使用者則為null.如果需要授權訪問則它不可能為空。

2.TenantId: 當前租戶的標識ID,如果沒有當前租戶則為null。

3.MultiTenancySide: 可能是Host或Tenant。

         UserId和TenantId是可以為null的。當然也提供了不為空時獲取資料的 GetUserId()和GetTenantId() 方法 。當你確定有當前使用者時,你可以使用GetUserId()方法。如果當前使用者為空,使用該方法則會丟擲一個異常。GetTenantId()的使用方式和GetUserId()類似。

            IAbpSession通常是以屬性注入的方式存在於需要它的類中,不需要獲取會話資訊的類中則不需要它。如果我們使用屬性注入方式,我們可以用 
NullAbpSession.Instance作為預設值來初始化它(IAbpSession)

    public IAbpSession AbpSession { get; set; }
        private readonly IUserService _iUsersService;
        public AccountController(IUserService iUsersService)
        {
            _iUsersService = iUsersService;
            AbpSession = NullAbpSession.Instance;
        }

        // GET: Account
        public ActionResult Index()
        {
            var currentUserId = AbpSession.UserId;
            return View(); 
        }

          由於授權是應用層的任務,因此我們應該在應用層和應用層的上一層使用IAbpSession(我們不在領域層使用IAbpSession是很正常的)。

ApplicationServiceAbpController 和 AbpApiController 這3個基類已經注入了AbpSession屬性,因此在Application Service的例項方法中,能直接使用AbpSession屬性。

           ABP框架中的AbpSession, 並沒有使用到System.Web.HttpSessionStateBase, 而是自己定義了一個Abp.Runtime.Session.IAbpSession介面, 並在Zero模組中通過AspNet.Identity元件實現了AbpSession物件的存值、取值。 所以即使Web服務重啟,也不會丟失Session狀態。在我們自己的專案中, Session物件只有UserId、TenantId、MultiTenancySide這幾個屬性是不夠用的,可以自己擴充了幾個屬性和方法,使用起來非常方便。

      首先我們定義IAbpSession擴充套件類獲取擴充套件屬性,通過擴充套件類,我們不需要做其他額外的更改,即可通過ApplicationService, AbpController 和 AbpApiController 這3個基類已經注入的AbpSession屬性呼叫GetUserName()來獲取擴充套件的Name屬性。

 介面程式碼:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace JCmsErp.AbpSessionExtension
{
   public interface IAbpSessionExtension
    {
        string UserName { get; }
    }
}

實現程式碼:

using Abp.Configuration.Startup;
using Abp.MultiTenancy;
using Abp.Runtime;
using Abp.Runtime.Session;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Security.Claims;
using System.Text;
using System.Threading.Tasks;

namespace JCmsErp.AbpSessionExtension
{
    public class AbpSessionExtension : ClaimsAbpSession, IAbpSessionExtension
    {
        public AbpSessionExtension(IPrincipalAccessor principalAccessor, IMultiTenancyConfig multiTenancy, ITenantResolver tenantResolver, IAmbientScopeProvider<SessionOverride> sessionOverrideScopeProvider)
            : base(principalAccessor, multiTenancy, tenantResolver, sessionOverrideScopeProvider)
        {
        }

        public string UserName => GetUserName(ClaimTypes.Name);

        private string GetUserName(string claimType)
        {
            var claimsPrincipal = PrincipalAccessor.Principal;

            var claim = claimsPrincipal?.Claims.FirstOrDefault(c => c.Type == claimType);
            if (string.IsNullOrEmpty(claim?.Value))
                return null;

            return claim.Value;
        }


    }
}

       然後在登入邏輯中加入以下程式碼:

  //新增身份資訊,以便在AbpSession中使用

            identity.AddClaim(new Claim(ClaimTypes.Name, user.UserName));

就這樣,我們在ApplicationService, AbpController 和 AbpApiController任何地方注入IAbpSession,然後AbpSession.Name就能獲取到我們登入時候新增的資訊.

       二,abp的錯誤機制

          如果登入過程中出錯怎麼辦,報錯了ABP怎麼反應,我們來看一下abp的錯誤機制.在web應用中,異常通常在MVC Controller actions和Web API Controller actions中處理。當異常發生時,應用程式的使用者以某種方式被告知錯誤的相關資訊及原因。果錯誤在正常的HTTP請求時發生,將會顯示一個異常頁。如果在AJAX請求中發生錯誤,伺服器傳送錯誤資訊到客戶端,然後客戶端處理錯誤並顯示給使用者。在所有的Web請求中處理異常是件乏味且重複的工作。ABP自動化完成異常處理,幾乎從不需要顯示的處理任何異常。ABP處理所有的異常、記錄異常並返回合適、格式化的響應到客戶端。在客戶端處理這些響應並將錯誤資訊顯示給使用者。

     異常顯示,首先我們在ActionResult 隨便新增一個異常資訊,除錯一下看一下結果

   public ActionResult Index()
        {

           // return View();
             throw new Exception("登入密碼錯誤或使用者不存在或使用者被禁用。");
        }

         當然,這個異常可能由另一個方法丟擲,而這個方法的呼叫在這個action裡。ABP處理這個異常、記錄它並顯示'Error.cshtml'檢視。你可以自定義這個檢視來顯示錯誤。一個示例錯誤檢視(在ABP模板中的預設錯誤檢視):

BP對使用者隱藏了異常的細節並顯示了一個標準(本地化的)的錯誤資訊,除非你顯示的丟擲一個UserFriendlyException,UserFriendlyExceptionUserFriendlyException是一個特殊型別的異常,它直接顯示給使用者。參見下面的示例:

    // GET: Account
        public ActionResult Index()
        {

           // return View();
           throw new Abp.UI.UserFriendlyException("登入密碼錯誤或使用者不存在或使用者被禁用。");
        }

瀏覽器結果:

所以,如果你想顯示一個特定的錯誤資訊給使用者,那就丟擲一個UserFriedlyException(或者一個繼承自這個類的異常)。

      當然如果是ajax請求裡面出錯,message API處理JSON物件並顯示錯誤資訊給使用者。前端應該有相應的錯誤處理.

相關推薦

ABP+AdminLTE+Bootstrap Table許可權管理系統八節--ABP錯誤機制AbpSession相關

((ClaimsPrincipal)Thread.CurrentPrincipal).Claims.FirstOrDefault(c => c.Type == ClaimTypes.NameIdentifier);        需要獲取會話資訊則必須實現IAbpSession介面。雖然你

ABP+AdminLTE+Bootstrap Table許可權管理系統七節--登入邏輯幾種abp封裝的Javascript函式庫

        簡介        經過前幾節,我們已經解決資料庫,模型,DTO,控制器和注入等問題.那麼再來看一下登入邏輯.這裡算是前面幾節的一個初次試水. 首先我們資料庫已經有的相應的資料. 新增Login方法        模型和DTO已經建好,所以我們直接在服務層新增Login方法就可

ABP+AdminLTE+Bootstrap Table許可權管理系統三節--abp分層體系,實體相關ABP模組系統

ABP模組系統  說了這麼久,還沒有詳細說到abp框架,abp其實基於DDD(領域驅動設計)原則的細看分層如下: 再看我們專案解決方案如下: JCmsErp.Application,應用層:進行展現層與領域層之間的協調,協調業務物件來執行特定的應用程式的任務。它不包含業務邏輯,主要包

ABP+AdminLTE+Bootstrap Table許可權管理系統十一節--Bootstrap Table使用者管理列表以及Module Zero之使用者管理

   使用者實體       使用者實體代表應用的一個使用者,它派生自AbpUser類,如下所示: public class User : AbpUser<Tenant, User> { //add your own user properties here

ABP+AdminLTE+Bootstrap Table許可權管理系統九節--AdminLTE引入模板頁和佈局和選單

 AdminLTE    首先去官網下載包下來,然後引入專案.   然後我們在web層新增區域Admin以及Common,關於AdminLTE的地址我們放在Common路勁下面.   在Common下新增LayoutController控制器. Layout 這裡選單我們先不管,在後

ABP+AdminLTE+Bootstrap Table許可權管理系統四節--倉儲,服務,服務介面依賴注入

AbpModule      在ABP框架中,倉儲,服務,這塊算是最為重要一塊之一了.ABP框架提供了建立和組裝模組的基礎,一個模組能夠依賴於另一個模組,一個程式集可看成一個模組, 一個模組可以通過一個類來定義這個模組,而給定義這個類要繼承自已經瘋轉好的AbpModule..net通過反射來獲取這些程

ABP+AdminLTE+Bootstrap Table許可權管理系統十節--AdminLTE模板選單處理

 AdminLTE選單       上節我們把佈局頁,也有的臨時的選單,但是選單不是應該動態載入的麼?,所以我們這節來寫選單.首先我們看一下AdminLTE原始碼裡面的選單以及結構. <aside class="main-sidebar"> <!--

ABP+AdminLTE+Bootstrap Table許可權管理系統六節--abp控制器擴充套件json封裝

 一,控制器AbpController    說完了Swagger ui 我們再來說一下abp對控制器的處理和json的封裝.    首先我們定義一個控制器,在新增控制器的時候,控制器會自動繼承自AbpController,AbpController

ABP+AdminLTE+Bootstrap Table許可權管理系統第一節--使用ASP.NET Boilerplate模板建立解決方案

ABP+AdminLTE+Bootstrap Table許可權管理系統一期 Github:https://github.com/Jimmey-Jiang/ABP-ASP.NET-Boilerplate-Project-CMS 前往部落格園總目錄

ABP+AdminLTE+Bootstrap Table許可權管理系統一期

 初衷    學而時習之,不亦說乎,溫顧溫知新,可以為師矣.           看懂遠不如動手去做,動手做才能發現很多自己不懂的問題,不斷的反思和總結,“樂於分享是一種境界的突破”。" 分享是很有意思,也是可以鍛鍊人的。 分享意味著自我的不斷淨化提升,不給自己後退的餘地。為什麼這麼說呢?因為:一,分

ABP+AdminLTE+Bootstrap Table許可權管理系統第二節--在ABP的基礎做資料庫指令碼處理

      第一點,上一篇文章中我們講到codefirst中一些問題包括如圖,codefirst在每次執行命令的時候會生成新的類,後來會越來越多。 1,codefirst在執行的資料庫遷移過程中產生了很多檔案,對於強迫症的我而言特別不爽,這些其實是可以不用生成的。 2,在codefirst實際

ABP module-zero +AdminLTE+Bootstrap Table+jQuery許可權管理系統十三節--RBAC模式ABP許可權管理(附贈福利)

角色訪問控制(RBAC) 角色訪問控制(RBAC)應該是目前用得最多也是關注最多的許可權管理模型了。 許可權(Permission)與角色(Role)相關聯,使用者(User)通過成為適當角色的成員而得到這些角色的許可權。這就極大地簡化了許可權的管理。 RBAC引入了角色(Role)概念,目的應該是解耦了P

ABP module-zero +AdminLTE+Bootstrap Table+jQuery許可權管理系統十四節--後臺工作者HangFire與ABP框架Abp.Hangfire擴充套件

HangFire與Quartz.NET相比主要是HangFire的內建提供整合化的控制檯,方便後臺檢視及監控,對於大家來說,比較方便。 HangFire是什麼 Hangfire是一個開源框架(.NET任務排程框架),可以幫助您建立,處理和管理您的後臺作業,處理你不希望放入請求處理管道的操作: 通知/通訊;

ABP module-zero +AdminLTE+Bootstrap Table+jQuery許可權管理系統十七節--Quartz與ABP框架Abp.Quartz擴充套件

Quartz簡介 Quartz.NET是一個開源的作業排程框架,是 OpenSymphony 的 Quartz API 的.NET移植,它用C#寫成,可用於winform和asp.net應用中。它提供了巨大的靈活性而不犧牲簡單性。你能夠用它來為執行一個作業而建立簡單的或複雜的排程。它有很多特徵,如:資料庫支

ABP module-zero +AdminLTE+Bootstrap Table+jQuery許可權管理系統十六節--SignalR與ABP框架Abp.Web.SignalR擴充套件

SignalR簡介 SignalR是什麼? ASP.NET SignalR 是為 ASP.NET 開發人員提供的一個庫,可以簡化開發人員將實時 Web 功能新增到應用程式的過程。實時 Web 功能是指這樣一種功能:當所連線的客戶端變得可用時伺服器程式碼可以立即向其推送內容,而不是讓伺服器等待客戶端請求新的資

ABP module-zero +AdminLTE+Bootstrap Table+jQuery許可權管理系統十二節--小結,Bootstrap Table之角色管理以及module-zero角色管理

寫在前面的話           很多人說ABP不適合高併發大型,有一定的道理,但是我覺得還是可以的,就看架構師的能力了,我之前公司就是ABP絕對百萬資料級專案,是一個線上教育網站,涉及到平臺,學院,院系,班級,課程,學生等,一個平臺多少大學,一個大學多少院系,一個院系多少班級多少課程,其負責程度一

ABP module-zero +AdminLTE+Bootstrap Table+jQuery許可權管理系統十五節--快取小結與ABP框架專案中 Redis Cache的實現

快取 為什麼要用快取 為什麼要用快取呢,說快取之前先說使用快取的優點。 減少寄宿伺服器的往返呼叫(round-trips)。 如果快取在客戶端或是代理,將減少對伺服器的請求,減少頻寬。 減少對資料庫伺服器的往返呼叫(round-trips)。 當內容快取在web伺服器,能夠減輕對資料庫的請求。 減少網路

SpringSecurity許可權管理系統實戰—三、主要頁面介面實現

## 系列目錄 [SpringSecurity許可權管理系統實戰—一、專案簡介和開發環境準備](https://www.cnblogs.com/codermy/p/13516372.html) [SpringSecurity許可權管理系統實戰—二、日誌、介面文件等實現](https://www.cnblogs

ABP module-zero +AdminLTE+Bootstrap Table+jQuery權限管理系統十二節--小結,Bootstrap Table之角色管理

增刪 習慣 etc 根據 很好 這不 update 必須 virtual 返回總目錄:ABP+AdminLTE+Bootstrap Table權限管理系統一期 很多人說ABP不適合高並發大型,有一定的道理,但是我覺得還是可以的,就看架構師的能

[ABP開源專案]--vue+vuex+vue-router+EF的許可權管理系統

好久沒寫文字了,當然大家也不期待嘛,反正看程式碼就行了。 演示網站 首先說下這個專案吧。 如標題一樣是基於VUE+.NET開發的框架,也是群友一直吼吼吼要一個vue版本的ABP框架。 我們先來看看首頁吧: 還比較酷炫,提供下演示賬號 演示地址:http://vue.yo