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();