关于rbac:从0实现RBAC权限模型

详解 RBAC基于角色的访问控制(Role-based access control),指的是通过用户的角色(Role)受权其相干权限,这实现了更灵便的访问控制,相比间接授予用户权限,要更加简略、高效、可扩大。 当应用 RBAC 时,通过剖析零碎用户的理论状况,基于独特的职责和需要,授予他们不同角色。你能够授予给用户一个或多个角色,每个角色具备一个或多个权限,这种 用户-角色、角色-权限 间的关系,让咱们能够不必再独自治理单个用户,用户从授予的角色外面继承所需的权限。 以一个简略的场景(Gitlab 的权限零碎)为例,用户零碎中有 Admin、Maintainer、Operator 三种角色,这三种角色别离具备不同的权限,比方只有 Admin 具备创立代码仓库、删除代码仓库的权限,其余的角色都不具备。 咱们授予某个用户「Admin」这个角色,他就具备了「创立代码仓库」和「删除代码仓库」这两个权限。 不间接给用户受权策略,是为了之后的扩展性思考。比方存在多个用户领有雷同的权限,在调配的时候就要别离为这几个用户指定雷同的权限,批改时也要为这几个用户的权限进行一一批改。有了角色后,咱们只须要为该角色制订好权限后,给不同的用户调配不同的角色,后续只须要批改角色的权限,就能主动批改角色内所有用户的权限。 比如说,咱们筹备一个代码审查的角色,只容许查看代码,那么咱们只须要增加一个角色“代码审查”,并且赋予其代码查看的权限即可,十分的不便。 要实现 RBAC 模型,个别须要以下实体: 用户User 根底单位,所有的用户都存储在这里 角色Role 给相应用户配置对应的角色,和用户是多对多的关系 权限Permission 权限属于最小的管制判断根据,给对应的角色配置对应的权限,这样领有此权限的用户就能够拜访对应的资源,和角色是多对多的关系 实体关系阐明多对多的关系,须要有一个两头表保护关系, User 和 Role 的两头表 User-Role , Role 和 Permission 须要两头表 Role-Permission 场景举例上面来剖析两个具体的利用场景: 现有一个管理系统,简略的分为管理员和普通用户两种角色,管理员具备一些管理权限,然而没有具体业务的权限 新增角色这时候须要新增一个角色,次要工作是查看用户的所有反馈,相似于客服的角色,这时候咱们只有新增一个角色,并把这个角色配置给某个用户就好了 新增权限业务需要,能够给某个用户施行解冻帐户操作,这时候间接增加一个权限,并配置到管理员即可 在线体验应用分支的形式,展现在 vscode 中实现一个 SpringBoot 的 RBAC 鉴权服务的具体过程,能够用来当做一些后盾零碎的根底模板,能够一步一步的依照程序联合分支代码进行尝试 在线文档 在线体验 用户帐户明码管理员adminpassword普通用户normalpassword后端源码 关键词:spring-boot jpa gradle 前端源码 关键词:vue3 composition vite pinia eslint lint-staged commitlint 具体过程1-开发环境筹备jdk 阐明以及装置gradle 阐明和装置配置vscode 插件举荐2-初始化 SpringBoot初始化 spring-boot 我的项目,启动在 vscode 关上调试模式,查看调试信息3-Web增加 web 依赖,启动增加根路由接口,启动,浏览器拜访4-详解 RBAC剖析 RBAC 的数据结构剖析具体的应用办法5-JPA 和 Mysql创立本地数据库增加 JPA 和 MySQL 依赖,并且胜利启动设计具体的 Entity启动,查看数据库6-API 设计设计 Restful API 接口接口标准相干7-API 实现实现 Controller 层增加 API 阐明文档8-Repo 和 ServiceJpaRepositoryService角色和用户的 Controller9-Security增加 Security,拜访接口登录,拜访接口实现登录权限认证登录接口增加 jjwt 依赖10-Security 验证和解决增加最新的 Security 配置登录过程认证过程接口权限认证过程增加测试用户数据登录、测试接口权限11-多对多关系lazy 查问解决循环援用问题搭配前端联调12-部署在 heroku 创立利用和数据库部署利用在 vercel 部署前端在线拜访

July 6, 2022 · 1 min · jiezi

Laravel-Authorization支持-ACLRBACABAC-等模型的授权库

Laravel Authorization 基于 Casbin ,是一个支持访问多种访问控制模型(如ACL,RBAC,ABAC等)的授权库。在这之前,你需要先了解 Casbin 。 安装使用 Composer 安装: composer require casbin/laravel-authzLauthz\LauthzServiceProvider 是 auto-discovered 的,并且默认情况下已注册,但是如果您想自己注册,可以在 config/app.php 中添加 ServiceProvider: 'providers' => [ /* * Package Service Providers... */ Lauthz\LauthzServiceProvider::class,]Enforcer facade 也是 auto-discovered,但是如果您想手动添加它,在 config/app.php添加: 'aliases' => [ // ... 'Enforcer' => Lauthz\Facades\Enforcer::class,]要发布配置,请运行 vendor:publish 命令: php artisan vendor:publish这就自动创建 Model 配置文件 config/lauthz-rbac-model.conf 和 一个新的 Lauthz 配置文件 config/lauthz.php。 要迁移迁移,请运行migrate命令: php artisan migrate这将创建一个 rules 数据表。 用法快速开始安装后,您可以执行以下操作: use Enforcer;// adds permissions to a userEnforcer::addPermissionForUser('eve', 'articles', 'read');// adds a role for a user.Enforcer::addRoleForUser('eve', 'writer');// adds permissions to a ruleEnforcer::addPolicy('writer', 'articles','edit');您可以校验用户的权限,如下: ...

October 14, 2019 · 2 min · jiezi

Yii授权之基于角色的存取控制-RBAC

一:基本概念 角色是 权限 的集合 (例如:建贴、改贴)。一个角色 可以指派给一个或者多个用户。要检查某用户是否有一个特定的权限, 系统会检查该包含该权限的角色是否指派给了该用户。 可以用一个规则 rule 与一个角色或者权限关联。一个规则用一段代码代表, 规则的执行是在检查一个用户是否满足这个角色或者权限时进行的。例如,"改帖" 的权限 可以使用一个检查该用户是否是帖子的创建者的规则。权限检查中,如果该用户 不是帖子创建者,那么他(她)将被认为不具有 "改帖"的权限。 角色和权限都可以按层次组织。特定情况下,一个角色可能由其他角色或权限构成, 而权限又由其他的权限构成。Yii 实现了所谓的 局部顺序 的层次结构,包含更多的特定的 树 的层次。 一个角色可以包含一个权限,反之则不行。(译者注:可理解为角色在上方,权限在下方,从上到下如果碰到权限那么再往下不能出现角色) 二:配置 RBAC 在开始定义授权数据和执行存取检查之前,需要先配置应用组件 yiibaseApplication::authManager 。 Yii 提供了两套授权管理器: yiirbacPhpManager 和 yiirbacDbManager。前者使用 PHP 脚本存放授权数据, 而后者使用数据库存放授权数据。 如果你的应用不要求大量的动态角色和权限管理, 你可以考虑使用前者 1:使用yiirbacPhpManager return [ // ... 'components' => [ 'authManager' => [ 'class' => 'yii\rbac\PhpManager', ], // ... ],];配置完成之后你就可以通过Yii::$app->authManager来访问 authManager yiirbacPhpManager 默认将 RBAC 数据保存在 @app/rbac 目录下的文件中。 如果权限层次数据在运行时会被修改,需确保WEB服务器进程对该目录和其中的文件有写权限。 2:使用yiirbacDbManager (1)配置yiirbacDbManager ...

June 29, 2019 · 1 min · jiezi

猫头鹰的深夜翻译:对于RestAPI简单的基于身份的权限控制

前言基于角色的权限控制(RBAC)是管理用户对某种资源或操作的权限的通用方法。权限可以明确指定可以访问的资源和操作。基本原理如下:权限将被分配给某个角色,并将该角色分配给某个用户或者是用户组,而不是直接分配给某个用户。角色与权限捆绑将权限与单个用户关联起来是一件很复杂的事情,随着更多的用户使用系统,维护用户的权限变得更加困难,且容易出错。权限的错误分配会阻止用户访问所需的系统,甚至是允许非授权用户访问限制区域或是执行危险操作。在这篇文章中,我会介绍如何对应用开启权限控制。权限控制的模型有许多种,比如RBAC(基于角色的权限控制),DAC(自由访问控制)等。虽然文档中解释的原则可以应用于各种模型,但我选择RBAC作为参考,因为它被广泛接受并且非常直观。查看用户的活动通常只会产生用户执行的有限数量的操作(如读取数据,提交表单)。深入观察这些用户的行为会发现,这些行为通常一起执行,即执行A操作的用户往往也会执行B操作。比如,读取并更新报告,或者是添加和删除用户。这些都可以与角色绑定,比如编辑或是账户管理员。注意这里的角色并不一定和职称或是组织结构绑定,而是以有意义的方式反映相关的用户操作。当恰当划分好角色并分配给用户时,就可以将权限分配给每个角色,而非用户。管理少量角色的权限是一件相对简单的事情。如下,是没有角色作为中介的权限与用户图:而如下,则是完全相同的用户和权限集,由角色组织:显而易见,角色使得权限管理更容易了用户与群组绑定将用户与群组绑定是一种更好的实践。在观察用户关于上述角色的行为模式时,我们经常发现用户之间有很多共同之处,比如某一组用户常常行为相似–在共同的资源上执行相同的操作。这允许我们将用户组织到组中,然后将角色分配给少数组,而不是许多用户。比如,会发现一组用户都需要系统管理员权限,因此我们新建一个名叫账户管理员的群组,将用户添加到该组并将该角色分配给该组,而不是每个用户。实现角色时的注意事项不要将行为和验证细节耦合在许多系统中,开发人员通过直接在实现方法上指定权限来限制对特定操作的访问。没错,就在代码上!通常,角色的验证通过注解添加到需要检查的方法上,比如这里提供了一个spring-security的一个范例:@PreAuthorize(“hasRole(‘Editor’)”) public void update_order(Order order);在不同语言和框架中,这种做法非常常见。虽然很容易实现,但遗憾的是,它在所需角色和动作的实现之间产生了不希望的耦合。想象一下有几十个方法都需要添加这样的注解。跟踪每一个角色的有效操作将会变得很艰难,几乎肯定会导致依赖于不准确或过时的文档,或者更糟糕的是 - 分散在您的应用程序中的未知,非托管权限。从客户的角度来看,这种耦合使得无法修改开发人员事先定义的角色集或者他们的权限,因为更改它意味着每次都必须编译和打包代码!这种用户体验也许不是我们的目标。如何避免耦合更好的方式是,首先从要由外部授权机制处理的代码中提取可能的操作列表,然后,我们可以使代码不知道角色或任何其他授权细节,简单地询问当前用户(无论它是否被检索)是否具有执行特定方法所需的权限(无论在何处定义)。这允许我们使用更加通用的注解,如下所示:@Secured public void update_order(Order order);角色和权限的映射(即执行特定操作的权限)现在可以在配置文件中完成,可以由客户轻松定制!比如,假设有这样的一个roles_config.yml文件:order_manager: - ‘create_order’ - ‘view_order’ - ‘delete_order’ - ‘update_order’order_inspector: - ‘viewer_order’由@secured注解的方法回去查询配置文件确定当前用户是否具有执行该操作的权限。这意味着当前用户必须具有order_manager的角色,而这一点也是很容易配置的。但是,授权机制必须知道如何将每个权限与代码中的特定方法相匹配,并且有人必须记录所有可用的方法(即create_order,view_order等)。关注点分离–外部授权既然方法实现代码不包含授权细节,整个授权逻辑可以移动到单独的独立模块。通过使用通用标题(例如注解@secure),我们允许修改整个授权机制而不影响应用程序的代码。例如,可以将@secure实现为基于角色的检查,但也可以使用访问控制列表(ACL)。比如,检查当前用户是否列在订单的ACL列表中。另一种解决方案可以是通过询问第三方是否允许用户执行该动作来使用oauth。Rest是最佳选择提取操作–举手之劳REST接口肯定更好,或者至少是最容易匹配这个模型的。设计良好的Rest服务通过标准的基于HTTP的API暴露资源和方法,资源通过URI定义,方法通过HTTP动词(如GET,PUT)等定义。比如,POST http://www.domain.com/bookings会创建一本新书,而GET http://www.domain.com/orders/12345会返回订单#12345的详情。这意味着可以轻而易举的获得资源的名称和对资源的操作。请求网关除了标准的建模操作之外,REST服务通常是请求流中评估身份验证和授权的好地方,因为这通常是系统的主要入口点。为了使访问控制机制有意义,建议阻止所有其他到系统的路由,例如直接访问数据存储或代码中的任何远程调用机制。该架构的另一个重要优点是响应过滤,以防某些不应当返回给用户的数据写在响应中。请求也是访问控制工具REST服务处理传入请求,这意味着请求中找到的信息可用于制定访问控制决策。一些有用的细节是:请求源:允许阻止来自不明IP或是网段的请求请求头:许多有意义的细节可以在请求头传递,比如用户凭证,从而支持全面的认证/授权过程。目标终端:如请求的URI所示。根据其他条件,访问可以仅限于应用程序端点的子集。例如,虽然version端点对所有人开放,但secret端点仅对经过身份验证的用户开放。目标方法:由HTTP动词(例如DELETE)表示,这意味着可以基于被调用的方法传递或阻止请求。总而言之:用REST来实现权限控制所有的资源将会通过REST的URI表示,操作通过HTTP动词表示,这能够覆盖所有能被执行且需要验证的操作。在下面的例子中,定义了三个角色:order_manager:能够查看,创建,更新和删除订单order_editor:能够查看,创建,更新订单,但不能删除他们order_inspector:只能查看订单order_manager: ‘/orders’: - ‘GET’ - ‘POST’ - ‘PUT’ - ‘DELETE’order_editor: ‘/orders’: - ‘GET’ - ‘POST’ - ‘PUT’order_inspector: ‘/orders’: - ‘GET’由此可见,REST天然能够实现权限控制。通过处理传入请求,REST服务能够检索有价值的信息,这些信息可以移交给单独的模块以执行身份验证和授权。如果用户被授权在目标资源上执行所请求的方法,则可以继续请求处理。否则,在到达任何内部应用程序代码之前拒绝进一步访问。

January 29, 2019 · 1 min · jiezi

PyCasbin: 支持 ACL、RBAC、ABAC 多种模型的 Python 权限管理框架

PyCasbin 是一个用 Python 语言打造的轻量级开源访问控制框架( https://github.com/casbin/pyc… ),目前在 GitHub 开源。PyCasbin 采用了元模型的设计思想,支持多种经典的访问控制方案,如基于角色的访问控制 RBAC、基于属性的访问控制 ABAC 等。PyCasbin 的主要特性包括1.支持自定义请求的格式,默认的请求格式为{subject, object, action};2.具有访问控制模型 model 和策略 policy 两个核心概念;3.支持 RBAC 中的多层角色继承,不止主体可以有角色,资源也可以具有角色;4.支持超级用户,如 root 或 Administrator,超级用户可以不受授权策略的约束访问任意资源;5.支持多种内置的操作符,如 keyMatch,方便对路径式的资源进行管理,如 /foo/bar 可以映射到 /foo*PyCasbin 不做的事情:1.身份认证 authentication (即验证用户的用户名、密码),PyCasbin 只负责访问控制。应该有其他专门的组件负责身份认证,然后由 PyCasbin 进行访问控制,二者是相互配合的关系;2.管理用户列表或角色列表。PyCasbin 认为由项目自身来管理用户、角色列表更为合适,PyCasbin 假设所有策略和请求中出现的用户、角色、资源都是合法有效的。安装pip install casbinHelloWorld 例子1.初始化一个 enforcer,传入两个参数:模型文件路径和策略文件路径;import casbine = casbin.Enforcer(“path/to/model.conf”, “path/to/policy.csv”)2.在你的代码需要进行访问控制的位置,加入如下钩子;sub = “alice” # the user that wants to access a resource.obj = “data1” # the resource that is going to be accessed.act = “read” # the operation that the user performs on the resource.if e.enforce(sub, obj, act): # permit alice to read data1 passelse: # deny the request, show an error pass3.采用管理 API 进行权限的管理,如获取一个用户所有的角色;roles = e.get_roles(“alice”)社区进展PyCasbin 目前正在积极向社区进行推送,并且可以通过插件的方式已经支持与 Django 等 Web 框架进行集成,将来会推广到更多 Web 框架以及社区。Casbin 已经有 Golang 版本、Java 版本、PHP 版本、Node.js 版本、Pytho n版本 等主流语言版本。有跨语言需求的开发者可以只用 Casbin 这一套框架就实现多个不同语言的项目的权限管理任务。PyCasbin (Python): https://github.com/casbin/pyc...Casbin (Go): https://github.com/casbin/casbinjCasbin (Java): https://github.com/casbin/jca...PHP-Casbin (PHP): https://github.com/php-casbin...Node-Casbin (Node.js): https://github.com/casbin/nod…协议PyCasbin 采用 Apache 2.0 开源协议发布。联系作者有问题请提交 Issues: https://github.com/casbin/pyc…或者加入 QQ 群:546057381( Casbin 访问控制讨论群) ...

January 25, 2019 · 1 min · jiezi

vue基于d2-admin的RBAC权限管理解决方案

前两篇关于vue权限路由文章的填坑,说了一堆理论,是时候操作一波了。vue权限路由实现方式总结vue权限路由实现方式总结二选择d2-admin是因为element-ui的相关开源项目里,d2-admin的结构和代码是让我感到最舒服的,而且基于d2-admin实现RBAC权限管理也很方便,对d2-admin没有大的侵入性的改动。预览地址Github 相关概念不了解RBAC,可以看这里企业管理系统前后端分离架构设计 系列一 权限模型篇实现了RBAC模型权限控制菜单与路由独立管理,完全由后端返回user存储用户admin标识用户是否为系统管理员role存储角色信息roleUser存储用户与角色的关联关系menu存储菜单信息,类型分为菜单与功能,一个菜单下可以有多个功能,菜单类型的permission字段标识访问这个菜单需要的功能权限,功能类型的permission字段相当于此功能的别称,所以菜单类型的permission字段为其某个功能类型子节点的permission值permission存储角色与功能的关联关系interface存储接口信息functionInterface存储功能与接口关联关系,通过查找用户所属角色,再查找相关角色所具备的功能权限,再通过相关功能就可以查出用户所能访问的接口route存储前端路由信息,通过permission字段过滤出用户所能访问的路由运行流程及相关API使用d2admin的原有登录逻辑,全局路由守卫中判断是否已经拉取权限信息,获取后标识为已获取。const token = util.cookies.get(’token’) if (token && token !== ‘undefined’) { //拉取权限信息 if (!isFetchPermissionInfo) { await fetchPermissionInfo(); isFetchPermissionInfo = true; next(to.path, true) } else { next() } } else { // 将当前预计打开的页面完整地址临时存储 登录后继续跳转 // 这个 cookie(redirect) 会在登录后自动删除 util.cookies.set(‘redirect’, to.fullPath) // 没有登录的时候跳转到登录界面 next({ name: ’login’ }) }//标记是否已经拉取权限信息let isFetchPermissionInfo = falselet fetchPermissionInfo = async () => { //处理动态添加的路由 const formatRoutes = function (routes) { routes.forEach(route => { route.component = routerMapComponents[route.component] if (route.children) { formatRoutes(route.children) } }) } try { let userPermissionInfo = await userService.getUserPermissionInfo() permissionMenu = userPermissionInfo.accessMenus permissionRouter = userPermissionInfo.accessRoutes permission.functions = userPermissionInfo.userPermissions permission.roles = userPermissionInfo.userRoles permission.interfaces = util.formatInterfaces(userPermissionInfo.accessInterfaces) permission.isAdmin = userPermissionInfo.isAdmin == 1 } catch (ex) { console.log(ex) } formatRoutes(permissionRouter) let allMenuAside = […menuAside, …permissionMenu] let allMenuHeader = […menuHeader, …permissionMenu] //动态添加路由 router.addRoutes(permissionRouter); // 处理路由 得到每一级的路由设置 store.commit(‘d2admin/page/init’, […frameInRoutes, …permissionRouter]) // 设置顶栏菜单 store.commit(‘d2admin/menu/headerSet’, allMenuHeader) // 设置侧边栏菜单 store.commit(‘d2admin/menu/fullAsideSet’, allMenuAside) // 初始化菜单搜索功能 store.commit(‘d2admin/search/init’, allMenuHeader) // 设置权限信息 store.commit(‘d2admin/permission/set’, permission) // 加载上次退出时的多页列表 store.dispatch(‘d2admin/page/openedLoad’) await Promise.resolve()}后端需要返回的权限信息包括权限过滤后的角色编码集合,功能编码集合,接口信息集合,菜单列表,路由列表,以及是否系统管理员标识。格式如下{ “statusCode”: 200, “msg”: “”, “data”: { “userName”: “MenuManager”, “userRoles”: [ “R_MENUADMIN” ], “userPermissions”: [ “p_menu_view”, “p_menu_edit”, “p_menu_menu” ], “accessMenus”: [ { “title”: “系统”, “path”: “/system”, “icon”: “cogs”, “children”: [ { “title”: “系统设置”, “icon”: “cogs”, “children”: [ { “title”: “菜单管理”, “path”: “/system/menu”, “icon”: “th-list” } ] }, { “title”: “组织架构”, “icon”: “pie-chart”, “children”: [ { “title”: “部门管理”, “icon”: “html5” }, { “title”: “职位管理”, “icon”: “opencart” } ] } ] } ], “accessRoutes”: [ { “name”: “System”, “path”: “/system”, “component”: “layoutHeaderAside”, “componentPath”: “layout/header-aside/layout”, “meta”: { “title”: “系统设置”, “cache”: true }, “children”: [ { “name”: “MenuPage”, “path”: “/system/menu”, “component”: “menu”, “componentPath”: “pages/sys/menu/index”, “meta”: { “title”: “菜单管理”, “cache”: true } }, { “name”: “RoutePage”, “path”: “/system/route”, “component”: “route”, “componentPath”: “pages/sys/route/index”, “meta”: { “title”: “路由管理”, “cache”: true } }, { “name”: “RolePage”, “path”: “/system/role”, “component”: “role”, “componentPath”: “pages/sys/role/index”, “meta”: { “title”: “角色管理”, “cache”: true } }, { “name”: “UserPage”, “path”: “/system/user”, “component”: “user”, “componentPath”: “pages/sys/user/index”, “meta”: { “title”: “用户管理”, “cache”: true } }, { “name”: “InterfacePage”, “path”: “/system/interface”, “component”: “interface”, “meta”: { “title”: “接口管理” } } ] } ], “accessInterfaces”: [ { “path”: “/menu/:id”, “method”: “get” }, { “path”: “/menu”, “method”: “get” }, { “path”: “/menu/save”, “method”: “post” }, { “path”: “/interface/paged”, “method”: “get” } ], “isAdmin”: 0, “avatarUrl”: “https://api.adorable.io/avatars/85/abott@adorable.png" }}设置菜单将固定菜单(/menu/header、/menu/aside)与后端返回的权限菜单(accessMenus)合并后,存入相应的vuex store模块中…let allMenuAside = […menuAside, …permissionMenu]let allMenuHeader = […menuHeader, …permissionMenu]…// 设置顶栏菜单store.commit(‘d2admin/menu/headerSet’, allMenuHeader)// 设置侧边栏菜单store.commit(‘d2admin/menu/fullAsideSet’, allMenuAside)// 初始化菜单搜索功能store.commit(‘d2admin/search/init’, allMenuHeader)处理路由默认使用routerMapComponents 的方式处理后端返回的权限路由//处理动态添加的路由const formatRoutes = function (routes) { routes.forEach(route => { route.component = routerMapComponents[route.component] if (route.children) { formatRoutes(route.children) } })}…formatRoutes(permissionRouter)//动态添加路由router.addRoutes(permissionRouter);// 处理路由 得到每一级的路由设置store.commit(‘d2admin/page/init’, […frameInRoutes, …permissionRouter])路由处理方式及区别可看vue权限路由实现方式总结二设置权限信息将角色编码集合,功能编码集合,接口信息集合,以及是否系统管理员标识存入相应的vuex store模块中…permission.functions = userPermissionInfo.userPermissionspermission.roles = userPermissionInfo.userRolespermission.interfaces = util.formatInterfaces(userPermissionInfo.accessInterfaces)permission.isAdmin = userPermissionInfo.isAdmin == 1…// 设置权限信息store.commit(‘d2admin/permission/set’, permission)接口权限控制以及loading配置支持使用角色编码,功能编码以及接口权限进行控制,如下export function getMenuList() { return request({ url: ‘/menu’, method: ‘get’, interfaceCheck: true, permission:[“p_menu_view”], loading: { type: ’loading’, options: { fullscreen: true, lock: true, text: ‘加载中…’, spinner: ’el-icon-loading’, background: ‘rgba(0, 0, 0, 0.8)’ } }, success: { type: ‘message’, options: { message: ‘加载菜单成功’, type: ‘success’ } } })}interfaceCheck: true表示使用接口权限进行控制,如果vuex store中存储的接口信息与当前要请求的接口想匹配,则可发起请求,否则请求将被拦截。permission:[“p_menu_view”]表示使用角色编码和功能编码进行权限校验,如果vuex store中存储的角色编码或功能编码与当前表示的编码相匹配,则可发起请求,否则请求将被拦截。源码位置在libs/permission.js,可根据自己需求进行修改loading配置相关源码在libs/loading.js,根据自己需求进行配置,success也是如此,源码在libs/loading.js。 照此思路可以自行配置其它功能,比如请求失败等。页面元素权限控制使用指令v-permission: <el-button v-permission:function.all=”[‘p_menu_edit’]" type=“primary” icon=“el-icon-edit” size=“mini” @click=“batchEdit” >批量编辑</el-button>参数可为function、role,表明以功能编码或角色编码进行校验,为空则使用两者进行校验。修饰符all,表示必须全部匹配指令值中所有的编码。源码位置在plugin/permission/index.js,根据自己实际需求进行修改。使用v-if+全局方法:<el-button v-if=“canAdd” type=“primary” icon=“el-icon-circle-plus-outline” size=“mini” @click=“add” >添加</el-button>data() { return { canAdd: this.hasPermissions([“p_menu_edit”]) }; },默认同时使用角色编码与功能编码进行校验,有一项匹配即可。类似的方法还要hasFunctions,hasRoles。源码位置在plugin/permission/index.js,根据自己实际需求进行修改。不要使用v-if=“hasPermissions([‘p_menu_edit’])“这种方式,会导致方法多次执行也可以直接在组件中从vuex store读取权限信息进行校验。开发建议页面级别的组件放到pages/目录下,并且在routerMapCompnonents/index.js中以key-value的形式导出不需要权限控制的固定菜单放到menu/aside.js和menu/header.js中不需要权限控制的路由放到router/routes.js frameIn内需要权限控制的菜单与路由通过界面的管理功能进行添加,确保菜单的path与路由的path相对应,路由的name与页面组件的name一致才能使keep-alive生效,路由的component在routerMapCompnonents/index.js中能通过key匹配到。开发阶段菜单与路由的添加可由开发人员自行维护,并维护一份清单,上线后将清单交给相关的人去维护即可。如果觉得麻烦,不想菜单与路由由后端返回,可以在前端维护一份菜单和路由(路由中的component还是使用字符串,参考mock/permissionMenuAndRouter.js),并且在菜单和路由上面维护相应的权限编码,一般都是使用功能编码。后端就不需要返回菜单和路由信息了,但是其他权限信息,比如角色编码,功能编码等还是需要的。通过后端返回的功能编码列表,在前端过滤出用户具备权限的菜单和路由,过滤处理后后的菜单与路由格式与之前由后端返回的格式一致,然后将处理后的菜单与路由当做后端返回的一样处理即可。数据mock与代码生成数据mock使用lazy-mock修改而来的d2-admin-server,数据真实来源于后端,相比其他工具,支持数据持久化,存储使用的是json文件,不需要安装数据库。简单的配置即可自动生成增删改查的接口。后端使用中间件控制访问权限,比如: .get(’/menu’, PermissionCheck(), controllers.menu.getMenuList)PermissionCheck默认使用接口进行校验,校验用户所能访问的API中是否匹配当前API,支持使用功能编码与角色编码进行校验PermissionCheck([“p_menu_edit”],[“r_menu_admin”],true),第一个参数为功能编码,第二个为角色编码,第三个为是否使用接口进行校验。更多详细用法可看lazy-mock文档前端代码生成还在开发中… ...

January 6, 2019 · 3 min · jiezi

开源干货!.NET Core + Vue.js通用动态权限(RBAC)管理系统框架[DncZeus]开源

DncZeus前言关于 DncZeusDncZeus = Dnc + Zeus"Dnc"–.Net Core 的缩写;“Zeus”–中文译为宙斯,是古希腊神话中的众神之王,奥林匹斯十二主神之首,统治宇宙万物的至高无上的主神(在古希腊神话中主神专指宙斯),人们常用“众神和人类的父亲”、“神王”来称呼他,是希腊神话诸神中最伟大的神。DncZeus的愿景就是做一个.NET Core 领域的简易精致的通用后台权限管理模板系统基础框架,努力向.NET Core 领域的"宙斯"看齐。项目简介DncZeus是一个基于 ASP.NET Core 2 + Vue.js 的前后端分离的通用后台管理系统框架。后端使用.NET Core 2 + Entity Framework Core 构建,UI 则是目前流行的基于 Vue.js 的 iView。项目实现了前后端的动态权限管理和控制以及基于 JWT 的用户令牌认证机制,让前后端的交互更流畅。DncZeus并不是一个完整的业务系统,但她提供完成业务系统的绝大多数开发场景,让每一位.NET 开发者都能基于DncZeus快速开发出交互、体验以及功能具佳的.NET Core 单页应用程序(SPA)。支持DncZeus(求Start :))如果你觉得DncZeus对你或者他人有用,请为DncZeus点个赞,求扩散,让更多人获得帮助!!!在线体验(Demo)超级管理员:administrator 管理员:admin密码:111111地址:https://dnczeus.codedefault.com由于是个人项目,资金有限,体验服是低配,请大家爱惜,轻戳,不胜感激!!!适合人群由于 DncZeus 考虑到初级.NET 开发者都可以使用,所以后端项目未涉及过多架构和封装(代码逻辑一目了然),但为了你更好地熟悉和运用 DncZeus,你需要了解:ASP.NET CoreVue.jsiViewASP.NET Core 的知识能确保你可以看懂和了解后端是如何实现和工作的,而 Vue.js 框架则是前端实现的基石,当然 iView 这个基于 Vue.js 的 UI 框架也是必须要了解的,因为 DncZeus 正是基于 [iview-admin]1来实现的前端 UI 交互。如果你对这两个方面的知识还不熟悉,建议你可以先学习一些理论再来运用 DncZeus 这个框架。关于 ASP.NET Core 和 Vue.js 的入门请参考:ASP.NET Core 官方文档Vue.js 官方文档环境和工具Node.js(同时安装 npm 前端包管理工具)Visual Studio 2017(15.8.8 或者以上版本)VS Code 或者其他前端开发工具git 管理工具SQL Server CE 或者 SQL Server Express 或者 SQL Server 2014 +技术实现ASP.NET Core 2(.NET Core 2.1.502)ASP.NET WebApi CoreJWT 令牌认证AutoMapperEntity Framework Core 2.0.NET Core 依赖注入Swagger UIVue.js(ES6 语法)iView(基于 Vue.js 的 UI 框架)下载项目使用Git工具下载首先请确保你本地开发环境已安装了git管理工具,然后在需要存放本项目的目录打开git命令行工具Git Bash Here,在命令行中输入如下命令:git clone https://github.com/lampo1024/DncZeus.git以上命令就把DncZeus的远程代码拉取到你的本地开发机上。手动下载如果你不愿意使用git管理工具下载DncZeus的远程代码,你也可以在github托管地址手动下载,打开地址https://github.com/lampo1024/…,找到页面中的按钮"Clone or download",如下图示:在弹出的对话框中点击按钮"Download ZIP"即可开始下载DncZeus的源代码,如下图:安装依赖前端项目在将DncZeus的源代码下载到本地之后,如果你使用的git管理工具,可以不用退出当前的git管理工具,输入如下命令:cd DncZeus/DncZeus.App进入到DncZeus的前端项目目录DncZeus.App。在命令行中输入如下命令进行前端依赖包的还原操作:npm install或者npm i后端项目在Visual Studio中打开解决方案[DncZeus.sln]。首先根据自己的开发环境(SQL Server数据库类型,本示例默认是SQL Server Localdb)修改配置文件appsettings.json中的数据库连接字符串,示例默认连接字符串为:“ConnectionStrings”: { “DefaultConnection”: “Server=(localdb)\mssqllocaldb;Database=DncZeus;Trusted_Connection=True;MultipleActiveResultSets=true” }再打开包管理控制台(Package Manager Console),执行如下命令生成数据库表结构:Update-Database -verbose最后,打开项目根目录中的脚本文件夹[Scripts],执行脚本文件[Init_data.sql]以初始化系统数据。恭喜你,到这里所有的准备工作就完成了。赶紧体验DncZeus框架吧!!!运行使用Visual Studio开发工具打开DncZeus根目录中的VS解决方案文件DncZeus.sln,设置DncZeus.Api项目为默认启动项并运行此项目。这时在浏览器中打开地址:http://localhost:54321/swagger ,便可以查看到DncZeus已经实现的后端API接口服务了。在命令行中进入到DncZeus的前端项目目录[DncZeus.App],运行如下命令以启动前端项目服务:npm run dev成功运行后会自动在浏览器中打开地址: http://localhost:9000使用和授权DncZeus项目是一个开源项目,你可以直接基于本项目进行扩展或者二次开发,也可以修改其中的代码。但请保留原文件中的版权信息,尊重本人的劳动成果,违者必究,谢谢合作。问题与反馈遇到问题怎么办?直接提交issueQQ群:483350228码友网 ...

December 21, 2018 · 1 min · jiezi