根据权限

时间:2017-07-18 17:01:53

标签: php laravel permissions sidebar adminlte

我有多个拥有多项权限的用户(管理员和用户)。 例如:admin可以看到侧边栏a,b,c 但是用户只能看到侧栏d,e,f。

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

8 个答案:

答案 0 :(得分:1)

I end up just hardcoding it in the page.blade.php using two different views for each permission

@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

which is not ideal, but it works well for the time being..

the ideal and tidier solution would be to store each permission (create, update, delete, read) into database with boolean value.

what surprised me the most is that adminlte as one of the most popular sidebar framework out there doesn't have a native function for sidebar permission..

答案 1 :(得分:1)

我认为使用数据库是明智的选择。但是我们可以避免使用原始数据库查询,而使用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

答案 2 :(得分:1)

早上好。

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

一个例子:

/app/config/adminlte.php

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

门: /app/Providers/AppServiceProvider.php:必须在AppServiceProvider.php的“启动”方法内部署Gate

/**
 * 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

答案 3 :(得分:0)

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

希望它有所帮助。

答案 4 :(得分:0)

我已整合Laravel-AdminLTE

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

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

以下是示例:

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

答案 5 :(得分:0)

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

  1. 在config / adminlte.php中设置'menu'=> []编辑
  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 :(得分:0)

创建自己的 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,
    ],

答案 7 :(得分:-1)

对我来说有效的代码是

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