【问题标题】:Adminlte in Laravel sidebar based on permission基于权限在 Laravel 侧边栏中进行管理
【发布时间】:2017-07-18 17:01:52
【问题描述】:

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

可以根据权限加载adminlte.php的菜单吗? 我将权限存储在用户表(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 解决方案

【问题讨论】:

  • 你找到解决办法了吗?

标签: php laravel permissions sidebar adminlte


【解决方案1】:

我已经集成Laravel-AdminLTE

到我的项目。使用此插件的权限可以如下所示:

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

示例如下:

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

【讨论】:

    【解决方案2】:

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

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

     @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
    

    【讨论】:

      【解决方案3】:

      早安。

      您必须实施 Gates。菜单选项之一是“可以”。 使用它您可以创建一个 Gate,这会集中您的权限规则。

      一个例子:

      /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;
      });
      
      }
      

      祝你好运,再见

      更多信息请点击链接:https://laravel.com/docs/5.7/authorization

      【讨论】:

        【解决方案4】:

        我最终只是在 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 作为目前最流行的侧边栏框架之一,并没有提供侧边栏权限的本机功能..

        【讨论】:

          【解决方案5】:

          您可以按照自述文件中的“运行时菜单配置”项进行操作。

          1. Set 'menu' => [] inside config/adminlte.php Edit
          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()
                  {
                      //
                  }
              }
          

          【讨论】:

            【解决方案6】:

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

            希望对你有帮助。

            【讨论】:

            • 谢谢,但我不想使用其他包来解决这个问题......如果可能的话,我想做一些原生的事情
            【解决方案7】:

            创建您自己的 CustomMenuFilter

            <?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 类,以便您可以使用自己的菜单过滤器实现。

             '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,
                ],
            

            【讨论】:

              【解决方案8】:

              对我来说有效的代码是

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

                 \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 的人展示这个

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 2019-08-18
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2016-07-23
                • 2018-04-12
                • 1970-01-01
                相关资源
                最近更新 更多