zoukankan      html  css  js  c++  java
  • 自定义权限验证特性

    /// <summary>
        /// 判断是否有权限操作
        /// </summary>
        public class RightAuthorizeAttribute : AuthorizeAttribute
        {
            /// <summary>
            /// actionName
            /// </summary>
            private string _actionName;
    
            /// <summary>
            /// controllerName
            /// </summary>
            private string _controllerName;
    
            /// <summary>
            /// 当前Controller
            /// </summary>
            private ControllerBase _controller;
            
            /// <summary>
            /// 当前Context
            /// </summary>
            private AuthorizationContext _filterContext;
    
            /// <summary>
            /// 该Action对应的权限项名称
            /// </summary>
            public string RightName { get; set; }
    
            /// <summary>
            /// 该Action对应的操作权限
            /// </summary>
            public OperationRights Operation { get; set; }
    
            /// <summary>
            /// .ctor
            /// </summary>
            static RightAuthorizeAttribute()
            {
            }
    
            /// <summary>
            /// .ctor
            /// </summary>
            public RightAuthorizeAttribute()
            {
                this.Operation = OperationRights.None;
                this.RightName = null;
            }
    
            /// <summary>
            /// .ctor
            /// </summary>
            /// <param name="rightName">该Action对应的权限项名称</param>
            /// <param name="operation">该Action对应的操作权限</param>
            public RightAuthorizeAttribute(string rightName, OperationRights operation)
            {
                this.Operation = operation;
                this.RightName = rightName;
            }
    
            /// <summary>
            /// 提供一个入口点用于进行自定义授权检查
            /// </summary>
            /// <param name="filterContext">HTTP 上下文,它封装有关单个 HTTP 请求的所有 HTTP 特定的信息。</param>
            public override void OnAuthorization(AuthorizationContext filterContext)
            {
                _filterContext = filterContext;
                _controller = filterContext.Controller;
                _actionName = filterContext.ActionDescriptor.ActionName;
                _controllerName = filterContext.ActionDescriptor.ControllerDescriptor.ControllerName;
                if (string.IsNullOrEmpty(_controllerName))
                {
                    _controllerName = filterContext.RouteData.Values["controller"].ToString().ToLower();
                }
    
                if (string.IsNullOrEmpty(_actionName))
                {
                    _actionName = filterContext.RouteData.Values["action"].ToString().ToLower();
                }
    
                base.OnAuthorization(filterContext);
            }
    
            /// <summary>
            /// 验证过程
            /// </summary>
            /// <param name="httpContext">当前HTTP 上下文</param>
            /// <returns></returns>
            protected override bool AuthorizeCore(HttpContextBase httpContext)
            {
                var controller = _controller as BaseController;
    
                // 验证权限信息
                return controller == null
                    || controller.RightAuthorizeExcludeControllers.Any(p => string.Equals(p, this._controllerName, StringComparison.OrdinalIgnoreCase))
                    || this.VerifyAuthorization(httpContext);
            }
    
            /// <summary>
            /// 验证不通过时调用
            /// </summary>
            /// <param name="filterContext">HTTP 上下文</param>
            protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
            {
                var controller = _controller as BaseController;
                if (controller != null)
                {
                    var returnType = this.GetExpectedReturnType(filterContext);
                    if (returnType == typeof(WhtrJsonResult))
                    {
                        filterContext.Result = controller.GetCommonResult(
                            ResultState.UnAuthorize,
                            new Response()
                            {
                                Success = false,
                                Message = "没有权限"
                            });
    
                        return;
                    }
                }
    
                base.HandleUnauthorizedRequest(filterContext);
            }
    
            /// <summary>
            /// 实际验证过程
            /// </summary>
            /// <param name="filterContext">当前上下文</param>
            /// <returns></returns>
            private bool VerifyAuthorization(HttpContextBase filterContext)
            {
                var controller = _controller as BaseController;
                if (controller == null)
                {
                    return true;
                }
    
                var paramObj = GetFirstParamObject();
                if (paramObj !=null && paramObj.PlatformId != null)
                {
                    
                }
    
                if (Operation == OperationRights.None || string.IsNullOrEmpty(this.RightName))
                {
                    var key = (this._controllerName + "/" + this._actionName).ToLowerInvariant();
    
                    var rightItem = controller.ActionRights.GetObjectWithoutException(key);
                    if (rightItem == null)
                    {
                        key = (this._controllerName + "/*").ToLowerInvariant();
                        rightItem = controller.ActionRights.GetObjectWithoutException(key);
                    }
    
                    if (rightItem != null)
                    {
                        this.RightName = rightItem.RightName;
                        this.Operation = (OperationRights)Convert.ToInt32(rightItem.RightValue);
                    }
                }
    
                if (Operation == OperationRights.None || string.IsNullOrEmpty(this.RightName))
                {
                    return true;
                }
    
                return controller.Rights.HasRight(RightName, Operation);
            }
    
            /// <summary>
            /// 获取返回类型
            /// </summary>
            /// <param name="filterContext">The filter context.</param>
            /// <returns></returns>
            private Type GetExpectedReturnType(AuthorizationContext filterContext)
            {
                return (((ReflectedActionDescriptor)(filterContext.ActionDescriptor)).MethodInfo).ReturnType;
            }
    
            private Type GetFirstParamType(AuthorizationContext filterContext)
            {
                return filterContext.ActionDescriptor.GetParameters().Select(item => item.ParameterType).FirstOrDefault();
            }
            private dynamic GetFirstParamObject()
            {
                var paramNames = this._filterContext.ActionDescriptor.GetParameters();
                if (paramNames.Length > 0)
                {
                    var parameterInfo = this._filterContext.Controller.ValueProvider.GetValue(paramNames[0].ParameterName);
    
                    return parameterInfo;
                }
    
                return null;
            }
        }
  • 相关阅读:
    c++中 . 和 -> 的区别是什么?
    codeblocks中一个简单的程序的创建。
    将牛客中的代码在codeblocks中进行实现
    (全代码)输入一颗二叉树的跟节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。(注意: 在返回值的list中,数组长度大的数组靠前)
    解决You are using pip version 10.0.1, however version 18.1 is available. You should consider upgrading via the 'python -m pip install --upgrade pip' command.
    mysql 表复制(表备份)
    Scrapy 抓取股票行情
    去哪儿网数据爬取
    用API爬取天气预报数据
    爬虫防封IP
  • 原文地址:https://www.cnblogs.com/zhshlimi/p/7268604.html
Copyright © 2011-2022 走看看