zoukankan      html  css  js  c++  java
  • 程序员的自我救赎---7.2:权限系统实际应用

    《前言》

    (一) Winner2.0 框架基础分析

    (二)PLSQL报表系统

    (三)SSO单点登录

    (四) 短信中心与消息中心

    (五)钱包系统

    (六)GPU支付中心

    (七)权限系统

    (八)监控系统

    (九)会员中心

    (十) APP版本控制系统

    (十一)Winner前端框架与RPC接口规范讲解

    (十二)上层应用案例

    (十三)总结

    《权限系统实际应用》

    讲到权限系统的应用,我们需要回过头来看看《SSO及应用案例》,之前讲SSO的应用中有讲到特性类[AuthLogin] 和 [AuthRight]。

    关于[AuthLogin] 前面已经讲过了,其实 [AuthRight]的应用和[AuthLogin] 是一样的,我们以特性类的方式表示哪个界面需要验证权限(Controller)。

    用法也很简单:

     关于AuthRight 的具体实现在Winner.FrameWork.MVC中,可以看这篇文章了解这一块:核心框架讲解(MVC)

    具体实现其实也很简单:

    using System;
    using System.Collections.Generic;
    using System.Dynamic;
    using System.Linq;
    using System.Web;
    using System.Web.Mvc;
    using System.Web.Routing;
    using Winner.Framework.MVC.GlobalContext;
    using Winner.Framework.Utils.Model;
    
    namespace Winner.Framework.MVC
    {
        /// <summary>
        /// 验证身份:检查访问权限
        /// </summary>
        public class AuthRightAttribute : AuthLoginAttribute
        {
            /// <summary>
            /// 实例化一个新的验证对象
            /// </summary>
            /// <param name="ignore">是否忽略检查</param>
            public AuthRightAttribute(bool ignore = false)
                : base(ignore)
            {
            }
            /// <summary>
            /// 权限验证,继承登陆验证
            /// </summary>
            /// <param name="context"></param>
            protected override bool OnAuthorizationing(AuthorizationContext context)
            {
                //1.判断是否登陆成功
                if (!base.OnAuthorizationing(context))
                {
                    return false;
                }
    
                //2.忽略权限检查
                if (GlobalConfig.IgnoreCheckRight)
                {
                    return true;
                }
                //3.如果是Ajax请求则不检查权限
                if (base.ContextProvider.IsAjaxRequest && GlobalConfig.IgnoreAjaxRequestCheckRight)
                {
                    return true;
                }
                //4.获取路径,如:/区域/控制器/动作/
                string url = string.Empty;
                if (!string.IsNullOrEmpty(ContextProvider.Area))
                {
                    url = "/" + ContextProvider.Area;
                }
                url += string.Format("/{0}/{1}/", ContextProvider.Controller, ContextProvider.Action);
                //5.判断权限
                if (!ApplicationContext.HaveRight(ApplicationContext.Current.User.UserId, url))
                {
                    //无法跳转到根目录下
                    //context.Result = new RedirectToRouteResult(new RouteValueDictionary(new { Controller = "Home", action = "Right" }));
    
                    if (base.ContextProvider.IsAjaxRequest)
                    {
                        OutputResult("此功能未授权,请联系管理员!", 403);
                    }
                    else
                    {
                        //TODO:未测试 指定Default的路由器下的
                        context.Result = new RedirectToRouteResult("Default", new RouteValueDictionary(new { Controller = "Home", action = "Right" }));
    
                    }
                    return false;
                }
                return true;
            }
        }
    }

     [AuthLogin] 和 [AuthRight] 的区别在于 [AuthLogin]只验证是否登录,登录的都可以浏览和操作, [AuthRight] 则要验证权限系统是否有这个权限。

    有打 [AuthRight]特性类,我们就通过WCF或者Webservice去请求"权限系统" 去查询是否该用户有本页面权限,如果没有返回False,则跳到指定的提示页面。

    上篇文章中有讲到,我们的权限其实只控制到页面,但是完全是可以让权限控制到按钮的。如果我们在权限系统针对功能扩展表,再扩展一张操作表,配置每个

    按钮的名称,最后再把验证的特性类打在控制器的方法上,这就可以讲权限控制到按钮了。就看需要有没有达到这种程序,公司做大了,项目参与人员增多了

    还是要做到这一步的。

    另外,上一篇文章中也有讲到,我们的权限系统其实还是2006年开发的,中间虽然完善过几次,但是对于访问权限系统做的并不好。中间我们还一度追求新技术

    使用WCF来做的,也没怎么做的好。这边重构权限系统的话,我们还是希望以简单一点的方式,比如WebAPI来完成接口请求。

    哈哈,本来觉得关于权限系统的实际应用是有很多东西可以讲,但是发现其实在上一篇《权限系统》和《核心框架讲解(MVC)》 都各带到了一些。

    无非就三个重点:

    1,以特性类[AuthRight]的形式来做权限检查

    2,在Winner2.0的核心框架中集成权限验证

    3,权限系统的控制可精细化到按钮

    另外,虽然之前也有提到过。但是我再强调一遍,权限系统一定要有忽略权限检查的功能(包括忽略登录检查)。不然开发的时候很痛苦,一来是每次调试都要登录,

    二来是开发过程中每增加一个功能还要先去线下的权限系统,添加权限。

    所以Winner2.0在设计的时候都会有像:GlobalConfig.IgnoreCheckRight。这样的通过WebConfig的可配置的检查项。

    好了,权限系统差不多就说到这里了,有兴趣一起探讨Winner框架的可以加我们QQ群:261083244。或者扫描左侧二维码加群。

  • 相关阅读:
    Windows7防火墙服务无法启用怎么办
    asp.net实现md5加密方法详解
    php去除换行(回车换行)的方法
    MySQL函数大全
    php codebase生成随机数
    Tensorflow 的Word2vec demo解析
    深度学习课程部分资料整理
    稀疏矩阵表示
    Faster-rnnlm代码分析3
    Faster-rnnlm代码分析2
  • 原文地址:https://www.cnblogs.com/demon28/p/8193567.html
Copyright © 2011-2022 走看看