From 85d1cbff34b4f37e1613460e16893f44c2e0e68e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=A9=99=E5=AD=90?= <454313500@qq.com> Date: Tue, 18 Apr 2023 20:29:53 +0800 Subject: [PATCH] =?UTF-8?q?feat=EF=BC=9A=E6=B7=BB=E5=8A=A0=E4=BB=A4?= =?UTF-8?q?=E7=89=8C=E6=95=88=E9=AA=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../AspNetCore/PermissionGlobalAttribute.cs | 37 +++++++++++++++++++ .../Attributes/PermissionAttribute.cs | 23 ++++++++++++ .../Auth/DefaultPermissionHandler.cs | 34 +++++++++++++++++ .../Auth/IPermissionHandler.cs | 13 +++++++ .../Yi.Framework.Infrastructure/Startup.cs | 8 ++++ .../Rbac/Services/Impl/UserService.cs | 2 + 6 files changed, 117 insertions(+) create mode 100644 Yi.Furion.Net6/Yi.Framework.Infrastructure/AspNetCore/PermissionGlobalAttribute.cs create mode 100644 Yi.Furion.Net6/Yi.Framework.Infrastructure/Attributes/PermissionAttribute.cs create mode 100644 Yi.Furion.Net6/Yi.Framework.Infrastructure/Auth/DefaultPermissionHandler.cs create mode 100644 Yi.Furion.Net6/Yi.Framework.Infrastructure/Auth/IPermissionHandler.cs diff --git a/Yi.Furion.Net6/Yi.Framework.Infrastructure/AspNetCore/PermissionGlobalAttribute.cs b/Yi.Furion.Net6/Yi.Framework.Infrastructure/AspNetCore/PermissionGlobalAttribute.cs new file mode 100644 index 00000000..fee93b3d --- /dev/null +++ b/Yi.Furion.Net6/Yi.Framework.Infrastructure/AspNetCore/PermissionGlobalAttribute.cs @@ -0,0 +1,37 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Mvc.Controllers; +using Microsoft.AspNetCore.Mvc.Filters; +using Yi.Framework.Infrastructure.Attributes; +using Yi.Framework.Infrastructure.Auth; +using Yi.Framework.Infrastructure.Exceptions; + +namespace Yi.Framework.Infrastructure.AspNetCore +{ + internal class PermissionGlobalAttribute : ActionFilterAttribute + { + private readonly IPermissionHandler _permissionHandler; + public PermissionGlobalAttribute(IPermissionHandler permissionHandler) + { + _permissionHandler = permissionHandler; + } + public override void OnActionExecuting(ActionExecutingContext context) + { + if (context.ActionDescriptor is not ControllerActionDescriptor controllerActionDescriptor) return; + PermissionAttribute? perAttribute = controllerActionDescriptor.MethodInfo.GetCustomAttributes(inherit: true) + .FirstOrDefault(a => a.GetType().Equals(typeof(PermissionAttribute))) as PermissionAttribute; + //空对象直接返回 + if (perAttribute is null) return; + + var result = _permissionHandler.IsPass(perAttribute.Code); + + if (!result) + { + throw new AuthException(message: $"您无权限访问该接口-{context.HttpContext.Request.Path.Value}"); + } + } + } +} \ No newline at end of file diff --git a/Yi.Furion.Net6/Yi.Framework.Infrastructure/Attributes/PermissionAttribute.cs b/Yi.Furion.Net6/Yi.Framework.Infrastructure/Attributes/PermissionAttribute.cs new file mode 100644 index 00000000..41cc1543 --- /dev/null +++ b/Yi.Furion.Net6/Yi.Framework.Infrastructure/Attributes/PermissionAttribute.cs @@ -0,0 +1,23 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Mvc.Filters; + +namespace Yi.Framework.Infrastructure.Attributes +{ + [AttributeUsage(AttributeTargets.Method)] + + public class PermissionAttribute : ActionFilterAttribute + { + internal string Code { get; set; } + + public PermissionAttribute(string code) + { + Code = code; + } + + + } +} diff --git a/Yi.Furion.Net6/Yi.Framework.Infrastructure/Auth/DefaultPermissionHandler.cs b/Yi.Furion.Net6/Yi.Framework.Infrastructure/Auth/DefaultPermissionHandler.cs new file mode 100644 index 00000000..595e4a37 --- /dev/null +++ b/Yi.Furion.Net6/Yi.Framework.Infrastructure/Auth/DefaultPermissionHandler.cs @@ -0,0 +1,34 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Yi.Framework.Infrastructure.CurrentUsers; + +namespace Yi.Framework.Infrastructure.Auth +{ + public class DefaultPermissionHandler : IPermissionHandler + { + private ICurrentUser _currentUser { get; set; } + + public DefaultPermissionHandler(ICurrentUser currentUser) + { + _currentUser = currentUser; + } + public bool IsPass(string permission) + { + if (_currentUser.Permission is not null) + { + if (_currentUser.Permission.Contains("*:*:*")) + { + return true; + } + + return _currentUser.Permission.Contains(permission); + + } + + return false; + } + } +} \ No newline at end of file diff --git a/Yi.Furion.Net6/Yi.Framework.Infrastructure/Auth/IPermissionHandler.cs b/Yi.Furion.Net6/Yi.Framework.Infrastructure/Auth/IPermissionHandler.cs new file mode 100644 index 00000000..3f4a50e6 --- /dev/null +++ b/Yi.Furion.Net6/Yi.Framework.Infrastructure/Auth/IPermissionHandler.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Yi.Framework.Infrastructure.Auth +{ + public interface IPermissionHandler + { + bool IsPass(string permission); + } +} diff --git a/Yi.Furion.Net6/Yi.Framework.Infrastructure/Startup.cs b/Yi.Furion.Net6/Yi.Framework.Infrastructure/Startup.cs index 8a58be65..b391068b 100644 --- a/Yi.Furion.Net6/Yi.Framework.Infrastructure/Startup.cs +++ b/Yi.Furion.Net6/Yi.Framework.Infrastructure/Startup.cs @@ -5,6 +5,7 @@ using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using StackExchange.Profiling.SqlFormatters; using Yi.Framework.Infrastructure.AspNetCore; +using Yi.Framework.Infrastructure.Auth; using Yi.Framework.Infrastructure.Data; using Yi.Framework.Infrastructure.Data.Filters; using Yi.Framework.Infrastructure.Sqlsugar; @@ -26,6 +27,13 @@ public class Startup : AppStartup services.AddUnitOfWork(); services.AddTransient(); + + + services.AddSingleton(); + services.AddSingleton(); + services.AddControllers(options => { + options.Filters.Add(); + }); } public void Configure(IApplicationBuilder app, IWebHostEnvironment env) diff --git a/Yi.Furion.Net6/Yi.Furion.Application/Rbac/Services/Impl/UserService.cs b/Yi.Furion.Net6/Yi.Furion.Application/Rbac/Services/Impl/UserService.cs index 58dfde6c..cbdf98ce 100644 --- a/Yi.Furion.Net6/Yi.Furion.Application/Rbac/Services/Impl/UserService.cs +++ b/Yi.Furion.Net6/Yi.Furion.Application/Rbac/Services/Impl/UserService.cs @@ -1,4 +1,5 @@ using SqlSugar; +using Yi.Framework.Infrastructure.Attributes; using Yi.Framework.Infrastructure.CurrentUsers; using Yi.Framework.Infrastructure.Ddd.Dtos; using Yi.Framework.Infrastructure.Ddd.Services; @@ -35,6 +36,7 @@ namespace Yi.Furion.Application.Rbac.Services.Impl /// /// /// + [Permission("system:user:list")] public override async Task> GetListAsync(UserGetListInputVo input) { var entity = await MapToEntityAsync(input);