重构代码

重构代码
This commit is contained in:
chenchun
2022-04-02 17:44:50 +08:00
parent c6371ba72d
commit f5fb2ea17b
105 changed files with 1489 additions and 4654 deletions

View File

@@ -0,0 +1,25 @@
namespace Yi.Framework.OcelotGateway.Builder
{
public abstract class AbstractBuilder
{
public abstract void Invoke(DataContext data);
private AbstractBuilder? NextBuilder=null;
public void SetNext(AbstractBuilder? nextBuilder)
{
this.NextBuilder = nextBuilder;
}
public void Next( DataContext data)
{
if (NextBuilder != null)
{
this.NextBuilder!.Invoke(data!);
}
}
}
}

View File

@@ -0,0 +1,22 @@

using Yi.Framework.Common.Models;
namespace Yi.Framework.OcelotGateway.Builder
{
public class AccoutBuilder : AbstractBuilder
{
public override void Invoke(DataContext data)
{
//直接放行,并需要鉴权
if (data!.AccountPathList!.Contains(data.Path!))
{
data.Result = Result.Success();
}
else//剩下的这个,就是最后真正的业务判断
{
base.Next(data);
}
}
}
}

View File

@@ -0,0 +1,43 @@
using Microsoft.AspNetCore.Http;
using System.Collections.Generic;
using Yi.Framework.Common.Models;
using Yi.Framework.Core;
namespace Yi.Framework.OcelotGateway.Builder
{
public class DataContext
{
//访问路径
public string? Path { get; set; }
//是否为用于刷新的token
public bool? IsRe { get; set; } = false;
//刷新令牌的路径
public string? RefreshPath { get; set; }
//用户白名单
public List<string>? UserWhitePathList { get; set; }
//白名单路径
public List<string>? WhitePathList { get; set; }
//直接放行但是需要鉴权
public List<string>? AccountPathList { get; set; }
/// <summary>
/// 租户白名单
/// </summary>
public List<string>? TenantPathList { get; set; }
//public UserRoleMenuEntity? UserRoleMenuEntity { get; set; }
//最终的结果
public Result Result { get; set; } = Result.UnAuthorize();
public HttpContext? Context { get; set; }
public CacheClientDB? DB { get; set; }
}
}

View File

@@ -0,0 +1,43 @@
using System.Linq;
using System.Text;
namespace Yi.Framework.OcelotGateway.Builder
{
public static class GateStartBuilder
{
public static void Run(DataContext dataContext)
{
Handler(dataContext);
//基础
AbstractBuilder whitelistBuilder = new WhiteListBuilder();
AbstractBuilder tokenBuilder = new TokenBuilder();
AbstractBuilder refreshBuilder = new RefreshBuilder();
AbstractBuilder accoutBuilder = new AccoutBuilder();
//额外
AbstractBuilder tenantBuilder = new TenantBuilder();
AbstractBuilder userWhitelist = new UserWhitelistBuilder();
//最终
AbstractBuilder menuBuilder = new MenuBuilder();
whitelistBuilder.SetNext(tokenBuilder);
tokenBuilder.SetNext(refreshBuilder);
refreshBuilder.SetNext(accoutBuilder);
accoutBuilder.SetNext(tenantBuilder);
tenantBuilder.SetNext(userWhitelist);
userWhitelist.SetNext(menuBuilder);
whitelistBuilder.Invoke(dataContext);
}
public static void Handler(DataContext dataContext)
{
dataContext.Path = dataContext.Path!.ToUpper();
dataContext.RefreshPath = dataContext.RefreshPath!.ToUpper();
dataContext.WhitePathList = dataContext.WhitePathList!.Select(white => white.ToUpper()).ToList();
dataContext.AccountPathList = dataContext.AccountPathList!.Select(white => white.ToUpper()).ToList();
dataContext.TenantPathList = dataContext.TenantPathList!.Select(white => white.ToUpper()).ToList();
}
}
}

View File

@@ -0,0 +1,30 @@
using Yi.Framework.Common.Models;
namespace Yi.Framework.OcelotGateway.Builder
{
public class MenuBuilder : AbstractBuilder
{
public override void Invoke(DataContext data)
{
//var redisData = data!.DB!.Get<UserRoleMenuEntity>(RedisConst.GetStr(RedisConst.UserRoleMenu, data.UserRoleMenuEntity!.user.Account));
//if (redisData.IsNotNull())
//{
// var menus = redisData.menus;
// if (menus.Where(u=> u.TypeCode == (short)MenuTypeEnum.Hide).Select(u => u.UrlControl.ToUpper()).Contains(data.Path))
// {
// data.Result = Result.Success();
// }
// else
// {
// data.Result = Result.SuccessError("当前令牌无接口权限");
// }
//}
//else
//{
// data.Result = Result.UnAuthorize("用户信息已经过期");
//}
}
}
}

View File

@@ -0,0 +1,26 @@

using Yi.Framework.Common.Models;
namespace Yi.Framework.OcelotGateway.Builder
{
public class RefreshBuilder : AbstractBuilder
{
public override void Invoke(DataContext data)
{
//如果是刷新令牌
if ((bool)data!.IsRe!)
{
//且访问路径还是正确的
if (data.Path == data.RefreshPath)
{
data.Result = Result.Success();
}
}
else//表示不是刷新的token就要去redis里面判断了
{
base.Next(data);
}
}
}
}

View File

@@ -0,0 +1,22 @@

using Yi.Framework.Common.Models;
namespace Yi.Framework.OcelotGateway.Builder
{
public class TenantBuilder : AbstractBuilder
{
public override void Invoke(DataContext data)
{
if (data!.TenantPathList!.Contains(""/*data.UserRoleMenuEntity!.tenant.TenantName*/))
{
data.Result = Result.Success();
}
else
{
base.Next(data);
}
}
}
}

View File

@@ -0,0 +1,42 @@

namespace Yi.Framework.OcelotGateway.Builder
{
public class TokenBuilder : AbstractBuilder
{
public override void Invoke(DataContext data)
{
//先鉴权
//var userRoleMenuEntity = data!.Context.GetCurrentUserInfo();
////鉴权失败表示没有带token
//if (userRoleMenuEntity.IsNull())
//{
// //访问的路径是刷新令牌的,失败了直接返回令牌刷新失败
// if (data.Path == data.RefreshPath)
// {
// data.Result = Result.Expire(ResultCode.RefreshTokenExpire);
// }
//}
//else//鉴权成功访问含有token
//{
// //将数据存入上下文对象中
// data.UserRoleMenuEntity = userRoleMenuEntity;
// if (userRoleMenuEntity.RefreshToken == "true")
// {
// data.IsRe = true;
// }
// data.Context!.Request.Headers.Add("Account", userRoleMenuEntity.user.Account);
// data.Context!.Request.Headers.Add("Id", userRoleMenuEntity.user.Id.ToString());
// data.Context!.Request.Headers.Add("Name", userRoleMenuEntity.user.Name);
// data.Context!.Request.Headers.Add("TenantId", userRoleMenuEntity.user.TenantId.ToString());
// data.Context!.Request.Headers.Add("TenantLevel", userRoleMenuEntity.tenant.TenantLevel.ToString());
base.Next(data);
//}
}
}
}

View File

@@ -0,0 +1,18 @@

namespace Yi.Framework.OcelotGateway.Builder
{
public class UserWhitelistBuilder : AbstractBuilder
{
public override void Invoke(DataContext data)
{
//if (data!.UserWhitePathList!.Contains(data.UserRoleMenuEntity!.user.Account))
//{
// data.Result = Result.Success();
//}
//else
{
base.Next(data);
}
}
}
}

View File

@@ -0,0 +1,29 @@

using Yi.Framework.Common.Models;
namespace Yi.Framework.OcelotGateway.Builder
{
public class WhiteListBuilder : AbstractBuilder
{
public override void Invoke(DataContext data)
{
//如果在白名单,直接通行
if (data!.WhitePathList!.Contains(data.Path!))
{
data.Result = Result.Success();
}
//访问的是swagger
else if (data.Path!.Split("/")[1].ToUpper() == "swagger".ToUpper())
{
data.Result = Result.Success();
}
else//否则进入下一个管道处理
{
base.Next(data);
}
}
}
}

View File

@@ -0,0 +1,13 @@
<?xml version="1.0"?>
<doc>
<assembly>
<name>Yi.Framework.OcelotGateway</name>
</assembly>
<members>
<member name="P:Yi.Framework.OcelotGateway.Builder.DataContext.TenantPathList">
<summary>
租户白名单
</summary>
</member>
</members>
</doc>

View File

@@ -1,8 +0,0 @@
<?xml version="1.0"?>
<doc>
<assembly>
<name>Yi.Framework.OcelotGateway</name>
</assembly>
<members>
</members>
</doc>

View File

@@ -0,0 +1,65 @@
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Http;
using System.Collections.Generic;
using System.Threading.Tasks;
using Yi.Framework.Common.IOCOptions;
using Yi.Framework.Core;
using Yi.Framework.OcelotGateway.Builder;
using Yi.Framework.WebCore;
namespace Yi.Framework.OcelotGateway.WebCore
{
public class OcelotMiddleware
{
private readonly RequestDelegate next;
private CacheClientDB _cacheClientDB;
public OcelotMiddleware(RequestDelegate next, CacheClientDB cacheClientDB)
{
this.next = next;
this._cacheClientDB = cacheClientDB;
}
public async Task Invoke(HttpContext context)
{
//--------------------------------------访问路径--------------------------------------------
var path = context.Request.Path.Value!;
var authorizationOptions= Appsettings.app<AuthorizationOptions>("AuthorizationOptions");
//-------------------------------------刷新令牌路径-----------------------------------------------
string refresh = authorizationOptions.Refresh;
//-------------------------------------白名单------------------------------------------------
List<string> whiteList = authorizationOptions.WhiteList;
//------------------------------------白名单需鉴权------------------------------------------
List<string> accountList = authorizationOptions.AccountList;
//------------------------------------用户白名单------------------------------------------
List<string> userList = authorizationOptions.UserList;
//------------------------------------租户白名单------------------------------------------
List<string> tenantList = authorizationOptions.TenantList;
//--------------------------------------开始组装管道---------------------------------------------
DataContext dataContext = new() {TenantPathList= tenantList, Context = context,UserWhitePathList=userList, AccountPathList = accountList, WhitePathList = whiteList, RefreshPath = refresh, Path = path, DB = _cacheClientDB };
//--------------------------------------管道执行---------------------------------------------
GateStartBuilder.Run(dataContext);
//--------------------------------------处理结果---------------------------------------------
if (dataContext.Result.status)
{
//--------------------------------------中间件执行---------------------------------------------
await next(context);
}
else
{
context.Response.ContentType = "application/json;charset=utf-8";
await context.Response.WriteAsync(Common.Helper.JsonHelper.ObjToStr(dataContext.Result));
}
}
}
public static class OcelotExtensions
{
public static IApplicationBuilder UseOcelotExtensionService(this IApplicationBuilder builder)
{
return builder.UseMiddleware<OcelotMiddleware>();
}
}
}

View File

@@ -1,11 +1,12 @@
<Project Sdk="Microsoft.NET.Sdk.Web">
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>net6.0</TargetFramework>
<Nullable>enable</Nullable>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
<DocumentationFile>D:\CC.Yi\CC.Yi\Yi.Framework.Net6\Yi.Framework.OcelotGateway\SwaggerDoc.xml</DocumentationFile>
<DocumentationFile>./Config/SwaggerDoc.xml</DocumentationFile>
<NoWarn>1701;1702;CS1591</NoWarn>
</PropertyGroup>