分享一种另类的控制器权限验证方法

后台基本上都得用到权限控制,现在已经有很多成熟的权限认证,例如框架自带的中间件,Gate,Passport等
下面就分享一种另类的控制器权限方法
新建一个基础的控制器

<?php

namespace App\Http\Controllers;

use Auth;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;

class BaseController extends Controller {

    // 自定义方法调度
    public function callAction($method, $parameters) {
        $request = app(Request::class);
        $route = $request->route();

        // 例子一
        $route_name = $route->getName();
        // 这里根据路由名称去做权限判断
        if ( !checkRole(Auth::user(), $route_name) ) {
            throw new AuthFailException('认证失败');
        }

        // 例子二
        $action_name = $route->getActionName();
        // 这里根据控制器名字去做权限判断
        if ( !checkRole(Auth::user(), $action_name) ) {
            throw new AuthFailException('认证失败');
        }

        // ......
        // 以上只是一些例子,具体逻辑自行实现

        return $this->{$method}(...array_values($parameters));
    }
}

注意,上面的checkRole,和AuthFailException自行定义。

新建的控制器只需要继承基础的控制器即可。

虽说扩展性不大(还得看内部权限判断逻辑),某些特定情况下或者做一些特定的权限判断还是有点用的。

《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
讨论数量: 5
Ryan

直接写到一个中间件里面就可以了

6年前 评论

@Ryan 说的好像很有道理

6年前 评论

我就是通过给每个路由设置别名, 然后分配权限 控制权限.

6年前 评论

@Ryan 开头已经说过可以用中间件等方式去做,这个只是另外一种方法

6年前 评论

构造方法和中间件都是不错的办法?

6年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!