本文目录
一、动态读取用户菜单
1.1 配置超级管理员
在.env
文件夹下配置超级管理员账号为admin
:
1.2 在用户登陆时读取角色
在LoginController.php
登陆控制器中在用户登陆成功时读取用户权限:
// 判断是否登录成功
if ($bool) {
// 得到用户权限
// 判断以下是否是超级管理员
if (env('SUPER') != $post['username']) {
$userModel = auth() -> user();
// dump($userModel);
$roleModel = $userModel -> role;
$nodeArr = $roleModel -> nodes() -> pluck('name', 'id') -> toArray();
// dump($nodeArr);
// 权限保存到session中
session(['admin.auth' => $nodeArr]);
}
else {
session(['admin.auth' => true]);
}
return redirect(route('admin.index'));
}
1.3 修改权限模型层级方法
/**
* 获取有层级的数据
* @param $allow_node 用户有的权限
* @return array
*/
public function treeData($allow_node) {
$query = Node::where('is_menu', '1');
if ($allow_node !== true) {
// 不是超级管理员
$query -> whereIn('id',array_keys($allow_node));
}
$menuData = $query -> get() -> toArray();
return $this -> subTree($menuData);
}
1.4 修改后台首页显示控制器
// 后台首页显示
public function index() {
// 权限
$auth = session('admin.auth');
// 读取菜单 将当前角色的菜单id传过去
$menuData = (new Node()) -> treeData($auth);
// dump($menuData);
return view('admin.index.index', compact('menuData'));
}
1.5 效果
1.6 权限不彻底问题
我们会发现当我记住添加节点的路由地址http://laravelproject.com/admin/node/create
,我们退出管理员的账号,随便登一个没有这个权限的账号,去访问这个添加节点的路由地址,发现也能访问的到。所以第二小节来解决这个问题。
二、权限路由问题
2.1 配置文件修改
在config
文件夹下新建rbac.php
文件,将权限配置写入:
<?php
return [
'super' => 'admins', // 超级管理员
'allow_route' => [ // 不验证到路由
'admin.welcome',
'admin.index',
'admin.logout'
],
];
更改LoginController.php
中配置:
2.2 登陆中间件
在Middleware
文件下修改CheckAdminLogin.php
中间件
<?php
namespace App\Http\Middleware;
use Closure;
class CheckAdminLogin
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
// 用户是否登录检查
if (!auth() ->check()) {
return redirect(route('admin.login')) -> withErrors(['error' => '未登录,请登录']);
}
// 访问到权限
$auths = is_array(session('admin.auth')) ? array_filter(session('admin.auth')) : []; // 数组去空
$auths = array_merge($auths, config('rbac.allow_route'));
// dump($auths);
// 当前访问的路由
$currentRoute = $request -> route() -> getName();
if (auth() -> user() -> username != config('rbac.super') && !in_array($currentRoute, $auths)) {
exit('没有权限');
}
// 如果没有停止则向后执行
return $next($request);
}
}
2.3 修改登录控制器
LoginController.php
:
$nodeArr = $roleModel -> nodes() -> pluck('route_name', 'id') -> toArray();
效果:
三、非菜单权限隐藏
使用多继承来控制非菜单权限隐藏
在Models
文件夹下创建Traits
文件夹,在这个文件夹下创建Btn.php
:
<?php
// 按钮
namespace App\Models\Traits;
trait Btn {
public function editBtn (string $route) {
// dd(request() -> auths);
if (auth() -> user() -> username != config('rbac.super') && !in_array($route, request() -> auths)) {
return '';
}
return '<a href="'.route($route, $this).'">修改</a>';
}
}
以修改用户按钮演示,其他按钮雷同:
在用户User.php
模型下使用多继承:
在用户列表显示模版中修改 修改按钮:
{!! $item -> editBtn('admin.user.edit') !!}
效果:
用非超级管理账号登陆:
可以看到修改按钮已经不见了。
用超级管理员账号登陆:
可以看到修改按钮存在。
至此laravel
后台菜单权限已完成。
在学习的php的路上,如果你觉得本文对你有所帮助的话,那就请关注点赞评论三连吧,谢谢,你的肯定是我写博的另一个支持。