热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

MVC5+EF6入门完整教程12灵活控制Action权限

大家久等了。本篇专题主要讲述MVC中的权限方案。权限控制是每个系统都必须解决的问题,也是园子里讨论最多的专题之一。前面的系列文章中我们用到了SysUser,SysRole,SysU

大家久等了。

本篇专题主要讲述MVC中的权限方案。

权限控制是每个系统都必须解决的问题,也是园子里讨论最多的专题之一。

前面的系列文章中我们用到了 SysUser, SysRole, SysUserRole 这几个示例表。

我们以此为基础,完成RBAC (基于角色的控制) 的核心功能。

在此给出我的最佳实践,最终的效果是针对任意一个Action或Controller,都可以根据配置的角色来控制访问权限。

完成此核心功能后,可以再往两方面扩展常用功能:

1. 可以根据 组织/用户/角色 的并集来控制权限

2. 以此核心功能为基础,实现菜单的动态配置

本篇文章将会先完成核心功能,扩展部分的内容在后续文章中再讲。

文章提纲
  • 概述要点
  • 理论基础
  • 详细步骤
  • 总结
概述要点(知识点)

一、MVC Form认证身份基础

通常用法举例:

1. web.config à system.web配置节下,开启form认证

技术分享

2. 需要认证的 Control或Action 上添加过滤,例如限制只有 Scott可以访问

技术分享

还有其他两种常用形式,分别表示:

登录用户可以访问

[Authorize]

角色为Admin的用户可以访问

[Authorize(Roles = "Admin")]

过滤条件可以加在Action或整个Controller上。

二、MVC权限过滤器扩展

上述解决方式中很明显会发现有两个缺点:

1. 修改权限时需在Action, Controller上修改后需重新编译,不灵活。

2.过滤器中的Role是内置对象,如果不使用ASP.NET自身的集成权限方案,就无法按照角色来过滤。

解决这两个问题,只需要扩展类AuthorizeAttribute即可。

技术分享

理论基础

为了能使用自定义的角色控制权限,我们需要扩展或绕过 ASP.NET 的Membership和Role provider 框架。

1.扩展:实现自定义的 Membership/Role provider

2.绕过:直接不使用

我们选择绕过的方式,这样的话更加灵活。

(因为如果你的角色结构和系统不一致,用扩展的方式弄起来比较麻烦)

我们使用form认证的三个核心API, 只用这几个API既可以减少工作量,又可以和Membership/Role provider保持独立,鱼和熊掌兼得。

1. FormsAuthentication.SetAuthCOOKIE

用户登录后,指定用户名

2. Request.IsAuthenticated

登录后返回true

3. HttpContext.Current.User.Identity.Name

返回登录的用户名

权限过滤的完整过程:

1. Authetication ( 登录 )

登录成功后,调用 FormsAuthentication.SetAuthCOOKIE 设置一个用户名。

2. Authorization(授权)

新建自定义的授权属性类:CustomAuthorizeAttribute(继承于AuthorizeAtrribute),扩展权限过滤器

3. 类似于默认Authorize attribute的使用方法,附加自定义的authorize attribute到controller或action上去,实现权限过滤

详细步骤

下面是具体实现步骤。

一、启用form认证,完成登录/退出 基本功能

1. 启用 form 认证

web.config à system.web配置节下,启用form认证

技术分享

2. 完成登录/退出 基本功能

新建Controller: AccountController

登录功能:

技术分享

技术分享

技术分享

退出功能

技术分享

对应的View(略,请直接查看源文件)

二、准备好权限配置文件

1. 用到的基础数据:用户,角色及用户/角色 关系

技术分享

2. 角色与Action对应的权限关系

这里我们先用一个XML代替,后续最终项目完成时会统一到DB中。

新建文件夹Config,新建ActionRoles文件,配置Action/Role的对应关系

技术分享

说明:

Action未配置情况下,默认有访问权限;

Action 配置角色为空,有访问权限。

三、扩展 AuthorizeAttribute

1. 新建类CustomAuthorizeAttribute,继承与AuthorizeAttribute

override两个方法:

a. 在请求授权时调用:

技术分享

b. 提供一个入口点用于自定义授权检查,通过为true

技术分享

具体实现:

技术分享

技术分享

技术分享

技术分享

以上使用的GetActionRoles的实现:

技术分享

技术分享

总结

至此,权限控制的整个过程就OK了,我们来测试一下。

新建HomeController, 新建一些Action做测试(Index, About,Contact)

回顾一下基础数据。

Scott 角色为 General Users

技术分享

XML配置为:

技术分享

我们把整个HomeController 上都加上 [CustomAuthorize]

使用场景举例:

1. Index 配置为空,任何人都能访问

技术分享

2. About 配置为Manager, Administrators, General Users 可以访问

未登录时跳转至登录界面

技术分享

技术分享

3. Contact配置为 Administrators可以访问

scott的角色为General Users, 不在权限表里,登录不进去此页面

技术分享

另外补充说明:

如下图,可以设置为全局。

这样就不需要单个设置,对所有Action应用自定义过滤条件。

技术分享

欢迎大家多多评论和支持,祝学习进步 :)

MVC5+EF6 入门完整教程12--灵活控制Action权限


推荐阅读
  • Java EE 平台集成了多种服务、API 和协议,旨在支持基于 Web 的多层应用程序开发。本文将详细介绍 Java EE 中的 13 种关键技术规范,帮助开发者更好地理解和应用这些技术。 ... [详细]
  • SvpplyTable: 实现可扩展和可折叠的菜单动画
    SvpplyTable 是一个示例项目,旨在实现类似 Svpply 应用程序中的可扩展和可折叠的菜单动画效果。该项目托管在 GitHub 上,地址为 https://github.com/liuminqian/SvpplyTable。 ... [详细]
  • 如何解决TS1219:实验性装饰器功能可能在未来版本中更改的问题
    本文介绍了两种方法来解决TS1219错误:通过VSCode设置启用实验性装饰器,或在项目根目录下创建配置文件(jsconfig.json或tsconfig.json)。 ... [详细]
  • 线段树,注 ... [详细]
  • Gty的二逼妹子序列 - 分块与莫队算法的应用
    Autumn 和 Bakser 正在研究 Gty 的妹子序列,但遇到了一个难题。他们希望计算某个区间内美丽度属于 [a, b] 的妹子的美丽度种类数。本文将详细介绍如何利用分块和莫队算法解决这一问题。 ... [详细]
  • 从零开始编译Linux系统:第16章 全新起点
    本章将详细介绍如何从零开始编译一套完整的Linux系统,涵盖关键组件如glibc库的介绍及其重要性。通过本文,读者将了解从源代码构建Linux系统的全过程。 ... [详细]
  • 阿里云 Aliplayer高级功能介绍(八):安全播放
    如何保障视频内容的安全,不被盗链、非法下载和传播,阿里云视频点播已经有一套完善的机 ... [详细]
  • 本文介绍了 Confluence 6 中使用的其他 Cookie,这些 Cookie 主要用于存储产品的基本持久性和用户偏好设置,以提升用户体验。 ... [详细]
  • iOS snow animation
    CTSnowAnimationView.hCTMyCtripCreatedbyalexon1614.Copyright©2016年ctrip.Allrightsreserved.# ... [详细]
  • packagecom.panchan.tsmese.utils;importjava.lang.reflect.ParameterizedType;importjava.lang. ... [详细]
  • 本文章提供了适用于 Cacti 的多核 CPU 监控模板,支持 2、4、8、12、16、24 和 32 核配置。请注意,0.87g 版本的 Cacti 需要手动修改哈希值为 0021 才能使用,而 0.88 及以上版本则可直接导入。 ... [详细]
  • 本文介绍了Java编程语言的基础知识,包括其历史背景、主要特性以及如何安装和配置JDK。此外,还详细讲解了如何编写和运行第一个Java程序,并简要介绍了Eclipse集成开发环境的安装和使用。 ... [详细]
  • 本文介绍了一种支付平台异步风控系统的架构模型,旨在为开发类似系统的工程师提供参考。 ... [详细]
  • 使用 Git Rebase -i 合并多个提交
    在开发过程中,频繁的小改动往往会生成多个提交记录。为了保持代码仓库的整洁,我们可以使用 git rebase -i 命令将多个提交合并成一个。 ... [详细]
  • Manacher算法详解:寻找最长回文子串
    本文将详细介绍Manacher算法,该算法用于高效地找到字符串中的最长回文子串。通过在字符间插入特殊符号,Manacher算法能够同时处理奇数和偶数长度的回文子串问题。 ... [详细]
author-avatar
兔斯基小兔子_988
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有