From 8421ee49a6f266497f4be3898e9b2cd4a1fdb56b Mon Sep 17 00:00:00 2001 From: "qianhao.xu" Date: Mon, 22 Jul 2024 15:12:00 +0800 Subject: [PATCH] 134 --- DOAN.Admin.WebApi/Program.cs | 11 ++++++----- DOAN.Admin.WebApi/appsettings.Development.json | 2 +- .../wwwroot/export/工单列表07-22-142245.xlsx | Bin 0 -> 4309 bytes DOAN.Repository/BaseRepository.cs | 3 ++- DOAN.Service/MES/dev/DeviceTaskExecuteService.cs | 3 ++- DOAN.ServiceCore/Filters/VerifyAttribute.cs | 7 ++++++- DOAN.Tasks/TaskScheduler/Job_Device_Execute.cs | 3 ++- Infrastructure/WebExtensions/JwtExtension.cs | 7 ++++--- 8 files changed, 23 insertions(+), 13 deletions(-) create mode 100644 DOAN.Admin.WebApi/wwwroot/export/工单列表07-22-142245.xlsx diff --git a/DOAN.Admin.WebApi/Program.cs b/DOAN.Admin.WebApi/Program.cs index dde3ee4..e45488e 100644 --- a/DOAN.Admin.WebApi/Program.cs +++ b/DOAN.Admin.WebApi/Program.cs @@ -10,10 +10,10 @@ using DOAN.Common.Cache; using DOAN.Infrastructure.WebExtensions; using DOAN.ServiceCore.Signalr; using DOAN.ServiceCore.SqlSugar; +using Infrastructure; var builder = WebApplication.CreateBuilder(args); -// NLog: Setup NLog for Dependency injection -//builder.Logging.ClearProviders(); + builder.Host.UseNLog(); // Add services to the container. @@ -100,7 +100,7 @@ var app = builder.Build(); InternalApp.ServiceProvider = app.Services; InternalApp.Configuration = builder.Configuration; InternalApp.WebHostEnvironment = app.Environment; -//初始化db +//初始化db sqlsugar builder.Services.AddDb(app.Environment); //使用全局异常中间件 @@ -147,9 +147,10 @@ app.UseDirectoryBrowser(new DirectoryBrowserOptions app.UseRouting(); app.UseCors("Policy");//要放在app.UseEndpoints前。 //app.UseHttpsRedirection(); - +// 认证 这意味着对于每一个进入应用的HTTP请求,框架都会尝试从请求中提取身份验证信息(如JWT token、cookies或其他身份验证机制提供的信息),并根据这些信息来创建或更新当前用户的身份信息(ClaimsPrincipal)。如果请求中包含了有效的身份验证凭据,那么用户将被认为是已认证的。 app.UseAuthentication(); -app.UseAuthorization(); +//授权 在app.UseAuthentication(); 之后调用的 app.UseAuthorization(); 则是启用授权功能。当授权中间件被调用时,它会检查请求上的[Authorize] 属性或其他策略,以确定用户是否有权限访问特定的资源或执行特定的操作。 +app.UseAuthorization(); //授权 //开启缓存 app.UseResponseCaching(); diff --git a/DOAN.Admin.WebApi/appsettings.Development.json b/DOAN.Admin.WebApi/appsettings.Development.json index 3769487..f762fe7 100644 --- a/DOAN.Admin.WebApi/appsettings.Development.json +++ b/DOAN.Admin.WebApi/appsettings.Development.json @@ -10,7 +10,7 @@ { //"Conn": "Data Source=139.224.232.211;User ID=root;Password=doantech123;Initial Catalog=GXAssembly;Port=3308", // "Conn": "Data Source=127.0.0.1;User ID=root;Password=123456;Initial Catalog=GXAssembly;Port=3306", - "Conn": "Data Source=192.168.0.58;User ID=root;Password=123456;Initial Catalog=GXAssembly;Port=3306", + "Conn": "Data Source=192.168.50.163;User ID=root;Password=123456;Initial Catalog=GXAssembly;Port=3306", "DbType": 0, //数据库类型 MySql = 0, SqlServer = 1, Oracle = 3,PgSql = 4 "ConfigId": "0", //多租户唯一标识 "IsAutoCloseConnection": true diff --git a/DOAN.Admin.WebApi/wwwroot/export/工单列表07-22-142245.xlsx b/DOAN.Admin.WebApi/wwwroot/export/工单列表07-22-142245.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..ed48f6b9c38b6cb7c2cd9eb36fd975eff5f8a915 GIT binary patch literal 4309 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 literal 0 HcmV?d00001 diff --git a/DOAN.Repository/BaseRepository.cs b/DOAN.Repository/BaseRepository.cs index b30211a..5b2ac6f 100644 --- a/DOAN.Repository/BaseRepository.cs +++ b/DOAN.Repository/BaseRepository.cs @@ -12,7 +12,7 @@ using DOAN.Model; namespace DOAN.Repository { /// - /// 数据仓库类 + /// 数据仓库类 TODO 配置 DbScoped.SugarScope 是 SqlSugar ORM 中的一个特性,主要用于管理数据库连接和事务。 /// /// public class BaseRepository : SimpleClient where T : class, new() @@ -30,6 +30,7 @@ namespace DOAN.Repository public BaseRepository(ISqlSugarClient context = null) : base(context) { //通过特性拿到ConfigId + // C# 中使用反射来获取一个类型 (T) 上定义的自定义属性 (TenantAttribute) 的值。 var configId = typeof(T).GetCustomAttribute()?.configId; if (configId != null) { diff --git a/DOAN.Service/MES/dev/DeviceTaskExecuteService.cs b/DOAN.Service/MES/dev/DeviceTaskExecuteService.cs index b28d515..af0a17c 100644 --- a/DOAN.Service/MES/dev/DeviceTaskExecuteService.cs +++ b/DOAN.Service/MES/dev/DeviceTaskExecuteService.cs @@ -13,6 +13,7 @@ using Mapster; using Microsoft.AspNetCore.Authentication; using Newtonsoft.Json.Linq; using SqlSugar; +using SqlSugar.IOC; namespace DOAN.Service.MES.dev { @@ -187,7 +188,7 @@ namespace DOAN.Service.MES.dev public int ScanEveryTask() { int result = 0; - List InitDataList = Context + List InitDataList = DbScoped.SugarScope.CopyNew() .Queryable() .Where(it => it.Status == 1) .Where(it => it.LifeCycleStart <= DateTime.Now) diff --git a/DOAN.ServiceCore/Filters/VerifyAttribute.cs b/DOAN.ServiceCore/Filters/VerifyAttribute.cs index 70a0caa..27cb062 100644 --- a/DOAN.ServiceCore/Filters/VerifyAttribute.cs +++ b/DOAN.ServiceCore/Filters/VerifyAttribute.cs @@ -29,12 +29,16 @@ namespace DOAN.Admin.WebApi.Filters noNeedCheck = controllerActionDescriptor.MethodInfo.GetCustomAttributes(inherit: true) .Any(a => a.GetType().Equals(typeof(AllowAnonymousAttribute))); } - + // 不需要校验token if (noNeedCheck) return; string ip = HttpContextExtension.GetClientUserIp(context.HttpContext); string url = context.HttpContext.Request.Path; + //是否有认证成功 + //这行代码是用来检查当前HTTP上下文中的用户是否已经被认证。这里是详细的解释 var isAuthed = context.HttpContext.User.Identity.IsAuthenticated; + + string osType = context.HttpContext.Request.Headers["os"]; //使用jwt token校验2020-11-21 TokenModel loginUser = JwtUtil.GetLoginUser(context.HttpContext); @@ -48,6 +52,7 @@ namespace DOAN.Admin.WebApi.Filters var CK = "token_" + loginUser.UserId; if (!CacheHelper.Exists(CK) && ts.TotalMinutes < 5) { + // 刷新token var newToken = JwtUtil.GenerateJwtToken(JwtUtil.AddClaims(loginUser)); CacheHelper.SetCache(CK, CK, 1); diff --git a/DOAN.Tasks/TaskScheduler/Job_Device_Execute.cs b/DOAN.Tasks/TaskScheduler/Job_Device_Execute.cs index 5b21f39..e2b3794 100644 --- a/DOAN.Tasks/TaskScheduler/Job_Device_Execute.cs +++ b/DOAN.Tasks/TaskScheduler/Job_Device_Execute.cs @@ -38,6 +38,7 @@ namespace DOAN.Tasks.TaskScheduler { AbstractTrigger trigger = (context as JobExecutionContextImpl).Trigger as AbstractTrigger; //var info = await tasksQzService.CopyNew().GetByIdAsync(trigger.JobName); + // CopyNew 在多线程环境中,为每个线程或任务创建新的 SugarScope 实例以避免线程安全问题 var info = await DbScoped.SugarScope.CopyNew().Queryable().FirstAsync(f => f.ID == trigger.JobName); if (info == null) { @@ -45,7 +46,7 @@ namespace DOAN.Tasks.TaskScheduler } int result = deviceTaskExecute.ScanEveryTask(); - logger.Info($"任务【{info.Name}】设备管理调度请求执行结果=" + result); + logger.Info($"(job)任务【{info.Name}】设备管理调度请求执行结果=" + result); } } diff --git a/Infrastructure/WebExtensions/JwtExtension.cs b/Infrastructure/WebExtensions/JwtExtension.cs index e9c58de..82a224c 100644 --- a/Infrastructure/WebExtensions/JwtExtension.cs +++ b/Infrastructure/WebExtensions/JwtExtension.cs @@ -11,14 +11,15 @@ namespace DOAN.Infrastructure.WebExtensions { public static void AddJwt(this IServiceCollection services) { + // 添加依赖 默认的身份验证方案为JWT承载 services.AddAuthentication(options => { options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme; options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme; - }).AddCookie() - .AddJwtBearer(o => + }).AddCookie() // 虽然主要使用的是JWT,.AddCookie()的调用可以为混合场景提供支持 + .AddJwtBearer(o => //具体配置JWT承载身份验证 { - o.TokenValidationParameters = JwtUtil.ValidParameters(); + o.TokenValidationParameters = JwtUtil.ValidParameters(); //通常是一个包含了用于验证JWT的公钥、颁发者、接收者等信息的TokenValidationParameters对象。 o.Events = new JwtBearerEvents { OnAuthenticationFailed = context =>