laravel-cms授权策略(3)

注:上一节课忘记跟大家说了,改了模板,要记得重新生成一下缓存,执行如下指令:

php artisan view:clear

上一节课的bug

上一节课特意留下了一个bug,哈哈,虽然操作的按钮入口我们屏蔽了,但是,但是,但是,我们确还是可以通过某些方法来执行ajax发送请求到后台,所以,在这里我们也需要在后台添加一下权限验证的判断,写法和前端的逻辑差不多。

更改继承的通用的Controller.php

添加验证方法,如下

<?php

namespace App\Http\Controllers;

use Illuminate\Foundation\Auth\Access\AuthorizesRequests;
use Illuminate\Foundation\Bus\DispatchesJobs;
use Illuminate\Foundation\Validation\ValidatesRequests;
use Illuminate\Routing\Controller as BaseController;
use App\Models\Menu;

class Controller extends BaseController
{
    use AuthorizesRequests, DispatchesJobs, ValidatesRequests;
    // 添加自定义的验证方法
    public function checkRight($cat,$act)
    {
        $admin = auth('admin')->user();
        $menu = new Menu($cat,$act);
        $state = $admin->can('update',$menu);
        return $state;
    }
}

更改AdminController.php如下:

<?php

namespace App\Http\Controllers\admin;

use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use App\Http\Requests\AdminCreateRequest;
use Illuminate\Support\Facades\Hash;
use App\Models\Admin;
use App\Models\Role;
use App\Models\AdminRole;
use Illuminate\Support\Facades\DB;

class AdminController extends Controller
{
    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function index()
    {
        //
        $admins = Admin::paginate(2,['id','username']);
        // 获取所有的角色
        $roles = Role::all();
        return view('admin.admin',['admins'=>$admins,'roles'=>$roles]);
    }

    /**
     * Show the form for creating a new resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function create()
    {
        //
    }

    /**
     * Store a newly created resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\Response
     */
    public function store(AdminCreateRequest $request)
    {
        $policyState = $this->checkRight('1_11',1);
        if(!$policyState){
            return response()->json(['code'=>'1000','msg'=>'您没有操作权限']);
        }
        DB::beginTransaction();
        try{
            //
            $username = $request->input('username');
            $password = Hash::make($request->input('password'));
            $role_id = $request->input('role');
            $admin = new Admin();
            $admin->username = $username;
            $admin->password = $password;
            $state = $admin->save();
            
            $admin_id = $admin->id;

            $adminRole = new AdminRole();
            $adminRole->admin_id = $admin_id;
            $adminRole->role_id = $role_id;

            $adminRoleState = $adminRole->save();
            
            if($state && $adminRoleState)
            {
                DB::commit();
                return response()->json(['code'=>'200','msg'=>'添加成功']);
            }
        }catch(\Exception $e){
            DB::rollback();
        }
        return response()->json(['code'=>'1000','msg'=>'添加失败']);
    }

    /**
     * Display the specified resource.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function show($id)
    {
        //
    }

    /**
     * Show the form for editing the specified resource.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function edit($id)
    {
        //
    }

    /**
     * Update the specified resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function update(AdminCreateRequest $request, $id)
    {
        $policyState = $this->checkRight('1_11',2);
        if(!$policyState){
            return response()->json(['code'=>'1000','msg'=>'您没有操作权限']);
        }
        $username = $request->input('username');
        $password = Hash::make($request->input('password'));
        $role_id = $request->input('role');
        DB::beginTransaction();
        try{
            $state = Admin::where('id',$id)->update(['username'=>$username,'password'=>$password]);
            $adminRoleState = AdminRole::where('admin_id',$id)->update(['role_id'=>$role_id]);
            if($state && $adminRoleState)
            {
                DB::commit();
                return response()->json(['code'=>'200','msg'=>'更改成功']);
            }else{
                DB::rollback();
            }
            
        }catch(\Exception $e){
            DB::rollback();
        }
        return response()->json(['code'=>'1000','msg'=>'更改失败']);
    }

    /**
     * Remove the specified resource from storage.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function destroy($id)
    {
        $policyState = $this->checkRight('1_11',4);
        if(!$policyState){
            return response()->json(['code'=>'1000','msg'=>'您没有操作权限']);
        }
        $state = Admin::destroy($id);
        //
        if($state)
        {
            return response()->json(['code'=>'200','msg'=>'删除成功']);
        }else{
            return response()->json(['code'=>'1000','msg'=>'删除失败']);
        }
    }
    // 获取某个人员具体信息
    public function detail($id){
        $admin=Admin::where('id',$id)->with('role:admin_id,role_id')->first(['id','username']);
        if($admin)
        {
            return response()->json(['code'=>'200','info'=>$admin]);
        }else{
            return response()->json(['code'=>'1000','msg'=>'获取信息失败']);
        }
    }
}

更改RoleController.php如下:

<?php

namespace App\Http\Controllers\admin;

use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use App\Models\Role;
use App\Models\Right;
use App\Models\AdminRole;
use App\Http\Requests\RoleAddRequest;
use Illuminate\Support\Facades\DB;
class RoleController extends Controller
{
    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function index()
    {
        //
        $roles = Role::paginate(2,['id','role_name']);
        return view('admin.role',['roles'=>$roles]);
    }

    /**
     * Show the form for creating a new resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function create()
    {
        //
    }

    /**
     * Store a newly created resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\Response
     */
    public function store(RoleAddRequest $request)
    {
        $policyState = $this->checkRight('1_12',1);
        if(!$policyState){
            return response()->json(['code'=>'1000','msg'=>'您没有操作权限']);
        }
        // 开启事务
        DB::beginTransaction();
        try{
            $role = new Role();
            $right = new Right();
            $role->role_name = $request->input('rolename');
            $roleState = $role->save();
            $right->role_id = $role->id;
            $right->content = $request->input('content');
            $rightState = $right->save();
            if($roleState && $rightState)
            {
                DB::commit();
                return response()->json(['code'=>'200','msg'=>'添加成功']);
            }else{
                DB::rollback();
            }
            
        }catch(\Exception $e){
            DB::rollback();
        }
        return response()->json(['code'=>'1000','msg'=>'添加失败']);
    }

    /**
     * Display the specified resource.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function show($id)
    {
        //
    }

    /**
     * Show the form for editing the specified resource.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function edit($id)
    {
        //
    }

    /**
     * Update the specified resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function update(RoleAddRequest $request, $id)
    {
        $policyState = $this->checkRight('1_12',2);
        if(!$policyState){
            return response()->json(['code'=>'1000','msg'=>'您没有操作权限']);
        }
        //
        // 开启事务
        DB::beginTransaction();
        try{
            $role = Role::find($id);
            $role->role_name = $request->input('rolename');
            $roleState = $role->save();

            $right = Right::where('role_id',$id)->first();
            $right->content = $request->input('content');
            $rightState = $right->save();
            if($roleState && $rightState)
            {
                DB::commit();
                return response()->json(['code'=>'200','msg'=>'添加成功']);
            }else{
                DB::rollback();
            }
            
        }catch(\Exception $e){
            DB::rollback();
        }
        return response()->json(['code'=>'1000','msg'=>'添加失败']);
    }

    /**
     * Remove the specified resource from storage.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function destroy($id)
    {
        $policyState = $this->checkRight('1_12',4);
        if(!$policyState){
            return response()->json(['code'=>'1000','msg'=>'您没有操作权限']);
        }
        // 判断AdminRole中是否有使用此数句
        $isUsedRole = AdminRole::where('role_id',$id)->first();
        if($isUsedRole)
        {
            return response()->json(['code'=>'1000','msg'=>'此角色正在被使用']);
        }
        // 这里有外键关联,所以,需要先删除对应的right表里对应此外键的数据,在删除role表下的此数据
        DB::beginTransaction();
        try{
            $right = Right::where('role_id',$id)->first();
            $rightState = $right->delete();
            $roleState = Role::destroy($id);
            if($roleState && $rightState){
                DB::commit();
                return response()->json(['code'=>'200','msg'=>'删除成功']);
            }
        }catch(\Exception $e){
            DB::rollback();
        }
        return response()->json(['code'=>'1000','msg'=>'删除失败']);
    }
    // 获取某个角色具体信息
    public function detail($id){
        $role = Role::where('id',$id)->with('right:content,role_id,id')->first(['id','role_name']);
        if($role)
        {
            return response()->json(['code'=>'200','info'=>$role]);
        }else{
            return response()->json(['code'=>'1000','msg'=>'获取信息失败']);
        }
    }
}

注:

我们通过在通用的父类控制器里添加了权限判断方法checkRight,并在相应的控制器中添加判断逻辑。

拓展:你们还是否记得在表单验证AdminCreateRequest里有一个authorize方法,这里其实就是用来写这个checkRight的判断逻辑的,所以,你也可以在相应的表单验证的这个方法里写上判断逻辑,同样生效!

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

相关文章

推荐文章