程序员的自我救赎---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。或者扫描左侧二维码加群。

 

posted @ 2018-01-04 15:18  Near_wen  阅读(336)  评论(0编辑  收藏  举报