laravel-cms授权策略(2)

创建菜单Menu的model类

php artisan make:model Menu 

这个只是一个辅助类,不用创建真实的数据库

更改Models\Model.php如下:

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Menu extends Model
{
    use HasFactory;
    public $cat;
    public $act;
    public function __construct($cat,$act){
        $this->cat = $cat;
        $this->act = $act;
    }
}

自定义模板指令

我们自定义一个模板指令,用来在前端控制用户是否有某个按钮的操作权限,更改AppServiceProvider.php如下:

<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;
use Illuminate\Support\Facades\Schema;
use Illuminate\Support\Facades\Blade;
use App\Models\Menu;

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

    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
        //
        Schema::defaultStringLength(200);
        Blade::if('myact',function($expression){
            list($act,$cat) = explode(',',$expression);
            $admin = auth('admin')->user();
            $menu = new Menu($act,$cat);
            $state = $admin->can('update',$menu);
            return $state;
        });

    }
}

更改MenuPolicy的权限判断逻辑

我们在MenuPolicy里添加逻辑判断的逻辑如下:

<?php

namespace App\Policies;

use App\Models\Menu;
use App\Models\Admin;
use Illuminate\Auth\Access\HandlesAuthorization;

class MenuPolicy
{
    use HandlesAuthorization;

    /**
     * Determine whether the user can view any models.
     *
     * @param  \App\Models\User  $user
     * @return \Illuminate\Auth\Access\Response|bool
     */
    public function viewAny(Admin $admin)
    {
        //
    }

    /**
     * Determine whether the user can view the model.
     *
     * @param  \App\Models\User  $user
     * @param  \App\Models\Menu  $menu
     * @return \Illuminate\Auth\Access\Response|bool
     */
    public function view(Admin $admin, Menu $menu)
    {
        //
    }

    /**
     * Determine whether the user can create models.
     *
     * @param  \App\Models\User  $user
     * @return \Illuminate\Auth\Access\Response|bool
     */
    public function create(Admin $admin,Menu $menu)
    {
        //
        return $this->checkPolicy($admin->rightsRole->right,$menu);
    }

    /**
     * Determine whether the user can update the model.
     *
     * @param  \App\Models\User  $user
     * @param  \App\Models\Menu  $menu
     * @return \Illuminate\Auth\Access\Response|bool
     */
    public function update(Admin $admin, Menu $menu)
    {
        //
        return $this->checkPolicy($admin->rightsRole->right,$menu);
    }

    /**
     * Determine whether the user can delete the model.
     *
     * @param  \App\Models\User  $user
     * @param  \App\Models\Menu  $menu
     * @return \Illuminate\Auth\Access\Response|bool
     */
    public function delete(Admin $admin, Menu $menu)
    {
        //
        return $this->checkPolicy($admin->rightsRole->right,$menu);
    }

    /**
     * Determine whether the user can restore the model.
     *
     * @param  \App\Models\User  $user
     * @param  \App\Models\Menu  $menu
     * @return \Illuminate\Auth\Access\Response|bool
     */
    public function restore(Admin $admin, Menu $menu)
    {
        //
    }

    /**
     * Determine whether the user can permanently delete the model.
     *
     * @param  \App\Models\User  $user
     * @param  \App\Models\Menu  $menu
     * @return \Illuminate\Auth\Access\Response|bool
     */
    public function forceDelete(Admin $admin, Menu $menu)
    {
        //
    }

    public function checkPolicy($admin, $menu){

        $contents = explode(',',$admin->content);
        foreach($contents as $k=>$v)
        {
            if(strlen($v))
            {
                $varr = explode('|',$v);
                if($varr[0]==$menu->cat && ($varr[1]&$menu->act)==$menu->act)
                {
                    return true;
                }
            }
        }
        return false;
    }
}

添加admin.blade.php和role.blade.php的权限判断

我们使用自定义的模板指令,来添加模板中的按钮验证,依据我们的菜单config\menu.php里的配置来进行配置:

admin.blade.php如下:

@extends('admin.common')
@section('content')
@myact('1_11,1')

@endmyact

      
          @foreach ($admins as $k=>$v)
          
          @endforeach
        
ID 名称 操作
{{$v['id']}} {{$v['username']}} @myact('1_11,2') @endmyact @myact('1_11,4') @endmyact
@endsection @section('javascript') @endsection

role.blade.php如下:

@extends('admin.common')
@section('content')
@myact('1_12,1')

@endmyact
      
          @foreach ($roles as $k=>$v)
          
          @endforeach
        
ID 角色名称 操作
{{$v['id']}} {{$v['role_name']}} @myact('1_12,2') @endmyact @myact('1_12,4') @endmyact
@foreach ($menus as $k=>$v) {{$v['menuName']}} @if($v['sub']) @foreach ($v['sub'] as $subk=>$subv) {{$subv['menuName']}} @php $subs = explode(",",$subv['act']) @endphp @foreach ($subs as $sk=>$sv) @php $acts = explode('_',$sv); @endphp @endforeach @endforeach @endif @endforeach @endsection @section('javascript') @endsection

注:

以上我们通过自定义myact的模板指令,在模板中通过使用此指令,把判断的菜单数据传给后台,进行解板判断。

发表评论
留言与评论(共有 0 条评论) “”
   
验证码:

相关文章

推荐文章