根据权限在 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' 项进行操作。
- 在 config/adminlte 中设置 'menu' => []。php 编辑
- 列表项 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 的人显示此内容
我有多个拥有多个权限的用户(管理员和用户)。 示例:管理员能够看到边栏 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' 项进行操作。
- 在 config/adminlte 中设置 'menu' => []。php 编辑
- 列表项 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 的人显示此内容