windhoney / yii2-rest-rbac

yii2 rbac yii2 rest RBAC Auth manager for Yii2 RESTful(YII2权限管理rbac--rest接口方式)
https://windhoney.gitbooks.io/yii2-rest-rbac/
MIT License
82 stars 20 forks source link

前后端分离后,如何控制同一个路由页面中不同角色显示不同的页面元素 #21

Closed wayne798 closed 6 years ago

wayne798 commented 6 years ago

首先感谢@windhoney还在更新。现在遇到这样一个问题,想请教一下解决方案。我们前端是vuejs+element-ui,接口就是yii2了。基于现在的rbac解决方案,可以控制某个路由级的权限,比如说create、update、delete等。现在有一个情况是,在一个订单展示页面,不同角色的用户可以查询的内容不一样,比如说admin可以查询订单的价格、数量、利润,而普通员工则只能查询价格和数量。价格、数量、利润这三个查询项是以三个button来展示的,我想的是,如果是admin则在页面上展示这三个button,如果是普通员工则只展示前两个button。因为是前后端分离的,那么在展示这个页面的时候是不是就应该知道该展示哪些button?这个数据是不是应该由接口返回呢,如果说是接口返回的话,那么接口怎么根据不同的角色来确定显示哪些元素并将数据返回去前段。@windhoney你有遇到这样的权限处理场景吗?

windhoney commented 6 years ago

才看到 如果在同一个页面,“价格、数量、利润这三个查询项是以三个button来展示的”,首先权限控制上肯定是可以的,创建这3个不同的路由,然后控制路由的访问权限,可以限制其他人查询(点击报403)

但是你要的是控制前端不展示这些按钮,那就只能由后台返回,后台通过读取当前用户的权限,来返回展示按钮,--我之前做过一个,也许能满足你这个需求,把“价格、数量、利润”这3个按钮添加到菜单,控制菜单下的路由的权限,返回当前用户的,这个父级菜单下的子菜单 $menus = MenuHelper::getAssignedMenu(Yii::$app->user->id, Yii::$app->params["you_menu_root__id"]);

you_menu_root__id是这3个菜单的父级菜单

wayne798 commented 6 years ago

我可能没表述明白,我这个三个按钮不是对应的三个路由,而是代表的查询的三个参数项,其实点击查询后走得都是一个路由比如说actionSearch,只是传的不同的参数['价格','数量','利润']。我想的是,让admin可以在页面上选择这三项,而user只能看到其中的某一些项。我现在想到的是,创建三个控制这几个选项显隐的权限,然后分配给不同的角色,后台通过判断权限来给前台可以显示的部分。再就是前段提交查询后,后端还要做判断处理,因为如果前端传过来了三个参数,但是当前用户只能查询两个,那么就得返错了,那么这个判断处理应该放在哪里呢,放在actionSearch里面?拿到post参数后逐个判断?还是写一个规则,添加到search权限中?或者还是有其他好的解决方案呢

windhoney commented 6 years ago

规则应该也可以的,不过只是个别情况也可以简单做,创建3个路由分别代表'价格','数量','利润'(type1,type2,type3--名字随便起跟3个参数有关就行),设置好权限控制这3个路由,放到菜单里。还是getAssignedMenu 这么去查询当前用户的,给前端-让前端显示;前端显示没问题了, 后端在actionSearch里面去验证参数,还是通过这个方法去获取当前用户的菜单(type1,type2,type3)和传过来的参数比对验证

wayne798 commented 6 years ago

嗯,是一种解决方案。多谢多谢!我先采用规则的方式来实现一下。 还有一个问题,就是路由的parent_name,这样的话可以对路由分组处理,但是只能方便处理成二级菜单,如果是多级的呢?再开一个issue😁