Asp.net+Vue+EmelentUI的实现(七)权限控制 - Go语言中文社区

Asp.net+Vue+EmelentUI的实现(七)权限控制


基于业务的需求,每一个页面会有不同的功能,对不同的功能又需要进行权限管控,那基于Asp.net和Vue要如何实现权限管控呢?比如有增加、删除、修改的功能,需要控制对应的权限,如果这些功能的按钮在没有权限时不渲染出来,那就达到了目的。所以解决权限控制的关键,在前端就是控制是否渲染。基于这样的思考,于是有了这样的思路:

使用vue的v-if来控制渲染,v-if的值由asp.net的后台代码来给定,示例如下:

 <el-button size="mini" 
                               type="primary"
                               v-if="<%=Product_Powers_Delete%>"
                               @click="handleDelete(scope.$index, scope.row)">删除</el-button>

其中Product_Powers_Delete是后台代码类的属性,代码如下:

   /// <summary>
        /// 权限-删除
        /// </summary>
        [PowerCheck]
        public int Product_Powers_Delete { get; set; } = PowerNo;
        #endregion

        protected void Page_Load(object sender, EventArgs e)
        {

        }

其中PowerCheck是自定义的权限标识属性,用于反射计算权限属性时的识别,代码如下

/// <summary>
    /// 权限校验属性的标识
    /// </summary>
    public class PowerCheckAttribute : Attribute
    {

    }

那如何对Product_Powers_Delete进行赋值呢?如果一个一个的手动来对应权限的key去赋值,也是可行的,但这样太繁琐,而且很容易出错,所以为了让这个过程变的自动,就考虑使用反射属性名,然后与计算出来的权限列表进行对应。为了便于各个aps.net后台代码类的使用,我们将这些类都继承自PageBase(可以参看《Asp.net+Vue+EmelentUI的实现(三)JS和CSS的自动载入》),然后在PageBase中来统一实现对应,具体代码如下


 /// <summary>
        /// 拥有权限
        /// </summary>
        protected const int PowerHave = 1;
        /// <summary>
        /// 没有权限
        /// </summary>
        protected const int PowerNo = 0;

#region initPower
        private void initPower()
        {
            List<PowerItem> powers = null;

            var menuKey = this.Request.QueryString["MenuKey"];
            if (!string.IsNullOrWhiteSpace(menuKey))
            {
                powers = PowerHelper.QueryPowers(menuKey);
            }

            if (powers == null)
            {
                powers = new List<PowerItem>();
            }

            Type type = this.GetType();
            var properyties = type.GetProperties(BindingFlags.Public| BindingFlags.Instance);
            if (properyties != null && properyties.Length > 0)
            {
                foreach (var prop in properyties)
                {
                    var attr=prop.GetCustomAttribute<PowerCheckAttribute>();
                    if (attr==null)
                    {
                        continue;
                    }
                    var haveInt = powers.Exists(t => prop.Name.Equals(t.CodeUniqueFlag)) ? PowerHave : PowerNo;
                    prop.SetValue(this, haveInt, null);
                }
            }
        }

        /// <summary>
        /// 获取菜单的整型值,使用整形值是为了便于权限的配置与vue的渲染。
        /// </summary>
        /// <param name="powerItems">权限项列表</param>
        /// <param name="powerItemKey">权限项的key</param>
        /// <returns></returns>
        private int GetPowerInt(List<BMPowerItem> powerItems, string powerItemKey)
        {
            if (ListHelper.IsEmpty(powerItems))
            {
                return 0;
            }

            return powerItems.Exists(t => t.Key.Equals(powerItemKey)) ? PowerHave : PowerNo;
        }
        #endregion

其中PowerHelper.QueryPowers是计算当前用户的当前菜单下有哪些权限,具体实现需要依据自身的需求来计算。CodeUniqueFlag是自行配置的,必须要与代码中的属性项保持一致,比如CodeUniqueFlag为Product_Powers_Delete。

为了防止CodeUniqueFlag的重复,可以考虑使用类名作为前缀。

转载请注明出处。

版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/xxdddail/article/details/90710914
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2020-04-19 11:14:42
  • 阅读 ( 984 )
  • 分类:前端

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢