根据权限在 Laravel 侧边栏中管理

Adminlte in Laravel sidebar based on permission

我有多个拥有多个权限的用户(管理员和用户)。 示例:管理员能够看到边栏 a、b、c 但用户只能看到侧边栏 d、e、f。

可以根据权限加载adminlte.php的菜单吗? 我将权限存储在用户 table (isAdmin, isUser) 中的权限列中 谢谢

adminlte.php中的菜单数组格式:

'menu' => [
        [
            'text' => 'Dashboard',
            'url'  => '/dashboard',
            'icon' => 'dashboard',
        ],
],

我找到的唯一解决方案是普通 php http://seegatesite.com/how-to-create-user-permissions-view-to-dynamic-sidebar-menu-adminlte/

我更喜欢使用内置 adminlte.php

的本机 laravel 解决方案

我认为你应该试试这个包来实现你需要的东西:https://github.com/Zizaco/entrust。这是一个 laravel 包,用于处理基于角色的权限。无论如何,如果您使用这个包,您需要更改一些代码。

希望对您有所帮助。

我最终只是在 page.blade.php 中对每个权限使用两个不同的视图进行硬编码

@if(config('adminlte.layout') != 'top-nav')
        <aside class="main-sidebar">
            <!-- sidebar: style can be found in sidebar.less -->
            <section class="sidebar">
                <!-- Sidebar Menu -->
                <ul class="sidebar-menu">
                    <!-- Left side column. contains the logo and sidebar -->
                    @if (Auth::user()->role == "isAdmin")
                        @include('layouts.sidebar_admin_menu')
                    @elseif (Auth::user()->role == "isNormalUser")
                        @each('adminlte::partials.menu-item', $adminlte->menu(), 'item')
                    @endif
                </ul>
                <!-- /.sidebar-menu -->
            </section>
            <!-- /.sidebar -->
        </aside>       
    @endif

这不是很理想,但暂时效果很好..

理想和简洁的解决方案是将每个权限(创建、更新、删除、读取)存储到具有布尔值的数据库中。

最让我惊讶的是 adminlte 作为最流行的侧边栏框架之一,它没有侧边栏权限的本机功能..

我已经整合了Laravel-AdminLTE

到我的项目。使用这个插件的权限可以像下面这样给出:

'can' => 'add-blog-post'

示例如下:

'menu' => [
    'MAIN NAVIGATION',    
    [
        'text' => 'Pages',
        'url' => 'admin/pages',
        'icon' => 'file',
        'can' => 'add-blog-post'
    ],      
],

我认为使用数据库是明智的选择。但是我们可以避免使用原始数据库查询并使用 Laravel 内置函数。

在 sidebar.blade.php(或您拥有的其他 template/view 文件)中,您可以从数据库中获取权限,然后使用它们来显示您的特定菜单,例如:

 @if(Auth::user()->permission_1)
     <li><a href=""><i class="fa fa-group"></i> menu-item_1</a></li>
 @endif
 @if(Auth::user()->permission_2)
     <li><a href=""><i class="fa fa-tasks"></i> menu-item_2</a></li>
 @endif

您可以按照自述文件中的 'Menu configuration at runtime' 项进行操作。

  1. 在 config/adminlte 中设置 'menu' => []。php 编辑
  2. 列表项 app\Providers\AppServiceProvider.php 引导方法
    <?php

    namespace App\Providers;

    use Illuminate\Support\ServiceProvider;
    use Illuminate\Contracts\Events\Dispatcher;
    use JeroenNoten\LaravelAdminLte\Events\BuildingMenu;
    use \App\User;

    class AppServiceProvider extends ServiceProvider
    {
        /**
         * Bootstrap any application services.
         *
         * @return void
         */
        public function boot(Dispatcher $events)
        {
            $events->listen(BuildingMenu::class, function (BuildingMenu $event) {
                $event->menu->add('MAIN NAVIGATION');
                $event->menu->add([
                    'text'        => 'Users',
                    'url'         => 'admin/users',
                    'icon'        => 'users',
                    'label'       => User::count(),
                    'label_color' => 'success',
                ]);
            });
        }

        /**
         * Register any application services.
         *
         * @return void
         */
        public function register()
        {
            //
        }
    }

早上好。

你必须实现盖茨。菜单选项之一是 'can'。 有了它,您就可以创建一个门,这会集中您的权限规则。

一个例子:

/app/config/adminlte.php

[
    'text'        => 'Por Chassi',
    'url'         => 'consultarporchassi',
    'icon'        => 'search',
    'icon_color' => 'success',
    'can'         => 'consulta-chassi'
],

门: /app/Providers/AppServiceProvider.php: Gate 必须部署在 AppServiceProvider.php "boot" 方法中

/**
 * Bootstrap any application services.
 *
 * @return void
 */
public function boot()
{
    $this->register();

\Gate::define('consulta-chassi', function ($user) {
    if ($user->priv_admin == 'Y') {
        return true;
    }
    return false;
});

}

祝你好运,回头见

有关更多信息,请参见 link:https://laravel.com/docs/5.7/authorization

创建您自己的 CustomMenuFilter class

<?php

namespace JeroenNoten\LaravelAdminLte\Menu\Filters;

use JeroenNoten\LaravelAdminLte\Menu\Builder;
use JeroenNoten\LaravelAdminLte\Menu\Filters\FilterInterface;

class CustomMenuFilter implements FilterInterface
{
    public function transform($item, Builder $builder)
    {
      $urls = ['url_1', 'url_2', 'url_3'];
      if (isset($item['url']) && in_array($item['url'], $urls)) {
            return $item; //display menu if $item['url'] exists in $urls
      } else if (isset($item['submenu']) && count($item['submenu']) > 0) {
            return $item;
      }
      return false;
    }
}

在您的 adminlte.php 中注释掉 GateFilter class 以便您可以使用自己的菜单过滤器实现。

 'filters' => [
        JeroenNoten\ LaravelAdminLte\ Menu\ Filters\ HrefFilter::class,
        JeroenNoten\ LaravelAdminLte\ Menu\ Filters\ SearchFilter::class,
        JeroenNoten\ LaravelAdminLte\ Menu\ Filters\ ActiveFilter::class,
        JeroenNoten\ LaravelAdminLte\ Menu\ Filters\ SubmenuFilter::class,
        JeroenNoten\ LaravelAdminLte\ Menu\ Filters\ ClassesFilter::class,
        // JeroenNoten\ LaravelAdminLte\ Menu\ Filters\ GateFilter::class,
        JeroenNoten\ LaravelAdminLte\ Menu\ Filters\ CustomMenuFilter::class,
        JeroenNoten\ LaravelAdminLte\ Menu\ Filters\ LangFilter::class,
    ],

对我来说有效的代码是

我在AppServiceProvider里面的boot函数中添加了这个函数

   \Gate::define('ManageProducts', function ($user) {
            if ($user->role_id == '1') {
                return true;
            }
            return false;
        });

然后在 adminlte.php

中添加此代码
   [
        'text' => 'Products',
        'url'  => 'ManageProducts',
        'icon'    => 'fas fa-list',
        'can'         => 'ManageProducts'
    ],

我的web.php

Route::get('ManageProducts', 'ProductController@index')->middleware('auth');

    

我想在左侧面板中向 role_id 为 1 的人显示此内容