laravel权限动态显示菜单以及按钮

一、动态读取用户菜单

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的路上,如果你觉得本文对你有所帮助的话,那就请关注点赞评论三连吧,谢谢,你的肯定是我写博的另一个支持。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

你华还是你华

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值