自定义权限验证特性

/// <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;
        }
    }
时间: 2024-08-10 23:33:17

自定义权限验证特性的相关文章

自定义Metadata验证特性

常用的验证特性标签: StringLength ,  Required , RegularExpression , Range , MembershipPasswordAttribute(密码强度限制) 也可以通过简单扩展, 增加自己的验证特性 /// <summary> /// 这东西也就是练手玩一下, 实际 .net framework已有 EmailAddressAttribute -> DataTypeAttribute -> ValidationAttribute ///

自定义mvc验证特性,手机号号段老增加,给自定义一个RegularExpress

public class PhoneExpressionAttribute: RegularExpressionAttribute, IClientValidatable{public PhoneExpressionAttribute(): base(@"^1[2,3,4,5,6,7,8,9][0-9]{1}[0-9]{8}$"){}public override string FormatErrorMessage(string name){return String.Format(C

mvc 实体类 自定义验证特性

mvc 实体类验证的时候 如果有多个验证特性需要在属性上层叠很多个验证特性,显得属性特别臃肿并且也不够直观,极大地影响我使用它的兴趣,所以我想自定义一个验证特性,然后将所有需要验证的情形全部放在一个特性里,看上去更直观一点. [DataContract] public partial class Sys_Menu : BaseModel { [Key] [DatabaseGenerated(DatabaseGeneratedOption.Identity)] [DataMember] publi

【ASP.NET】ASP.NET中权限验证使用OnAuthorization实现

在项目开发中,通常我们都会涉及到用户登录才能访问的网页,比如购物网站,我们浏览商品,添加购物车(以前开发的时候在这里就需要登录用户,但是现在有了缓存的实现,这里可以将商品加入缓存,等到结账的时候再登录),选择结账的时候需要登录,那么这时候我们需要跳转到登录页面登录,登录之后还可以回到记录下来的原始的页面,那么这之后我们有好几种方法可以实现这种效果,下面笔者举例两种: 第一种:登录模块不管怎么样都是统一的,就是在每个需要登录的方法里面判断用户是否登录,如果没有登录,则跳转登录,这种的缺点是工作量大

springboot2.0整合springsecurity前后端分离进行自定义权限控制

在阅读本文之前可以先看看springsecurity的基本执行流程,下面我展示一些核心配置文件,后面给出完整的整合代码到git上面,有兴趣的小伙伴可以下载进行研究 使用maven工程构建项目,首先需要引入最核心的依赖, <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> <

.NET 实现自定义ContextUser的Identity和Principal实现自定义用户信息,权限验证。

备用收藏,http://blog.csdn.net/msdnxgh/article/details/6894885 .NET 实现自定义ContextUser的Identity和Principal 在传统的.NET中,我们可以通过 [csharp] view plaincopy User.Identity.Name;//获取用户名 User.Identity.IsAuthenticated;//判断用户是否己验证 User.IsInRole("Admin");//判断用户是否含有指定角

mvc4 利用filters特性来 实现自己的权限验证 之二

刚开始摸索C# MVC,也只是按图索骥,对C#的特性不是很懂,耐心看完相关文章,对特性的使用有了进一步理解. 1.特性类的命名规范:特性也是一个类,必须继承于System.Attribute类,命名规范为“类名”+Attribute.不管是直接还是间接继承,都会成为一个特性类,特性类的声明定义了一种可以放置在声明之上新的特性. 2.特性的使用:[特性类名(不需要后缀Attribute)(公共属性=值, 公共属性=值...)]放置于类.方法.字段.属性.结构体...前修饰. 如: //在Perso

[Abp 源码分析]十二、多租户体系与权限验证

0.简介 承接上篇文章我们会在这篇文章详细解说一下 Abp 是如何结合 IPermissionChecker 与 IFeatureChecker 来实现一个完整的多租户系统的权限校验的. 1.多租户的概念 多租户系统又被称之为 Saas ,比如阿里云就是一个典型的多租户系统,用户本身就是一个租户,可以在上面购买自己的 ECS 实例,并且自己的数据与其他使用者(租户)所隔绝,两者的数据都是不可见的. 那么 Abp 是如何实现数据隔离的呢? 1.1 单部署-单数据库 如果你的软件系统仅部署一个实例,

从壹开始前后端分离[.netCore 不定期 ] 36 ║解决JWT权限验证过期问题

缘起 哈喽,老张的不定期更新的日常又开始了,在咱们的前后端分离的.net core 框架中,虽然已经实现了权限验证<框架之五 || Swagger的使用 3.3 JWT权限验证[修改]>,只不过还是有一些遗留问题,最近有不少的小伙伴发现了这样的一些问题,本来想着直接就在原文修改,但是发现可能怕有的小伙伴看不到,就单发一条推送吧,所以我还是单写出一篇文章来说明解决这些问题,希望对无论是正在开发权限管理系统,还是平时需要数据库动态绑定权限分配的你有一些启发和思考.今天咱们注意解决这三个问题: 1.