日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

【NET CORE微服务一条龙应用】第三章 认证授权与动态权限配置

發(fā)布時間:2025/6/15 48 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【NET CORE微服务一条龙应用】第三章 认证授权与动态权限配置 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

【NET CORE微服務一條龍應用】第三章 認證授權與動態(tài)權限配置

介紹

系列目錄:【NET CORE微服務一條龍應用】開始篇與目錄

在微服務的應用中,統(tǒng)一的認證授權是必不可少的組件,本文將介紹微服務中網(wǎng)關和子服務如何使用統(tǒng)一的權限認證

主要介紹內容為:

1、子服務如何實現(xiàn)和網(wǎng)關相同的鑒權方式

2、接口權限如何動態(tài)配置與修改

3、前后端分離模式下通用的后臺管理系統(tǒng)(用戶、權限、菜單、平臺)

需提前了解知識點:

1、Jwt (JSON Web Token)

2、ClaimsPrincipal

3、Microsoft.AspNetCore.Authorization、AuthorizationPolicy、AuthorizationHandler

子服務和網(wǎng)關鑒權方式

首先我們需要了解一下Ocelot網(wǎng)關權限的使用方式,直接上代碼

配置

"AuthenticationOptions": {"AuthenticationProviderKey": "TestKey","AllowedScopes": ["admin","user"] }

認證

var result = await context.HttpContext.AuthenticateAsync(context.DownstreamReRoute.AuthenticationOptions.AuthenticationProviderKey);context.HttpContext.User = result.Principal;if (context.HttpContext.User.Identity.IsAuthenticated){await _next.Invoke(context);}

權限驗證

var authorised = _scopesAuthoriser.Authorise(context.HttpContext.User, context.DownstreamReRoute.AuthenticationOptions.AllowedScopes);

從以前的代碼我們可以看出認證授權的邏輯

1、HttpContext.AuthenticateAsync來進行認證驗證,即驗證Jwt token的有效可用性,其中AuthenticationProviderKey為身份驗證提供程序標識,例如

public void ConfigureServices(IServiceCollection services) { var authenticationProviderKey = "TestKey"; services.AddAuthentication().AddJwtBearer(authenticationProviderKey, x => { }); }

2、當1驗證通過后,我們可以通過context.HttpContext.User獲取key為scope的Claim數(shù)組信息(所以token生成要帶上此參數(shù)),然后與配置的AllowedScopes的數(shù)組進行交集驗證,當交集大于0時即為有權限訪問

所以子服務如果需要實現(xiàn)和網(wǎng)關相同的權限驗證就需要實現(xiàn)以上的方式,用過net core默認的權限認證時會發(fā)現(xiàn),權限的驗證都需要體現(xiàn)設定好接口的可訪問角色等參數(shù),這不符合我們的需求所以我們需要實現(xiàn)一個自定義的權限認證AuthorizationHandler,直接上代碼:

?View Code

其中_permissionAuthoriser.Authorise為權限驗證方法,繼續(xù)往下看實現(xiàn)邏輯

1 public class ScopesAuthoriser : IPermissionAuthoriser 2 { 3 private readonly IPermissionRepository _permissionRepository; 4 private readonly IClaimsParser _claimsParser; 5 private readonly string _scope = "scope"; 6 private bool _loaded = false; 7 public ScopesAuthoriser(IPermissionRepository permissionRepository, IClaimsParser claimsParser) 8 { 9 _permissionRepository = permissionRepository; 10 _claimsParser = claimsParser; 11 } 12 13 public bool Authorise(HttpContext httpContext) 14 { 15 if (!_loaded && _permissionRepository.Permissions.Count == 0) 16 _permissionRepository.Get(); 17 _loaded = true; 18 19 var permission = _permissionRepository.Permissions 20 .FirstOrDefault(it => string.Equals(it.Path, httpContext.Request.Path, StringComparison.CurrentCultureIgnoreCase) && it.Method == httpContext.Request.Method); 21 22 if (permission == null) 23 return true; 24 25 var values = _claimsParser.GetValuesByClaimType(httpContext.User.Claims, _scope); 26 27 var matchesScopes = permission.Scope.Intersect(values).ToList(); 28 29 if (matchesScopes.Count == 0) 30 return false; 31 32 return true; 33 } 34 }

其中_permissionRepository.Permissions是應用的接口列表與接口對應的可訪問scope;權限倉儲下面進行介紹

接口權限如何動態(tài)配置與修改

認證授權數(shù)據(jù)庫設計,tb_api_resources Api資源表、tb_roles 角色表、tb_role_apis 角色Api資源關系表、tb_users 用戶表、tb_user_roles 用戶角色表

常規(guī)驗證權限方式,是根據(jù)用戶的id查詢用戶角色,然后驗證角色是否擁有接口權限;而在網(wǎng)關中是反過來該接口有哪些角色可以訪問;

所以我們需要初始化出應用接口對應所需角色,目前我們實現(xiàn)了mysql版本的權限倉儲IPermissionRepository的數(shù)據(jù)查詢,代碼如下

?

1 public class MySqlPermissionRepository : IPermissionRepository 2 { 3 private readonly string _dbConnectionString; 4 private readonly string _projectName; 5 6 public MySqlPermissionRepository(string dbConnectionString, string projectName) 7 { 8 _dbConnectionString = dbConnectionString; 9 _projectName = projectName; 10 } 11 public List<Permission> Permissions { get; private set; } = new List<Permission>(); 12 public async Task Get() 13 { 14 using (var dbContext = new MySqlConnection(_dbConnectionString)) 15 { 16 // 平臺下所有需要認證Scope的接口 17 var apiList = await dbContext.QueryAsync<ApiInfo>(@"SELECT api.Url,api.Method,roleapi.RoleId 18 FROM tb_api_resources AS api 19 LEFT JOIN tb_role_apis AS roleapi ON api.Id = roleapi.ApiId 20 WHERE AllowScope = 2 AND ProjectName = @ProjectName", new { ProjectName = _projectName }); 21 // 所有角色 22 var roleList = await dbContext.QueryAsync<RoleInfo>(@"SELECT Id, `Key` from tb_roles WHERE IsDel=0", new { ProjectName = _projectName }); 23 if (apiList.Any()) 24 { 25 var permission = new List<Permission>(); 26 var apiUrlList = apiList.GroupBy(it => it.Url).Select(it => it.FirstOrDefault()).ToList(); 27 apiUrlList.ForEach(api => 28 { 29 var apiMethodList = apiList.Where(it => it.Url == api.Url).GroupBy(it => it.Method).Select(it => it.FirstOrDefault()).ToList(); 30 apiMethodList.ForEach(method => 31 { 32 var apiInfo = apiList.Where(it => it.Url == api.Url && it.Method == method.Method).FirstOrDefault(); 33 var roleids = apiList.Where(it => it.Url == api.Url && it.Method == method.Method).Select(it => it.RoleId).ToArray(); 34 var scopes = roleList.Where(it => roleids.Contains(it.Id)).Select(it => it.Key).ToList(); 35 permission.Add(new Permission 36 { 37 Path = apiInfo.Url, 38 Method = apiInfo.Method, 39 Scope = scopes 40 }); 41 }); 42 }); 43 if (permission.Count > 0) 44 Permissions = permission; 45 } 46 } 47 } 48 }

這里只會實現(xiàn)一次查詢,如果中間有接口權限進行了修改,那么如何進行更新呢,在上一篇配置中間使用中,我們介紹了如何使用組件的定時任務和組件的監(jiān)聽方式,所以我們只需做對應擴展即可,定時代碼就不貼了,監(jiān)聽代碼如下:

1 public class BucketAuthorizeListener : IBucketListener 2 { 3 private readonly IPermissionRepository _permissionRepository; 4 5 public BucketAuthorizeListener(IPermissionRepository permissionRepository) 6 { 7 _permissionRepository = permissionRepository; 8 } 9 10 public string ListenerName => "Bucket.Authorize"; 11 12 public async Task ExecuteAsync(string commandText) 13 { 14 if (!string.IsNullOrWhiteSpace(commandText) && commandText == NetworkCommandType.Reload.ToString()) 15 await _permissionRepository.Get(); 16 } 17 }

下面貼一下Bucket.Authorize如何使用代碼

1 public void ConfigureServices(IServiceCollection services) 2 { 3 // 添加授權 4 services.AddApiJwtAuthorize(Configuration); 5 // 添加授權認證 6 services.AddApiJwtAuthorize(Configuration).UseAuthoriser(services, builder => { builder.UseMySqlAuthorize(); }); 7 }

然后在需要認證授權的action或者controller加上[Authorize("permission")]屬性,appsetting配置如下,也可移至配置中心

?View Code

前后端分離模式下通用的后臺管理系統(tǒng)

在FamilyBucket-UI中我們可以對項目的接口權限認證方式、用戶、用戶角色、角色、角色權限、角色菜單等等進行配置,

同時FamilyBucket-UI還具有通用管理系統(tǒng)的基礎模塊,里面增加一個管理平臺的概念,可以直接多個管理平臺使用同一個用戶體系

本章就不做介紹了,內容有點長,下次再做詳細介紹,在多平臺同時管理時項目還需要進行一些升級,截圖如下

本章涉及源碼均可在github中進行查看

https://github.com/q315523275/FamilyBucket

https://github.com/q315523275/FamilyBucket-UI?

原文地址https://www.cnblogs.com/tianxiangzhe/p/10419334.html

總結

以上是生活随笔為你收集整理的【NET CORE微服务一条龙应用】第三章 认证授权与动态权限配置的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內容還不錯,歡迎將生活随笔推薦給好友。