diff --git a/OpenAuth.App/AppSetting.cs b/Infrastructure/AppSetting.cs similarity index 97% rename from OpenAuth.App/AppSetting.cs rename to Infrastructure/AppSetting.cs index 146f91f9..698468e1 100644 --- a/OpenAuth.App/AppSetting.cs +++ b/Infrastructure/AppSetting.cs @@ -1,4 +1,4 @@ -namespace OpenAuth.App +namespace Infrastructure { /// /// 配置项 diff --git a/OpenAuth.App/Define.cs b/Infrastructure/Define.cs similarity index 94% rename from OpenAuth.App/Define.cs rename to Infrastructure/Define.cs index 5ecd4d96..1e2bc4a5 100644 --- a/OpenAuth.App/Define.cs +++ b/Infrastructure/Define.cs @@ -1,32 +1,31 @@ -using System; - -namespace OpenAuth.App -{ - public static class Define - { - public static string USERROLE = "UserRole"; //用户角色关联KEY - public const string ROLERESOURCE= "RoleResource"; //角色资源关联KEY - public const string USERORG = "UserOrg"; //用户机构关联KEY - public const string ROLEELEMENT = "RoleElement"; //角色菜单关联KEY - public const string ROLEMODULE = "RoleModule"; //角色模块关联KEY - public const string ROLEDATAPROPERTY = "RoleDataProperty"; //角色数据字段权限 - - public const string DBTYPE_SQLSERVER = "SqlServer"; //sql server - public const string DBTYPE_MYSQL = "MySql"; //sql server - - - public const int INVALID_TOKEN = 50014; //token无效 - - public const string TOKEN_NAME = "X-Token"; - - - public const string SYSTEM_USERNAME = "System"; - public const string SYSTEM_USERPWD = "123456"; - - public const string DATAPRIVILEGE_LOGINUSER = "{loginUser}"; //数据权限配置中,当前登录用户的key - public const string DATAPRIVILEGE_LOGINROLE = "{loginRole}"; //数据权限配置中,当前登录用户角色的key - public const string DATAPRIVILEGE_LOGINORG = "{loginOrg}"; //数据权限配置中,当前登录用户部门的key - - public const string JOBMAPKEY = "OpenJob"; - } -} +namespace Infrastructure +{ + public static class Define + { + public static string USERROLE = "UserRole"; //用户角色关联KEY + public const string ROLERESOURCE= "RoleResource"; //角色资源关联KEY + public const string USERORG = "UserOrg"; //用户机构关联KEY + public const string ROLEELEMENT = "RoleElement"; //角色菜单关联KEY + public const string ROLEMODULE = "RoleModule"; //角色模块关联KEY + public const string ROLEDATAPROPERTY = "RoleDataProperty"; //角色数据字段权限 + + public const string DBTYPE_SQLSERVER = "SqlServer"; //sql server + public const string DBTYPE_MYSQL = "MySql"; //sql server + + + public const int INVALID_TOKEN = 50014; //token无效 + + public const string TOKEN_NAME = "X-Token"; + public const string TENANT_ID = "tenantId"; + + + public const string SYSTEM_USERNAME = "System"; + public const string SYSTEM_USERPWD = "123456"; + + public const string DATAPRIVILEGE_LOGINUSER = "{loginUser}"; //数据权限配置中,当前登录用户的key + public const string DATAPRIVILEGE_LOGINROLE = "{loginRole}"; //数据权限配置中,当前登录用户角色的key + public const string DATAPRIVILEGE_LOGINORG = "{loginOrg}"; //数据权限配置中,当前登录用户部门的key + + public const string JOBMAPKEY = "OpenJob"; + } +} diff --git a/Infrastructure/Infrastructure.csproj b/Infrastructure/Infrastructure.csproj index adfbad38..1a26d828 100644 --- a/Infrastructure/Infrastructure.csproj +++ b/Infrastructure/Infrastructure.csproj @@ -11,7 +11,7 @@ - + diff --git a/OpenAuth.App/AuthContextFactory.cs b/OpenAuth.App/AuthContextFactory.cs index 6bd10143..8070382a 100644 --- a/OpenAuth.App/AuthContextFactory.cs +++ b/OpenAuth.App/AuthContextFactory.cs @@ -14,6 +14,7 @@ // // *********************************************************************** +using Infrastructure; using OpenAuth.Repository; using OpenAuth.Repository.Domain; using OpenAuth.Repository.Interface; diff --git a/OpenAuth.App/Jobs/SysLogJob.cs b/OpenAuth.App/Jobs/SysLogJob.cs index b951e170..19dfa754 100644 --- a/OpenAuth.App/Jobs/SysLogJob.cs +++ b/OpenAuth.App/Jobs/SysLogJob.cs @@ -1,4 +1,5 @@ using System.Threading.Tasks; +using Infrastructure; using Quartz; namespace OpenAuth.App.Jobs diff --git a/OpenAuth.App/RevelanceManagerApp.cs b/OpenAuth.App/RevelanceManagerApp.cs index 46c83595..583ec784 100644 --- a/OpenAuth.App/RevelanceManagerApp.cs +++ b/OpenAuth.App/RevelanceManagerApp.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Linq; +using Infrastructure; using Microsoft.Extensions.Logging; using OpenAuth.App.Interface; using OpenAuth.App.Request; diff --git a/OpenAuth.App/RoleApp.cs b/OpenAuth.App/RoleApp.cs index 52638a9b..26e7eda1 100644 --- a/OpenAuth.App/RoleApp.cs +++ b/OpenAuth.App/RoleApp.cs @@ -5,6 +5,7 @@ using OpenAuth.App.Response; using OpenAuth.Repository.Domain; using OpenAuth.Repository.Interface; using System.Linq; +using Infrastructure; using OpenAuth.App.Request; using OpenAuth.Repository; diff --git a/OpenAuth.App/SSO/LocalAuth.cs b/OpenAuth.App/SSO/LocalAuth.cs index 4697dfc0..e9d48722 100644 --- a/OpenAuth.App/SSO/LocalAuth.cs +++ b/OpenAuth.App/SSO/LocalAuth.cs @@ -2,6 +2,7 @@ using Infrastructure.Cache; using Microsoft.AspNetCore.Http; using OpenAuth.App.Interface; using System; +using Infrastructure; using Microsoft.Extensions.Options; using OpenAuth.Repository.Domain; diff --git a/OpenAuth.App/SSO/LoginParse.cs b/OpenAuth.App/SSO/LoginParse.cs index c0ef160e..5e92cd9e 100644 --- a/OpenAuth.App/SSO/LoginParse.cs +++ b/OpenAuth.App/SSO/LoginParse.cs @@ -3,6 +3,7 @@ * 处理登录逻辑,验证客户段提交的账号密码,保存登录信息 */ using System; +using Infrastructure; using Infrastructure.Cache; using OpenAuth.Repository; using OpenAuth.Repository.Domain; diff --git a/OpenAuth.App/Test/TestAsync.cs b/OpenAuth.App/Test/TestAsync.cs index 97ac2718..3c870886 100644 --- a/OpenAuth.App/Test/TestAsync.cs +++ b/OpenAuth.App/Test/TestAsync.cs @@ -1,6 +1,7 @@ using System; using System.Threading; using System.Threading.Tasks; +using Infrastructure; using Infrastructure.Cache; using Microsoft.AspNetCore.Http; using Microsoft.Extensions.DependencyInjection; diff --git a/OpenAuth.App/Test/TestBase.cs b/OpenAuth.App/Test/TestBase.cs index 7ae9041a..d36f7b26 100644 --- a/OpenAuth.App/Test/TestBase.cs +++ b/OpenAuth.App/Test/TestBase.cs @@ -1,7 +1,10 @@ using Autofac.Extensions.DependencyInjection; +using Infrastructure; using Infrastructure.Cache; using Infrastructure.Extensions.AutofacManager; +using Microsoft.AspNetCore.Http; using Microsoft.EntityFrameworkCore; +using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Options; using Moq; @@ -23,12 +26,24 @@ namespace OpenAuth.App.Test serviceCollection.AddOptions(); serviceCollection.AddLogging(); + //模拟配置文件 var optionMock = new Mock>(); optionMock.Setup(x => x.Value).Returns(new AppSetting { DbType = Define.DBTYPE_MYSQL}); serviceCollection.AddScoped(x => optionMock.Object); - // 测试my sql - serviceCollection.AddDbContext(options => + //模拟多租户id + var configMock = new Mock(); + configMock.Setup(x => x.GetSection("ConnectionStrings")[Define.TENANT_ID]).Returns(""); + serviceCollection.AddScoped(x => configMock.Object); + + var httpContextAccessorMock = new Mock(); + httpContextAccessorMock.Setup(x => x.HttpContext.Request.Query[Define.TOKEN_NAME]).Returns("tokentest"); + httpContextAccessorMock.Setup(x => x.HttpContext.Request.Query[Define.TENANT_ID]).Returns("OpenAuthDBContext"); + + serviceCollection.AddScoped(x => httpContextAccessorMock.Object); + + // 测试my sql + serviceCollection.AddDbContext(options => options.UseMySql("server=127.0.0.1;user id=root;database=openauthdb;password=000000")); // serviceCollection.AddDbContext(options => diff --git a/OpenAuth.App/Test/TestBuilder.cs b/OpenAuth.App/Test/TestBuilder.cs index 0c8abe31..38b75983 100644 --- a/OpenAuth.App/Test/TestBuilder.cs +++ b/OpenAuth.App/Test/TestBuilder.cs @@ -1,6 +1,7 @@ using System.IO; using System.Net.Http; using System.Reflection; +using Infrastructure; using Infrastructure.Cache; using Infrastructure.Provider; using Microsoft.AspNetCore.Http; diff --git a/OpenAuth.App/Test/TestFileApp.cs b/OpenAuth.App/Test/TestFileApp.cs index 40cc576e..a546c21b 100644 --- a/OpenAuth.App/Test/TestFileApp.cs +++ b/OpenAuth.App/Test/TestFileApp.cs @@ -23,10 +23,6 @@ namespace OpenAuth.App.Test cachemock.Setup(x => x.Get("tokentest")).Returns(new UserAuthSession { Account = Define.SYSTEM_USERNAME }); services.AddScoped(x => cachemock.Object); - var httpContextAccessorMock = new Mock(); - httpContextAccessorMock.Setup(x => x.HttpContext.Request.Query[Define.TOKEN_NAME]).Returns("tokentest"); - - services.AddScoped(x => httpContextAccessorMock.Object); var logMock = new Mock>(); services.AddScoped(x => logMock.Object); diff --git a/OpenAuth.App/Test/TestFlow.cs b/OpenAuth.App/Test/TestFlow.cs index b2244e24..4c64affe 100644 --- a/OpenAuth.App/Test/TestFlow.cs +++ b/OpenAuth.App/Test/TestFlow.cs @@ -1,4 +1,5 @@ using System.Net.Http; +using Infrastructure; using Infrastructure.Cache; using Microsoft.AspNetCore.Http; using NUnit.Framework; diff --git a/OpenAuth.App/Test/TestFrmLeaveReq.cs b/OpenAuth.App/Test/TestFrmLeaveReq.cs index 9e28c25a..5aa3f5ef 100644 --- a/OpenAuth.App/Test/TestFrmLeaveReq.cs +++ b/OpenAuth.App/Test/TestFrmLeaveReq.cs @@ -1,4 +1,5 @@ -using Infrastructure.Cache; +using Infrastructure; +using Infrastructure.Cache; using Microsoft.AspNetCore.Http; using NUnit.Framework; using Microsoft.Extensions.DependencyInjection; diff --git a/OpenAuth.App/UserManagerApp.cs b/OpenAuth.App/UserManagerApp.cs index 100e9900..2edda148 100644 --- a/OpenAuth.App/UserManagerApp.cs +++ b/OpenAuth.App/UserManagerApp.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using Castle.Core.Internal; +using Infrastructure; using Infrastructure.Extensions; using OpenAuth.App.Interface; using OpenAuth.App.Request; diff --git a/OpenAuth.Identity/CustomProfileService.cs b/OpenAuth.Identity/CustomProfileService.cs index 0c6eb477..b2bbdf6a 100644 --- a/OpenAuth.Identity/CustomProfileService.cs +++ b/OpenAuth.Identity/CustomProfileService.cs @@ -6,6 +6,7 @@ using IdentityServer4.Extensions; using IdentityServer4.Models; using IdentityServer4.Services; using IdentityServer4.Test; +using Infrastructure; using Microsoft.Extensions.Logging; using OpenAuth.App; using OpenAuth.Repository.Domain; diff --git a/OpenAuth.Identity/Quickstart/Account/AccountController.cs b/OpenAuth.Identity/Quickstart/Account/AccountController.cs index 64e93269..7e70b0cc 100644 --- a/OpenAuth.Identity/Quickstart/Account/AccountController.cs +++ b/OpenAuth.Identity/Quickstart/Account/AccountController.cs @@ -11,6 +11,7 @@ using IdentityServer4.Extensions; using IdentityServer4.Models; using IdentityServer4.Services; using IdentityServer4.Stores; +using Infrastructure; using Microsoft.AspNetCore.Authentication; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Http; diff --git a/OpenAuth.Identity/Quickstart/TestUsers.cs b/OpenAuth.Identity/Quickstart/TestUsers.cs index 59c163fe..7735c100 100644 --- a/OpenAuth.Identity/Quickstart/TestUsers.cs +++ b/OpenAuth.Identity/Quickstart/TestUsers.cs @@ -6,6 +6,7 @@ using System.Collections.Generic; using System.Security.Claims; using IdentityModel; using IdentityServer4.Test; +using Infrastructure; using OpenAuth.App; namespace OpenAuth.IdentityServer.Quickstart diff --git a/OpenAuth.Identity/Startup.cs b/OpenAuth.Identity/Startup.cs index a7bfa8c4..0f1e241a 100644 --- a/OpenAuth.Identity/Startup.cs +++ b/OpenAuth.Identity/Startup.cs @@ -3,6 +3,7 @@ using Autofac; +using Infrastructure; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Http; using Microsoft.EntityFrameworkCore; diff --git a/OpenAuth.Repository/OpenAuth.Repository.csproj b/OpenAuth.Repository/OpenAuth.Repository.csproj index 7dc37830..1e3d9224 100644 --- a/OpenAuth.Repository/OpenAuth.Repository.csproj +++ b/OpenAuth.Repository/OpenAuth.Repository.csproj @@ -13,6 +13,7 @@ + diff --git a/OpenAuth.Repository/OpenAuthDBContext.cs b/OpenAuth.Repository/OpenAuthDBContext.cs index 46405a7e..28a589a3 100644 --- a/OpenAuth.Repository/OpenAuthDBContext.cs +++ b/OpenAuth.Repository/OpenAuthDBContext.cs @@ -1,7 +1,9 @@ -using System; +using Infrastructure; +using Microsoft.AspNetCore.Http; using Microsoft.EntityFrameworkCore; +using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Logging; -using Microsoft.Extensions.Logging.Console; +using Microsoft.Extensions.Options; using OpenAuth.Repository.Domain; using OpenAuth.Repository.QueryObj; @@ -12,21 +14,64 @@ namespace OpenAuth.Repository { private ILoggerFactory _LoggerFactory; - - protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) - { - optionsBuilder.EnableSensitiveDataLogging (true); //允许打印参数 - optionsBuilder.UseLoggerFactory (_LoggerFactory); + private IHttpContextAccessor _httpContextAccessor; + private IConfiguration _configuration; + private IOptions _appConfiguration; - base.OnConfiguring (optionsBuilder); - } - - public OpenAuthDBContext(DbContextOptions options, ILoggerFactory loggerFactory) + public OpenAuthDBContext(DbContextOptions options, ILoggerFactory loggerFactory, + IHttpContextAccessor httpContextAccessor, IConfiguration configuration, IOptions appConfiguration) : base(options) { _LoggerFactory = loggerFactory; + _httpContextAccessor = httpContextAccessor; + _configuration = configuration; + _appConfiguration = appConfiguration; } - + + protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) + { + optionsBuilder.EnableSensitiveDataLogging(true); //允许打印参数 + optionsBuilder.UseLoggerFactory(_LoggerFactory); + InitTenant(optionsBuilder); + base.OnConfiguring(optionsBuilder); + } + + //初始化多租户信息,根据租户id调整数据库 + private void InitTenant(DbContextOptionsBuilder optionsBuilder) + { + if (_httpContextAccessor == null || _httpContextAccessor.HttpContext == null) + { + return; + } + + //读取多租户ID + string tenantId = _httpContextAccessor.HttpContext.Request.Query[Define.TENANT_ID]; + if (string.IsNullOrEmpty(tenantId)) + { + tenantId = _httpContextAccessor.HttpContext.Request.Headers[Define.TENANT_ID]; + } + + //如果没有租户id,或租户用的是默认的OpenAuthDBContext,则不做任何调整 + if (string.IsNullOrEmpty(tenantId) || tenantId == "OpenAuthDBContext") + { + return; + } + + string connect = _configuration.GetConnectionString(tenantId); + if (string.IsNullOrEmpty(connect)) return; + + var dbType =_appConfiguration.Value.DbType; + if (dbType == Define.DBTYPE_SQLSERVER) + { + optionsBuilder.UseSqlServer(connect); + } + else //mysql + { + optionsBuilder.UseMySql(connect); + } + + } + protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity() diff --git a/OpenAuth.Repository/Test/TestBase.cs b/OpenAuth.Repository/Test/TestBase.cs index 63391726..8ee7e1d3 100644 --- a/OpenAuth.Repository/Test/TestBase.cs +++ b/OpenAuth.Repository/Test/TestBase.cs @@ -1,8 +1,13 @@ using System.Reflection; using Autofac; using Autofac.Extensions.DependencyInjection; +using Infrastructure; +using Microsoft.AspNetCore.Http; using Microsoft.EntityFrameworkCore; +using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Options; +using Moq; using NUnit.Framework; using OpenAuth.Repository.Interface; @@ -26,6 +31,22 @@ namespace OpenAuth.Repository.Test serviceCollection.AddScoped(typeof(IRepository<,>), typeof(BaseRepository<,>)); serviceCollection.AddScoped(typeof(IUnitWork<>), typeof(UnitWork<>)); + //模拟配置文件 + var optionMock = new Mock>(); + optionMock.Setup(x => x.Value).Returns(new AppSetting { DbType = Define.DBTYPE_MYSQL }); + serviceCollection.AddScoped(x => optionMock.Object); + + //模拟多租户id + var configMock = new Mock(); + configMock.Setup(x => x.GetSection("ConnectionStrings")[Define.TENANT_ID]).Returns(""); + serviceCollection.AddScoped(x => configMock.Object); + + var httpContextAccessorMock = new Mock(); + httpContextAccessorMock.Setup(x => x.HttpContext.Request.Query[Define.TOKEN_NAME]).Returns("tokentest"); + httpContextAccessorMock.Setup(x => x.HttpContext.Request.Query[Define.TENANT_ID]).Returns("OpenAuthDBContext"); + + serviceCollection.AddScoped(x => httpContextAccessorMock.Object); + serviceCollection.AddDbContext(options => options.UseSqlServer("Data Source=.;Initial Catalog=OpenAuthDB;User=sa;Password=000000;Integrated Security=True")); diff --git a/OpenAuth.WebApi/Model/AuthResponsesOperationFilter.cs b/OpenAuth.WebApi/Model/AuthResponsesOperationFilter.cs index 53021a1e..8b51daaf 100644 --- a/OpenAuth.WebApi/Model/AuthResponsesOperationFilter.cs +++ b/OpenAuth.WebApi/Model/AuthResponsesOperationFilter.cs @@ -1,5 +1,6 @@ using System.Collections.Generic; using System.Linq; +using Infrastructure; using Microsoft.AspNetCore.Authorization; using Microsoft.Extensions.Options; using Microsoft.OpenApi.Models; diff --git a/OpenAuth.WebApi/Model/GlobalHttpHeaderOperationFilter.cs b/OpenAuth.WebApi/Model/GlobalHttpHeaderOperationFilter.cs index eafeb27c..9b15d2d2 100644 --- a/OpenAuth.WebApi/Model/GlobalHttpHeaderOperationFilter.cs +++ b/OpenAuth.WebApi/Model/GlobalHttpHeaderOperationFilter.cs @@ -7,6 +7,7 @@ using System.Collections.Generic; using System.Linq; +using Infrastructure; using Microsoft.AspNetCore.Authorization; using Microsoft.Extensions.Options; using Microsoft.OpenApi.Models; diff --git a/OpenAuth.WebApi/OpenAuth.WebApi.csproj b/OpenAuth.WebApi/OpenAuth.WebApi.csproj index 3e07e090..f330915a 100644 --- a/OpenAuth.WebApi/OpenAuth.WebApi.csproj +++ b/OpenAuth.WebApi/OpenAuth.WebApi.csproj @@ -24,7 +24,7 @@ - + diff --git a/OpenAuth.WebApi/Test/CheckControllerTest.cs b/OpenAuth.WebApi/Test/CheckControllerTest.cs index 20e45ce1..5f74711b 100644 --- a/OpenAuth.WebApi/Test/CheckControllerTest.cs +++ b/OpenAuth.WebApi/Test/CheckControllerTest.cs @@ -34,11 +34,6 @@ namespace OpenAuth.WebApi.Test cachemock.Setup(x => x.Get("tokentest")).Returns(new UserAuthSession{Account = "admin"}); services.AddScoped(x => cachemock.Object); - var httpContextAccessorMock = new Mock(); - httpContextAccessorMock.Setup(x => x.HttpContext.Request.Query[Define.TOKEN_NAME]).Returns("tokentest"); - - services.AddScoped(x => httpContextAccessorMock.Object); - services.AddMvc().AddControllersAsServices(); services.AddScoped();