/// <summary> /// 判断给定用户能否进行给定的操作 /// </summary> /// <param name="privilageJudge">给定的用户</param> /// <param name="privilege"> /// 为空字符串时表示只要登录就可以访问, /// 为null时表示允许匿名访问; /// 为字符串时表示权限; /// </param> /// <returns></returns> protected bool AllowAccess(IPrivilegeJudge privilageJudge, string privilege) { bool allowAnanymous = false, allowAnyone = false, allowOnlyAdmin = false; if (privilege == AuthenUtil.PRIVILEGE_ANYONE) { allowAnyone = true; } else if (privilege == AuthenUtil.PRIVILEGE_ANANYMOUS) { allowAnanymous = true; } else if (privilege == AuthenUtil.PRIVILEGE_ADMIN) { allowOnlyAdmin = true; } if (allowAnanymous) { return(true); } if (privilageJudge == null) { return(false); //不允许匿名访问; } if (allowAnyone && HasSameUsertype(privilageJudge)) { return(true); //允许同类型的任何人访问; } if (privilageJudge.IsAdministrator()) { return(true); // 管理员肯定可以访问 } else if (allowOnlyAdmin) { return(false); //需要是管理员,但传入不是管理员; } if (!HasSameUsertype(privilageJudge)) { return(false); //用户类型不一致,无权限访问 } if (string.IsNullOrEmpty(this.Privilege)) { return(true); //不需要权限; //只需要用户就可以了; } if (privilageJudge.HasPrivilege(this.Privilege)) { return(true); } return(false); }
/// <summary> /// 验证用户是否有权限; /// 1. 按照如下步骤验证 Action: /// 获取 Action 上的方法所定义的如下类型的 Attribute (AbstractAllowAttribute、AuthenQueryAttribute、AuthenModifyAttribute), /// 如果未定义任何 Attribute, 跳到第2步; /// 1.1 判断当前传入的 权限判断对象 判断能否访问 其中的某一个 Attribute, 如果能够访问,返回授权; /// 1.1.1 对于 AbstractAllowAttribute, 调用 AbstractAllowAttribute 的 AllowAccess 方法 /// 1.1.2 对于 AuthenQueryAttribute , 根据其 InputParameterName 属性从 Request 或者 RouteData 中获取参数类型和参数值, /// 并根据参数值 和 传入的 authenTypeParcer实例 解析成类型 /// 1.1.2.1 如果能够解析到类型,则如果类型上定义有 ClassAllowQuery 标注,则如果 当前权限对象 允许访问 ClassAllowQuery,返回授权; /// 1.1.2.2 如果不能解析为类型,但是 参数类型 为 Enum 类型, /// 根据参数值解析成 Enum值,并判断此值上是否定义有 ClassAllowQuery标注,判断 当前权限对象 允许访问 ClassAllowQuery,返回授权; /// 1.1.2 对于 AuthenModifyAttribute , 根据其 InputParameterName 属性从 Request 或者 RouteData 中获取参数类型和参数值, /// 并根据参数值 和 传入的 authenTypeParcer实例 解析成类型 /// 1.1.2.1 如果能够解析到类型,则如果类型上定义有 ClassAllowModify 标注,则如果 当前权限对象 允许访问 ClassAllowModify,返回授权; /// 1.1.2.2 如果不能解析为类型,但是 参数类型 为 Enum 类型, /// 根据参数值解析成 Enum值,并判断此值上是否定义有 ClassAllowQuery标注,判断 当前权限对象 允许访问 ClassAllowQuery,返回授权; /// 1.2 如果不能访问,返回未授权 或者 未登录 /// /// 2. 按照如上步骤判断 Action 所归属的 Controller, /// 获取 Controller 上的方法所定义的如下类型的 Attribute (AbstractAllowAttribute、AuthenQueryAttribute、AuthenModifyAttribute) /// </summary> /// <returns></returns> public EnumAuthenResult Authen(IParceAuthenTypeAccordParameterName authenTypeParcer) { if (privilegeJudge != null && privilegeJudge.IsAdministrator()) { return(EnumAuthenResult.Authened); } var authenResult = AuthenAction(authenTypeParcer); if (authenResult.HasValue) { return(ConvertAuthenResult(authenResult.Value)); } authenResult = AuthenConroller(authenTypeParcer); if (authenResult.HasValue) { return(ConvertAuthenResult(authenResult.Value)); } return(ConvertAuthenResult(false)); }