重构代码
重构代码
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);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user