首先要有一个概念,什么是权限控制,一个用户登录的时候,后台会给与不同的角色,每一个角色都有不同的作用,每一个作用就是一个权限。一个用户可以有很多角色(一对多),一个角色可以有很多权限(一对多),同理,一个角色可以有很多用户拥有,一个权限也会有很多角色使用。在日常基本上是一对一或者一堆多的状态,在日常的写作中很少用到多对多,多对多是什么情况呢?
多个用户对应的多个权限,可以理解为多个一对多组合起来互相关联的状态。
现在详细的解释一下在中间件中对用户的权限进行控制
1:首先用户登录时获取瀛湖的角色id,通过角色id 获取用户的权限id(通过角色与权限关联表获取)
当我们获取到用户权限后,存进缓存中。此时,会有两个方法进行控制,一种比较简单,直接再控制器中读取已有的权限,这样首页就只展示用户已经有的权限,其余的不展示。
可查看具体方法:https://blog.csdn.net/NobleCharacter/article/details/125491479?spm=1001.2014.3001.5502
另外一种比较麻烦,在首页展示所有的路由页面,在中间件中进行鉴定,当走的路由不是已有的权限路由时会返回无权限。
首先在中间件中读取缓存中的权限信息
获取当前要走的路由
$route = $request->path();
另外:每个网页都有一些公共的页面需要使用,比如首页,欢迎页等,单独写入到config下的自建文件中,在里面写入公共页面的路由
再中间件读取
因为缓存中读取的数据是二维数组,循环获取每一个数组中的路由名,然后和公共的进行拼接,
然后循环外判断要走的路由是否在已有权限的路由内,如果不在则返回无权限。
// 读取缓存中的权限页面路由
$auths = Cache::get('auths');
// 获取要走的页面路由
$route = $request->path();
$res = config("rbac.allow_route");
if ($auths !== true) {
foreach ($auths as $v) {
// 判断路由名是否为空,最顶端页面无路由名。
if ($v['route_name']!=''){
// 把获取的路由名追加到之前公共的页面路由中
array_push($res,'admin/'.$v['route_name']);
}
}
// 在循环中判断是否有权限
if (!in_array($route, $res)) {
exit('无权限');
}