当前位置: 首页 > news >正文

广州建设工程网站建设工程吗

广州建设工程网站,建设工程吗,中国建筑网官网建设通,做网站衡水背景 当我们把应用的配置都放到配置中心后#xff0c;很多人会想到这样一个问题#xff0c;配置里面有敏感的信息要怎么处理呢#xff1f;信息既然敏感的话#xff0c;那么加个密就好了嘛#xff0c;相信大部分人的第一感觉都是这个#xff0c;确实这个是最简单也是最合适… 背景 当我们把应用的配置都放到配置中心后很多人会想到这样一个问题配置里面有敏感的信息要怎么处理呢信息既然敏感的话那么加个密就好了嘛相信大部分人的第一感觉都是这个确实这个是最简单也是最合适的方法。其实很多人都在关注这个问题好比说数据库的连接字符串调用第三方的密钥等等这些信息都是不太想让很多人知道的。那么如果我们把配置放在 Nacos 了我们可以怎么操作呢想了想不外乎这么几种全部服务端搞定客户端只管取全部客户端搞定服务端只管存客户端为主服务端为辅服务端存一些加解密需要的辅助信息即可。有一个老哥已经在 issue 里面提出了相关的落地方案也包含了部分实现。https://github.com/alibaba/nacos/issues/5367简要概述的话就是开个口子用户可以在客户端拓展任意加解密方式同时服务端可以辅助这一操作。不过看了 2.0.2 的代码服务端这一块的“辅助”还未完成不过对客户端来说这一块其实问题已经不大了。6月14号发布的 nacos-sdk-csharp 1.1.0 版本已经支持了这一功能下面就用 .NET 5 和 Nacos 2.0.2 为例来简单说明一下。简单原理说明 sdk 里面在进行配置相关读写操作的时候会有一个 DoFilter 的操作。这个操作就是我们的切入点。既然要执行 Filter 那么执行的 Filter 从那里来呢答案是 IConfigFilter 。sdk 里面提供了 IConfigFilter 这个接口但是不提供实现具体实现交由用户自定义毕竟 100 个人就有 100 种不一样的实现。下面看看它的定义。public interface IConfigFilter {void Init(NacosSdkOptions options);int GetOrder();string GetFilterName();void DoFilter(IConfigRequest request, IConfigResponse response, IConfigFilterChain filterChain); } Init 方法就是对这个 ConfigFilter 进行一些初始化操作好比说从 Options 里面拿一些额外的信息。GetOrder 和 GetFilterName 属于辅助信息指定这个 ConfigFilter 的执行顺序(越小越先执行)和名称。DoFilter 就是核心了它可以变更 request 和 response 这两个对象内部都会维护一个包含配置信息的 Dictionary。换言之只要我们定义一个 ConfigFilter实现了这个接口那么配置想怎么操作都可以了加解密就是小问题了。其中 NacosSdkOptions 里面加了两个配置项是专门给这个功能用的 ConfigFilterAssemblies 和 ConfigFilterExtInfoConfigFilterAssemblies 是自定义 ConfigFilter 所在的程序集的名字这里是一个字符串列表类型的参数sdk 会根据这个名字去找到对应的实现然后初始化好。ConfigFilterExtInfo  是实现 ConfigFilter 是需要用到的扩展信息这里是一个字符串类型的参数扩展信息复杂的可以考虑传入一个 JSON 字符串。下面来看个具体的例子吧。自定义 ConfigFilter 这个 Filter 实现的效果是把部分敏感配置项进行加密敏感的配置项需要在配置文件中指定。先是 Init 方法public void Init(NacosSdkOptions options) {// 从 Options 里面的拓展信息获取需要加密的 json path// 这里只是示例根据具体情况调整成自己合适的var extInfo  JObject.Parse(options.ConfigFilterExtInfo);if (extInfo.ContainsKey(JsonPaths)){// JsonPaths 在这里的含义是那个path下面的内容要加密_jsonPaths  extInfo.GetValue(JsonPaths).ToObjectListstring();} } 然后是 DoFilter 方法这个方法里面要注意几点request 只有请求的时候才会有值其他时候都是 null 值。response 只有响应的时候才会有值其他时候都是 null 值。操作完之后一定要调用 PutParameter 方法进行覆盖才会生效。public void DoFilter(IConfigRequest request, IConfigResponse response, IConfigFilterChain filterChain) {if (request ! null){var encryptedDataKey  DefaultKey;var raw_content  request.GetParameter(Nacos.V2.Config.ConfigConstants.CONTENT);// 部分配置加密后的 contentvar content  ReplaceJsonNode((string)raw_content, encryptedDataKey, true);// 加密配置后不要忘记更新 request !!!!request.PutParameter(Nacos.V2.Config.ConfigConstants.ENCRYPTED_DATA_KEY, encryptedDataKey);request.PutParameter(Nacos.V2.Config.ConfigConstants.CONTENT, content);}if (response ! null){var resp_content  response.GetParameter(Nacos.V2.Config.ConfigConstants.CONTENT);var resp_encryptedDataKey  response.GetParameter(Nacos.V2.Config.ConfigConstants.ENCRYPTED_DATA_KEY);// nacos 2.0.2 服务端目前还没有把 encryptedDataKey 记录并返回所以 resp_encryptedDataKey 目前只会是 null// 如果服务端有记录并且能返回我们可以做到每一个配置都用不一样的 encryptedDataKey 来加解密。// 目前的话只能固定一个 encryptedDataKey var encryptedDataKey  (resp_encryptedDataKey  null || string.IsNullOrWhiteSpace((string)resp_encryptedDataKey)) ? DefaultKey : (string)resp_encryptedDataKey;var content  ReplaceJsonNode((string)resp_content, encryptedDataKey, false);response.PutParameter(Nacos.V2.Config.ConfigConstants.CONTENT, content);} } 这里涉及 encryptedDataKey 的相关操作都只是预留操作现阶段可以不用理会。还有一个 ReplaceJsonNode 方法就是替换敏感配置的具体操作了。private string ReplaceJsonNode(string src, string encryptedDataKey, bool isEnc  true) {// 示例配置用的是JSON如果用的是 yaml这里换成用 yaml 解析即可。var jObj  JObject.Parse(src);foreach (var item in _jsonPaths){var t  jObj.SelectToken(item);if (t ! null){var r  t.ToString();// 加解密var newToken  isEnc? AESEncrypt(r, encryptedDataKey): AESDecrypt(r, encryptedDataKey);if (!string.IsNullOrWhiteSpace(newToken)){// 替换旧值t.Replace(newToken);}}}return jObj.ToString(); } 到这里自定义的 ConfigFilter 已经完成了下面就是真正的应用了。简单应用 老样子建一个 WebApi 项目添加自定义 ConfigFilter 所在的包/项目/程序集。这里用的是集成 ASP.NET Core 的例子。修改 appsettings.json{NacosConfig: {Listeners: [     {Optional: true,DataId: demo,Group: DEFAULT_GROUP}],Namespace: cs,ServerAddresses: [ http://localhost:8848/ ],ConfigFilterAssemblies: [ XXXX.CusLib ],ConfigFilterExtInfo: {\JsonPaths\:[\ConnectionStrings.Default\],\Other\:\xxxxxx\}} } 注老黄这里把 Optional 设置成 true是为了第一次运行的时候如果服务端没有进行配置而不至于退出程序。修改 Program.cspublic class Program {public static void Main(string[] args){var outputTemplate  {Timestamp:yyyy-MM-dd HH:mm:ss.fff} [{Level}] {Message}{NewLine}{Exception};Log.Logger  new LoggerConfiguration().Enrich.FromLogContext().MinimumLevel.Override(Microsoft, LogEventLevel.Warning).MinimumLevel.Override(System, LogEventLevel.Warning).MinimumLevel.Debug().WriteTo.Console(outputTemplate: outputTemplate).CreateLogger();System.Text.Encoding.RegisterProvider(System.Text.CodePagesEncodingProvider.Instance);try{Log.ForContextProgram().Information(Application starting...);CreateHostBuilder(args, Log.Logger).Build().Run();}catch (System.Exception ex){Log.ForContextProgram().Fatal(ex, Application start-up failed!!);}finally{Log.CloseAndFlush();}}public static IHostBuilder CreateHostBuilder(string[] args, Serilog.ILogger logger) Host.CreateDefaultBuilder(args).ConfigureAppConfiguration((context, builder) {var c  builder.Build();                    builder.AddNacosV2Configuration(c.GetSection(NacosConfig), logAction: x  x.AddSerilog(logger));}).ConfigureWebHostDefaults(webBuilder {webBuilder.UseStartupStartup().UseUrls(http://*:8787);}).UseSerilog(); } 最后是 Startup.cspublic class Startup {// 省略部分....public void ConfigureServices(IServiceCollection services){services.AddNacosV2Config(Configuration, null, NacosConfig);services.ConfigureAppSettings(Configuration.GetSection(AppSettings));services.AddControllers();}public void Configure(IApplicationBuilder app, IWebHostEnvironment env){var configSvc  app.ApplicationServices.GetRequiredServiceNacos.V2.INacosConfigService();var db  $demo-{DateTimeOffset.Now.ToString(yyyyMMdd_HHmmss)};var oldConfig  {\ConnectionStrings\:{\Default\:\Server127.0.0.1;Port3306;Database  db  ;User Idapp;Password098765;\},\version\:\测试version---\,\AppSettings\:{\Str\:\val\,\num\:100,\arr\:[1,2,3,4,5],\subobj\:{\a\:\  db  \}}};configSvc.PublishConfig(demo, DEFAULT_GROUP, oldConfig).ConfigureAwait(false).GetAwaiter().GetResult();var options  app.ApplicationServices.GetRequiredServiceIOptionsMonitorAppSettings();Console.WriteLine(用 IOptionsMonitor 读取配置);Console.WriteLine(Newtonsoft.Json.JsonConvert.SerializeObject(options.CurrentValue));Console.WriteLine();Console.WriteLine(用 IConfiguration 读取配置);Console.WriteLine(Configuration[ConnectionStrings:Default]);Console.WriteLine();var pwd  $demo-{new Random().Next(100000, 999999)};var newConfig  {\ConnectionStrings\:{\Default\:\Server127.0.0.1;Port3306;Database db  ;User Idapp;Password pwd ;\},\version\:\测试version---\,\AppSettings\:{\Str\:\val\,\num\:100,\arr\:[1,2,3,4,5],\subobj\:{\a\:\ db \}}};// 模拟 配置变更configSvc.PublishConfig(demo, DEFAULT_GROUP, newConfig).ConfigureAwait(false).GetAwaiter().GetResult();System.Threading.Thread.Sleep(500);var options2  app.ApplicationServices.GetRequiredServiceIOptionsMonitorAppSettings();Console.WriteLine(用 IOptionsMonitor 读取配置);Console.WriteLine(Newtonsoft.Json.JsonConvert.SerializeObject(options2.CurrentValue));Console.WriteLine();Console.WriteLine(用 IConfiguration 读取配置);Console.WriteLine(Configuration[ConnectionStrings:Default]);Console.WriteLine();// 省略部分....} } 最后来看看几张效果图首先是程序的运行日志。其次是和 Nacos 控制台的对比。到这里的话基于 Nacos 的加解密就完成了。写在最后 敏感配置项的加解密还是很有必要的配置中心负责存储客户端负责加解密这样的方式可以让用户更加灵活的选择自己想要的加解密方法。本文的示例代码已经上传到 Github仅供参考。https://github.com/catcherwong-archive/2021/tree/main/NacosConfigWithEncryption最后的最后希望感兴趣的大佬可以一起参与到这个项目来。nacos-sdk-csharp 的地址 https://github.com/nacos-group/nacos-sdk-csharp
http://www.zqtcl.cn/news/752166/

相关文章:

  • 公司网站开发费用兴田德润官方网站深圳百度快照优化
  • 做网站需要备案么行业网站策划
  • 去年做啥网站能致富周口seo推广
  • 主体负责人电话修改 网站备案什么样算网站需要备案
  • 网站建站免费空间外贸网站建设与优化
  • 网站极简设计建立网站基本知识
  • 网站建设管理标准wordpress rss采集
  • 乐清网站建设费用装修房子的app软件哪个好
  • 专业网站搭建运营工业网站素材
  • 建网站要会什么wordpress电影下载站
  • 济南设计网站的公司西安模板网站建设
  • 网站搜索功能如何实现网络培训学习心得体会
  • 网站设计方案书ppt网站展示型推广
  • 中国建设注册管理中心网站首页大连地区建设网站
  • 广州致峰网站建设藁城网络推广
  • 怎么做免费个人网站wordpress dux 5.3
  • 手机触屏版网站网站功能介绍
  • 商场设计案例青岛百度快速排名优化
  • 制作网站要步骤湖北省建设厅网站上岗证查询
  • 网站建设制作公司都选万维科技制作网站需要注意什么
  • jsp小型网站开发wordpress微博插件
  • app充值网站开发怎么去做网站
  • 合肥建站网站模板word上下页纸张方向
  • 大学跳蚤市场网站建设哈尔滨网站建设
  • 网站开发合同中的知识产权条款怎么给公司建网站
  • 网站代维护wordpress 主题中心
  • 中铁广州建设有限公司网站临安做企业网站的公司
  • 国内可访问的海外网站和应用重庆好玩还是成都好玩
  • 定制开发小程序天津做网站优化的公司
  • 公司网站首页怎么做在线二级域名子域名查询