重构代码
重构代码
This commit is contained in:
@@ -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!);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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; }
|
||||
|
||||
}
|
||||
}
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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("用户信息已经过期");
|
||||
//}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
|
||||
//}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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>
|
||||
@@ -1,8 +0,0 @@
|
||||
<?xml version="1.0"?>
|
||||
<doc>
|
||||
<assembly>
|
||||
<name>Yi.Framework.OcelotGateway</name>
|
||||
</assembly>
|
||||
<members>
|
||||
</members>
|
||||
</doc>
|
||||
@@ -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>();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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>
|
||||
|
||||
|
||||
Reference in New Issue
Block a user