重构代码

重构代码
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);
}
}
}
}