效果:
通过Attribute来简单控制某个方法的访问权限
例如:
下面api只能角色id是【001,002,999】的登录用户才能访问
/// <summary> /// 管理用户列表 /// </summary> /// <param name="req">查询条件</param> /// <param name="token">登录令牌</param> /// <returns></returns> [HttpGet("userlist")] [CustomAuthorize(Roles = "001,002,999")] public CrmManageUserListResp CrmManageUserList([FromQuery] CrmManageUserListReq req, [FromHeader] [Required] string token) { return _DoInvoke(req, _userService.CrmManageUserList); }
其中的 CustomAuthorizeAttribute 是自定义的控制器过滤类
代码如下:
using GeduData.Server; using Microsoft.AspNetCore.Mvc.Filters; using System.Threading.Tasks; namespace GeduDistributionApi.Extension { public class CustomAuthorizeAttribute : ActionFilterAttribute { public string Roles { get; set; } public override Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next) { Microsoft.AspNetCore.Http.HttpRequest request = context.HttpContext.Request; string token = request.Headers["token"].ToString(); //拿到用户信息,匹配角色是否可以访问 string defailtrole = "999"; if (Roles.Contains(defailtrole) == false) { throw new GeduException("暂无访问权限"); } return base.OnActionExecutionAsync(context, next); } } }
在这里拿到header里的token,获取当然用户的登录信息,角色信息等,进行匹配即可。
如果没有权限即可结束掉当前请求,并且返回统一的错误提示信息。
全局异常捕获在另一个博文里介绍配置方法