feat: 优化权限使用方式
This commit is contained in:
3
Yi.Framework.Net6/Build.props
Normal file
3
Yi.Framework.Net6/Build.props
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
<Project>
|
||||||
|
|
||||||
|
</Project>
|
||||||
90
Yi.Framework.Net6/Version.cs
Normal file
90
Yi.Framework.Net6/Version.cs
Normal file
@@ -0,0 +1,90 @@
|
|||||||
|
|
||||||
|
using System.Reflection;
|
||||||
|
using System.Runtime.InteropServices;
|
||||||
|
|
||||||
|
[assembly: AssemblyCompany("YiFramework")]
|
||||||
|
[assembly: AssemblyFileVersion(VersionInfo.FullVersion)]
|
||||||
|
[assembly: AssemblyInformationalVersion(VersionInfo.FullVersion)]
|
||||||
|
[assembly: AssemblyVersion(VersionInfo.FullVersion)]
|
||||||
|
[assembly: ComVisible(false)]
|
||||||
|
|
||||||
|
#pragma warning disable IDE1006 // 命名样式
|
||||||
|
internal static class VersionInfo
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 主版本: 项目进行了重大修改,导致不再向下兼容,主版本号加1,其它版本号清0;
|
||||||
|
/// </summary>
|
||||||
|
public const string Major = "1";
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 次版本:项目进行了重构,增加了功能,但向下兼容,子版本号加1,主版本号不变, 修正版本号清0;
|
||||||
|
/// </summary>
|
||||||
|
public const string Minor = "1";
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 生成号
|
||||||
|
/// </summary>
|
||||||
|
public const string Build = "0";
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 修订号:项目进行了Bug修复,向下兼容,修正版本号加1,主版本号、子版本号不 变;
|
||||||
|
/// </summary>
|
||||||
|
public const string Revision = "0";
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 版本名称
|
||||||
|
/// </summary>
|
||||||
|
public const string VersionName = null;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 版本
|
||||||
|
/// </summary>
|
||||||
|
public const string FullVersion = Major + "." + Minor + "." + Build + "." + Revision;
|
||||||
|
#pragma warning disable CS1570 // XML 注释出现 XML 格式错误
|
||||||
|
/// <summary>
|
||||||
|
/// 比较 a,b两个版本
|
||||||
|
/// 当 a > b 时,返回 1
|
||||||
|
/// 当 a = b 时,返回 0
|
||||||
|
/// 当 a < b 时,返回 -1
|
||||||
|
/// </summary>
|
||||||
|
#pragma warning restore CS1570 // XML 注释出现 XML 格式错误
|
||||||
|
public static int Compare(this Version a, Version b)
|
||||||
|
|
||||||
|
{
|
||||||
|
// 比较主版本
|
||||||
|
if (a.Major != b.Major)
|
||||||
|
{
|
||||||
|
return a.Major > b.Major ? 1 : -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 比较次版本
|
||||||
|
if (a.Minor != b.Minor)
|
||||||
|
{
|
||||||
|
return a.Minor > b.Minor ? 1 : -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 比较生成号
|
||||||
|
if (a.Build < 0 || b.Build < 0)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (a.Build != b.Build)
|
||||||
|
{
|
||||||
|
return a.Build > b.Build ? 1 : -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 比较修订号
|
||||||
|
if (a.Revision < 0 || b.Revision < 0)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
if (a.Revision != b.Revision)
|
||||||
|
{
|
||||||
|
return a.Revision > b.Revision ? 1 : -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
#pragma warning restore IDE1006 // 命名样式
|
||||||
|
}
|
||||||
@@ -85,7 +85,15 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Yi.RBAC.Web", "src\project\
|
|||||||
EndProject
|
EndProject
|
||||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Yi.Framework.ThumbnailSharp", "src\module\Yi.Framework.ThumbnailSharp\Yi.Framework.ThumbnailSharp.csproj", "{60E54034-792C-4A90-BCDF-4D5FFB45089E}"
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Yi.Framework.ThumbnailSharp", "src\module\Yi.Framework.ThumbnailSharp\Yi.Framework.ThumbnailSharp.csproj", "{60E54034-792C-4A90-BCDF-4D5FFB45089E}"
|
||||||
EndProject
|
EndProject
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Yi.Framework.EventBus", "src\module\Yi.Framework.EventBus\Yi.Framework.EventBus.csproj", "{FC559052-36EC-4379-B447-298FAD6045F4}"
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Yi.Framework.EventBus", "src\module\Yi.Framework.EventBus\Yi.Framework.EventBus.csproj", "{FC559052-36EC-4379-B447-298FAD6045F4}"
|
||||||
|
EndProject
|
||||||
|
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{12EA3BCF-8991-4010-B41E-67C476CBA690}"
|
||||||
|
ProjectSection(SolutionItems) = preProject
|
||||||
|
Build.props = Build.props
|
||||||
|
..\readme\git提交规范.txt = ..\readme\git提交规范.txt
|
||||||
|
src\project\rbac\GlobalUsings.cs = src\project\rbac\GlobalUsings.cs
|
||||||
|
Version.cs = Version.cs
|
||||||
|
EndProjectSection
|
||||||
EndProject
|
EndProject
|
||||||
Global
|
Global
|
||||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||||
|
|||||||
@@ -17,30 +17,13 @@ namespace Yi.Framework.Auth.JwtBearer.Authorization
|
|||||||
|
|
||||||
public class PermissionAttribute : ActionFilterAttribute
|
public class PermissionAttribute : ActionFilterAttribute
|
||||||
{
|
{
|
||||||
private string Permission { get; set; }
|
internal string Code { get; set; }
|
||||||
|
|
||||||
public PermissionAttribute(string permission)
|
public PermissionAttribute(string code)
|
||||||
{
|
{
|
||||||
this.Permission = permission;
|
this.Code = code;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 动作鉴权
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="context"></param>
|
|
||||||
/// <exception cref="Exception"></exception>
|
|
||||||
public override void OnActionExecuting(ActionExecutingContext context)
|
|
||||||
{
|
|
||||||
|
|
||||||
var permissionHandler = ServiceLocatorModel.Instance.GetRequiredService<IPermissionHandler>();
|
|
||||||
|
|
||||||
var result = permissionHandler.IsPass(Permission);
|
|
||||||
|
|
||||||
if (!result)
|
|
||||||
{
|
|
||||||
throw new AuthException(message: $"您无权限访问该接口-{ context.HttpContext.Request.Path.Value}");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,35 @@
|
|||||||
|
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.Auth.JwtBearer.Authorization;
|
||||||
|
using Yi.Framework.Core.Exceptions;
|
||||||
|
|
||||||
|
namespace SF.AspNetCore.Auth.Authorization;
|
||||||
|
public 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}");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,5 +1,7 @@
|
|||||||
using Microsoft.AspNetCore.Builder;
|
using Microsoft.AspNetCore.Builder;
|
||||||
using Microsoft.Extensions.DependencyInjection;
|
using Microsoft.Extensions.DependencyInjection;
|
||||||
|
using Microsoft.Extensions.Options;
|
||||||
|
using SF.AspNetCore.Auth.Authorization;
|
||||||
using StartupModules;
|
using StartupModules;
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
@@ -32,6 +34,10 @@ namespace Yi.Framework.Auth.JwtBearer
|
|||||||
{
|
{
|
||||||
option.AddScheme<YiJwtAuthenticationHandler>(YiJwtAuthenticationHandler.YiJwtSchemeName, YiJwtAuthenticationHandler.YiJwtSchemeName);
|
option.AddScheme<YiJwtAuthenticationHandler>(YiJwtAuthenticationHandler.YiJwtSchemeName, YiJwtAuthenticationHandler.YiJwtSchemeName);
|
||||||
});
|
});
|
||||||
|
services.AddSingleton<PermissionGlobalAttribute>();
|
||||||
|
services.AddControllers(options => {
|
||||||
|
options.Filters.Add<PermissionGlobalAttribute>();
|
||||||
|
});
|
||||||
//services.AddSingleton<PermissionAttribute>();
|
//services.AddSingleton<PermissionAttribute>();
|
||||||
//services.AddControllers(options => {
|
//services.AddControllers(options => {
|
||||||
// options.Filters.Add<PermissionAttribute>();
|
// options.Filters.Add<PermissionAttribute>();
|
||||||
|
|||||||
@@ -11,6 +11,7 @@ using Yi.RBAC.Domain.Identity.Repositories;
|
|||||||
using SqlSugar;
|
using SqlSugar;
|
||||||
using Mapster;
|
using Mapster;
|
||||||
using Microsoft.AspNetCore.Mvc;
|
using Microsoft.AspNetCore.Mvc;
|
||||||
|
using Yi.Framework.Auth.JwtBearer.Authorization;
|
||||||
|
|
||||||
namespace Yi.RBAC.Application.Identity
|
namespace Yi.RBAC.Application.Identity
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -10,7 +10,5 @@ namespace Yi.RBAC.Domain.Shared.Identity.Etos
|
|||||||
{
|
{
|
||||||
public long UserId { get; set; }
|
public long UserId { get; set; }
|
||||||
public string UserName { get; set; }
|
public string UserName { get; set; }
|
||||||
|
|
||||||
public string LogMsg { get; set; }
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -741,6 +741,20 @@
|
|||||||
登录信息
|
登录信息
|
||||||
</summary>
|
</summary>
|
||||||
</member>
|
</member>
|
||||||
|
<member name="M:Yi.RBAC.Domain.Logs.Event.LoginEventHandler.GetClientInfo(Microsoft.AspNetCore.Http.HttpContext)">
|
||||||
|
<summary>
|
||||||
|
获取客户端信息
|
||||||
|
</summary>
|
||||||
|
<param name="context"></param>
|
||||||
|
<returns></returns>
|
||||||
|
</member>
|
||||||
|
<member name="M:Yi.RBAC.Domain.Logs.Event.LoginEventHandler.GetLoginLogInfo(Microsoft.AspNetCore.Http.HttpContext)">
|
||||||
|
<summary>
|
||||||
|
记录用户登陆信息
|
||||||
|
</summary>
|
||||||
|
<param name="context"></param>
|
||||||
|
<returns></returns>
|
||||||
|
</member>
|
||||||
<member name="T:Yi.RBAC.Domain.Setting.Entities.ConfigEntity">
|
<member name="T:Yi.RBAC.Domain.Setting.Entities.ConfigEntity">
|
||||||
<summary>
|
<summary>
|
||||||
配置表
|
配置表
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
using Cike.EventBus.EventHandlerAbstracts;
|
using Cike.EventBus.EventHandlerAbstracts;
|
||||||
|
using IPTools.Core;
|
||||||
using Microsoft.AspNetCore.Http;
|
using Microsoft.AspNetCore.Http;
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
@@ -6,6 +7,8 @@ using System.Linq;
|
|||||||
using System.Net.Http;
|
using System.Net.Http;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
using UAParser;
|
||||||
|
using Yi.Framework.AspNetCore.Extensions;
|
||||||
using Yi.Framework.Ddd.Repositories;
|
using Yi.Framework.Ddd.Repositories;
|
||||||
using Yi.RBAC.Domain.Logs.Entities;
|
using Yi.RBAC.Domain.Logs.Entities;
|
||||||
using Yi.RBAC.Domain.Shared.Identity.Etos;
|
using Yi.RBAC.Domain.Shared.Identity.Etos;
|
||||||
@@ -23,14 +26,56 @@ namespace Yi.RBAC.Domain.Logs.Event
|
|||||||
}
|
}
|
||||||
public Task HandlerAsync(LoginEventArgs eventData)
|
public Task HandlerAsync(LoginEventArgs eventData)
|
||||||
{
|
{
|
||||||
var loginLogEntity = new LoginLogEntity();
|
var loginLogEntity = GetLoginLogInfo(_httpContext);
|
||||||
loginLogEntity.Id = SnowflakeHelper.NextId;
|
loginLogEntity.Id = SnowflakeHelper.NextId;
|
||||||
loginLogEntity.LogMsg = eventData.LogMsg;
|
loginLogEntity.LogMsg = eventData.UserName + "登录系统";
|
||||||
loginLogEntity.LoginUser = eventData.UserName;
|
loginLogEntity.LoginUser = eventData.UserName;
|
||||||
|
loginLogEntity.LoginIp = _httpContext.GetClientIp();
|
||||||
|
|
||||||
_loginLogRepository.InsertAsync(loginLogEntity);
|
_loginLogRepository.InsertAsync(loginLogEntity);
|
||||||
Console.WriteLine(eventData.UserName + "登录系统");
|
|
||||||
return Task.CompletedTask;
|
return Task.CompletedTask;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 获取客户端信息
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="context"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
private static ClientInfo GetClientInfo(HttpContext context)
|
||||||
|
{
|
||||||
|
var str = context.GetUserAgent();
|
||||||
|
var uaParser = Parser.GetDefault();
|
||||||
|
ClientInfo c = uaParser.Parse(str);
|
||||||
|
return c;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 记录用户登陆信息
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="context"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
private static LoginLogEntity GetLoginLogInfo(HttpContext context)
|
||||||
|
{
|
||||||
|
var ipAddr = context.GetClientIp();
|
||||||
|
IpInfo location;
|
||||||
|
if (ipAddr == "127.0.0.1")
|
||||||
|
{
|
||||||
|
location = new IpInfo() { Province = "本地", City = "本机" };
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
location = IpTool.Search(ipAddr);
|
||||||
|
}
|
||||||
|
ClientInfo clientInfo = GetClientInfo(context);
|
||||||
|
LoginLogEntity entity = new()
|
||||||
|
{
|
||||||
|
Browser = clientInfo.Device.Family,
|
||||||
|
Os = clientInfo.OS.ToString(),
|
||||||
|
LoginIp = ipAddr,
|
||||||
|
LoginLocation = location.Province + "-" + location.City
|
||||||
|
};
|
||||||
|
|
||||||
|
return entity;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -12,6 +12,8 @@
|
|||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="Hei.Captcha" Version="0.3.0" />
|
<PackageReference Include="Hei.Captcha" Version="0.3.0" />
|
||||||
|
<PackageReference Include="IPTools.China" Version="1.6.0" />
|
||||||
|
<PackageReference Include="UAParser" Version="3.1.47" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ProjectReference Include="..\..\..\framework\Yi.Framework.Data\Yi.Framework.Data.csproj" />
|
<ProjectReference Include="..\..\..\framework\Yi.Framework.Data\Yi.Framework.Data.csproj" />
|
||||||
|
|||||||
@@ -16,6 +16,9 @@
|
|||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
<None Update="ip2region.db">
|
||||||
|
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||||
|
</None>
|
||||||
<None Update="key.pem">
|
<None Update="key.pem">
|
||||||
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||||
</None>
|
</None>
|
||||||
|
|||||||
BIN
Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Web/ip2region.db
Normal file
BIN
Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Web/ip2region.db
Normal file
Binary file not shown.
Reference in New Issue
Block a user