一沙框架(YiShaAdmin) -WebAPI添加身份认证

记录YiShaAdmin webAPI站点添加身份认证功能。

Github 下载下来代码发现API身份认证功能貌似没有写完,所以补充这个功能。

没有身份认证时,不用输入token 可以任意调用api接口,显然不符合常理。

接下来进行改造,三步走:

  1. 设置Authorization header
  2. 修改AuthorizeFilterAttribute
  3. API接口授权

具体如下:

  1. 设置Authorization header

        StartUp.cs文件ConfigureServices方法增加如下代码

 

#region Auth
            //Bearer 的scheme定义
            var securityScheme = new OpenApiSecurityScheme()
            {
                Description = "JWT Authorization header using the  scheme. Example: \"Authorization: {token}\"",
                Name = "Authorization",
                In = ParameterLocation.Header,
                Type = SecuritySchemeType.ApiKey,
                Scheme = "",
                BearerFormat = "JWT"
            };
            var securityRequirement = new OpenApiSecurityRequirement
                        {
                        {
                                new OpenApiSecurityScheme
                                {
                                    Reference = new OpenApiReference
                                    {
                                        Type = ReferenceType.SecurityScheme,
                                        Id = "token"
                                    }
                                },
                                new string[] {}
                        }
                    };

 #endregion

        修改Swagger注入

	 services.AddSwaggerGen(options =>
	            {
	                var xmlPath = Path.Combine(AppContext.BaseDirectory, $"{Assembly.GetExecutingAssembly().GetName().Name}.xml");
	                options.SwaggerDoc("v1", new OpenApiInfo { Title = "YiSha Api", Version = "v1" });
	                options.IncludeXmlComments(xmlPath, true);
	
	                options.AddSecurityDefinition("token", securityScheme);
	                options.AddSecurityRequirement(securityRequirement);
	            });

        重新运行项目会发现Authorize在Swagger上已生效

2. 修改AuthorizeFilterAttribute 

AuthorizeFilterAttribute.cs文件添加如下代码

	private static readonly MenuAuthorizeBLL menuAuthorizeBLL = new MenuAuthorizeBLL();
        private static readonly MenuBLL menuBLL = new MenuBLL();

OnActionExecutionAsync方法在sw.Start();和sw.Stop();间修改代码如下:

	ActionExecutedContext resultContext = null;
	            string token = context.HttpContext.Request.Headers["Authorization"].ParseToString();
	
	            var actionName = context.ActionDescriptor.RouteValues["action"];
	
	            OperatorInfo user = await Operator.Instance.Current(token);
	            if (user != null)
	            {
	
	                #region 验证权限
	                var temp = await menuAuthorizeBLL.GetAuthorizeList(user);
	                // 获取当前请求的URL
	                var url = context.HttpContext.Request.Path.ToString();
	                var menu = menuBLL.GetEntity(url);
	                if (menu != null && menu.Result.Data != null)
	                {
	                    var menuid = menu.Result.Data.Id;
	                    var t = temp.Data.Where(w => w.MenuId == menuid).Any();
	                    if (t)
	                    {
	                        //有授权
	                    }
	                    else
	                    {
	                        //未授权
	                        //context.HttpContext.Response.StatusCode = 401;
	                        TData obj = new TData();
	                        obj.Tag = 0;
	                        obj.Message = "抱歉,您没有权限";
	                        context.Result = new JsonResult(obj);
	                        return;
	                    }
	                }
	                else
	                {
	                    //未授权
	                    //context.HttpContext.Response.StatusCode = 401;
	                    TData obj = new TData();
	                    obj.Tag = 0;
	                    obj.Message = "抱歉,您没有权限";
	                    context.Result = new JsonResult(obj);
	                    return;
	                }
	                #endregion
	       resultContext = await next();
	                // 根据传入的Token,设置CustomerId
	                if (context.ActionArguments != null && context.ActionArguments.Count > 0)
	                {
	                    PropertyInfo property = context.ActionArguments.FirstOrDefault().Value.GetType().GetProperty("Token");
	                    if (property != null)
	                    {
	                        property.SetValue(context.ActionArguments.FirstOrDefault().Value, token, null);
	                    }
	                    switch (context.HttpContext.Request.Method.ToUpper())
	                    {
	                        case "GET":
	                            break;
	
	                        case "POST":
	                            property = context.ActionArguments.FirstOrDefault().Value.GetType().GetProperty("CustomerId");
	                            if (property != null)
	                            {
	                                property.SetValue(context.ActionArguments.FirstOrDefault().Value, user.UserId, null);
	                            }
	                            break;
	                    }
	                }
	            }
	            else
	            {
	                if (IgnoreToken.Contains(actionName))
	                {
	                    resultContext = await next();
	                }
	                else
	                {
	                    context.HttpContext.Response.StatusCode = 401;
	                    return;
	                }
	
	            }

验证一下直接请求接口,返回401 符合预期

设置token后,再请求看看

 

         返回没有权限,接下来看看如何授权

3. API接口授权

        在菜单中添加API请求URL,然后授权该菜单到需要的角色,当用户的token请求时会解析当前token所属用户属于哪个角色,以及这个角色可访问哪些菜单,在AuthorizeFilter中检测当前请求的Url是否在该用户可访问的菜单中来验证用户是否有调用该API的权限

         添加菜单

        API授权给角色 

 再次请求接口,发现已可以正常请求到数据

最后,优化下授权页面

 新增菜单类型"API",菜单列表页添加API类型图标显示,如下图

 菜单“API清单”设置禁用状态,这样避免在左侧显示API链接。

至此,所有功能设置完毕。

源码地址:GitHub - 6Qiang/YiShaAdmin: 基于 .NET Core MVC 的权限管理系统,代码易读易懂、界面简洁美观。演示版 http://106.14.124.170/admin基于 .NET Core MVC 的权限管理系统,代码易读易懂、界面简洁美观。演示版 http://106.14.124.170/admin - GitHub - 6Qiang/YiShaAdmin: 基于 .NET Core MVC 的权限管理系统,代码易读易懂、界面简洁美观。演示版 http://106.14.124.170/adminhttps://github.com/6Qiang/YiShaAdmin/

 

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Simatic S7 S7-1200 WebAPI是西门子公司推出的一种工业自动化控制系统。它基于WebAPI技术,提供了一种方便快捷的远程访问S7-1200系列PLC的途径。 首先,S7-1200系列PLC是一种可编程逻辑控制器,用于控制和监控工业过程和机器。它具备强大的处理能力和可靠性,广泛应用于制造业、自动化生产线和工业控制系统。 而WebAPI是一种基于HTTP协议的应用程序接口,用于通过互联网或局域网远程访问和使用Web服务。通过使用Simatic S7 S7-1200 WebAPI,用户可以在任何支持Web浏览器的设备上,如电脑、平板或手机,通过简单的浏览器界面就能够实时监控和操作S7-1200 PLC。 Simatic S7 S7-1200 WebAPI提供了一系列的API,用于实现对PLC的远程操作。用户可以通过编写和发送HTTP请求,来读取和写入PLC的变量和标签,调用PLC的函数以及获取PLC的状态和诊断信息。这使得用户可以方便地进行远程监控、调试和控制PLC,无需直接接触PLC设备。 Simatic S7 S7-1200 WebAPI还支持安全认证和加密传输,以确保数据的安全性和机密性。此外,它还提供了丰富的开发文档和示例代码,帮助开发人员更轻松地实现和集成系统。 总之,Simatic S7 S7-1200 WebAPI提供了一种方便、高效和安全的方式来远程访问和操作S7-1200系列PLC。它使得工程师和运维人员可以随时随地监控和控制PLC设备,提高了工作效率和生产质量。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值