AbpVNext微服务-从身份认证及授权开始(一)(干货,强烈推荐)

阅读: 评论:0

AbpVNext微服务-从⾝份认证及授权开始(⼀)(⼲货,强烈推
荐)
Abp-VNext是基于aspnetboilerplate的先⾏版本,在我看来,具有下⾯三个特点:
1,⼀个全⾯的技术框架:基本上囊括了.Net 技术栈上各种流⾏的技术应⽤,并且在集成度上也做得很好。
2,基于领域驱动的分层设计模型:提供了DDD分层设计的最佳实践,明确了各层的⼯作职责
3,模块化的开发模式
参考:,
Abp-VNext的特点决定了他在.Net 微服上能⼤展拳脚,下⾯从微服务的⾝份认证及授权开始,看看Abp-Vnext能帮我们做些什么。
⼀,基于Abp-Vnext的微服务架构⽬录
参考Abp-Vnext的微服务Demo,先把⼯作⽬录建⽴起来
先建⽴⼀个服务,⽤于⽤户⾝份认证及授权管理
1,建⽴解决⽅案:dotnet new sln --name Kingsun.Liujb
2,建⽴⽤于⽤户⾝份认证及授权管理的模块:
  切换⽬录到modules,执⾏Abp命令:abp new Kingsun.Liujb.IDServer --ui-none -t module -csf。创建⼀个没有ui的模块。
3,创建模块后认识⼀下Abp-vnext的DDD分层架构
4,按需将模块添加到根解决⽅案
⼆,IdentityServer宿主配置
切换到microsoftservices⽬录,
将Modules⽬录中的宿主⽰例中的IdentityServer直接拷过来。切换到shared⽬录,新建⼀个类库:Kingusn.Liujb.Shared
注意,这⾥Kingusn.Liujb.Shared使⽤netstandard2.0
将Kingsun.Liujb.Shared添加到Kingsun.Liujb.IDServer.IdentityServer项⽬引⽤,替换原来的shared项⽬。
MultiTenancyConsts.cs
1 2 3 4public class MultiTenancyConsts
{
public const bool IsEnabled = true;  }
更改数据库链接地址为实际地址:Kingsun.Liujb.IDServer.IdentityServer项⽬的appsettings.json。由于⽬前没有使⽤reids缓存,先⾏在IDServerIdentityServerModule中将redis相关模块注释掉。
此处要注释的地⽅包括:
1、IdentityServerModule的依赖注⼊项DependsOn中的typeof(AbpCachingStackExchangeRedisModule)
2、下⾯这⼀段
if (!hostingEnvironment.IsDevelopment())
{
var redis = ConnectionMultiplexer.Connect(configuration["Redis:Configuration"]);
context.Services
.AddDataProtection()
.PersistKeysToStackExchangeRedis(redis, "IdServer-Protection-Keys");
}
使⽤”update-database“命令更新数据到数据库,运⾏IdentityServer项⽬后使⽤默认的⽤户名:admin。密码:1q2w3E* 登录
三,添加⽤户⾝份管理、租户管理模块
前⾯我们见识到了使⽤ABP-Vnext创建项⽬的实⽤性,下⾯将⽤使⽤ABP-VNext的模块化特性快速添加部份管理模块
先添加⾝份认证相关的管理模块,安装Nuget包:Volo.Abp.Identity.Web 后在IDServerIdentityServerModule.cs中添加依赖:
typeof(Volo.Abp.Identity.Web.AbpIdentityWebModule)。
运⾏程序:
同样添加租户管理:Volo.Abp.TenantManagement.Web.AbpTenantManagementWebModule
四,添加⽇志查看模块
查看Abp-vnex的⽇志管理模块,可以看出社区版本只提供了领域层及基础设施层,没有应⽤服务层和表⽰层,也就意味着没有包含⽇志管理相关接⼝及页⾯:
以上依赖要在Kingsun.Liujb.IDServer.Application中使⽤nuget中添加
然后在IdentityServerModule的依赖注⼊项DependsOn中加⼊:
typeof(Volo.Abp.Identity.Web.AbpIdentityWebModule),
typeof(Volo.Abp.TenantManagement.Web.AbpTenantManagementWebModule),
typeof(Kingsun.Liujb.Web.IDServerWebModule)
1,新增查询⽇志服务
1),先建⽴服务约束,包括接⼝,数据传输对象。我这⾥建⽴了⼀个名为IAuditServices的接⼝,约束服务的使⽤。AuditDto以及GetAuditlogInput这两个类⽤于服务数据的传输。
声明如下:
1 2 3  public interface IAuditServices : IApplicationService    {
4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27        System.Threading.Tasks.Task<PagedResultDto<AuditDto>> GetAuditsByUsernameAsync(GetAuditlogInput input);        System.Threading.Tasks.Task<PagedResultDto<AuditDto>> GetListAsync();
}
public class AuditDto: EntityDto<Guid>
{
public string ApplicationName { get; set; }
public string UserId { get; set; }
public string UserName { get; set; }
public string TenantName { get; set; }
public DateTime ExecutionTime { get; set; }
public int ExecutionDuration { get; set; }
public string ClientIpAddress { get; set; }
public string ClientName { get; set; }
public string BrowserInfo { get; set; }
public string HttpMethod { get; set; }
public string Url { get; set; }
public string Exceptions { get; set; }
public int HttpStatusCode { get; set; }
}
public class GetAuditlogInput: PagedAndSortedResultRequestDto
{
public string Filter { get; set; }
}
2),实现服务
在Kingsun.Liujb.IDServer.Application包中实现具体的服务    [Authorize(IDServerPermissions.Audits.AuditMannage)] 1
2
3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33public class AuditServices : IDServerAppService, IAuditServices
{
private readonly IAuditLogRepository _auditLogRepository;
public AuditServices(IAuditLogRepository auditLogRepository)
{
this._auditLogRepository = auditLogRepository;
}
public async System.Threading.Tasks.Task<PagedResultDto<AuditDto>> GetAuditsByUsernameAsync(GetAuditlogInput input)        {
long count = await _auditLogRepository.GetCountAsync(userName: input.Filter);
var list = await _auditLogRepository.GetListAsync(
skipCount: input.SkipCount,
maxResultCount: input.MaxResultCount,
userName: input.Filter,
sorting: input.Sorting
);
return new PagedResultDto<AuditDto>()
{
TotalCount = count,
Items = ObjectMapper.Map<List<AuditLog>, List<AuditDto>>(list)
};
}
public async Task<PagedResultDto<AuditDto>> GetListAsync()
{
long count = await _auditLogRepository.GetCountAsync();
var list = await _auditLogRepository.GetListAsync();
return new PagedResultDto<AuditDto>()
{
TotalCount = count,
Items = ObjectMapper.Map<List<AuditLog>, List<AuditDto>>(list)
};
}
}
34
暴露API
Kingsun.Liujb.IDServer.HttpApi 1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24[RemoteService]
[Route("api/IDServer/Audit")]
[Authorize(IDServerPermissions.Audits.AuditMannage)]
public class AuditController : IDServerController, IAuditServices
{
private readonly IAuditServices _iDServerAuditService;
public AuditController(IAuditServices _iDServerAuditService)
{
this._iDServerAuditService = _iDServerAuditService;
}
[HttpGet]
[Route("GetAuditsByUsername")]
public async Task<PagedResultDto<AuditDto>> GetAuditsByUsernameAsync(GetAuditlogInput input)      {
return await _iDServerAuditService.GetAuditsByUsernameAsync(input);
}
[HttpGet]
[Route("GetList")]
public async Task<PagedResultDto<AuditDto>> GetListAsync()
{
return await _iDServerAuditService.GetListAsync();
}
}
2,新增访问权限 
 对服务访问进⾏授权管理。
在Kingsun.Liujb.IDServer.Application.Contracts包的PermissionDefinitionProvider中新建权限,并设置本地化显⽰名称。1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26public class IDServerPermissionDefinitionProvider : PermissionDefinitionProvider
{
public override void Define(IPermissionDefinitionContext context)
{
var auditGroup = context.AddGroup(IDServerPermissions.GroupName, L("Permission:AuditManagement"));
auditGroup.AddPermission(IDServerPermissions.Audits.AuditMannage, L("Permission:AuditManagement"), Volo.Abp.MultiTenancy.MultiTenancySides.Host);    }
private static LocalizableString L(string name)
{
return LocalizableString.Create<IDServerResource>(name);
}
}
public class IDServerPermissions
{
public const string GroupName = "IDServer";
public static class Audits
{
public const string AuditMannage = GroupName + ".Audits";
}
public static string[] GetAll()
{
return ReflectionHelper.GetPublicConstantsRecursively(typeof(IDServerPermissions));
}
}
权限名称本地化:Kingsun.Liujb.IDServer.Domain.Shared中的Localization⽬录中修改本地化Json⽂件
1 2 3 4 5 6 7"texts": {
"ManageYourProfile": "管理个⼈资料",
"SamplePageMessage": "IDServer模块的⽰例页⾯",  "Menu:AuditManagement": "审核⽇志",
"Audits": "⽇志",
"Permission:AuditManagement": "审核⽇志"
}
打开管理页⾯,可以看到新增的权限已经可以被管理
3,新增菜单
Kingsun.Liujb.IDServer.Web的Menu⽬录
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27public class IDServerMenuContributor : IMenuContributor
{
public async Task ConfigureMenuAsync(MenuConfigurationContext context)
{
if(context.Menu.Name == StandardMenus.Main)
{
await ConfigureMainMenu(context);
}
}
private async Task ConfigureMainMenu(MenuConfigurationContext context)
{
//Add main menu items.
var administrationMenu = context.Menu.GetAdministration();
var l = context.GetLocalizer<IDServerResource>();
var AuditlogsMenuItem = new ApplicationMenuItem(IDServerMenus.AuditManagementGroup, l["Menu:AuditManagement"], icon: "fa fa-file-text-o");          administrationMenu.AddItem(AuditlogsMenuItem);
if(await context.IsGrantedAsync(IDServerPermissions.Audits.AuditMannage))
{
AuditlogsMenuItem.AddItem(new ApplicationMenuItem(IDServerMenus.AuditManagementSelect,
l["Audits"], url: "~/Audit"));
}
}
}
private const string Prefix = "IDServer";
public const string AuditManagementGroup = "AuditManagement";
public const string AuditManagementSelect = AuditManagementGroup + ".AuditLogs";
菜单名称本地化参考权限名称本地化,修改本地化json⽂件即可。打开管理页⾯,看到管理菜单已经添加了⽇志⽬录
4,新增⽇志查看页⾯
Index.cshtml
1
2 3 4 5 6 7 8@page
@using Microsoft.Extensions.Localization
@using Kingsun.Liujb.IDServer.Localization
@model Kingsun.Liujb.IDServer.Web.Pages.IDServer.IndexModel @inject IStringLocalizer<IDServerResource> L
@section scripts{
<abp-script src="/Pages/Audit/Index.js"/>

本文发布于:2023-05-09 23:03:22,感谢您对本站的认可!

本文链接:https://patent.en369.cn/patent/4/93780.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:管理   模块   服务   添加   权限   授权   认证   分层
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 369专利查询检索平台 豫ICP备2021025688号-20 网站地图