分享一种另类的控制器权限验证方法
后台基本上都得用到权限控制,现在已经有很多成熟的权限认证,例如框架自带的中间件,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自行定义。
新建的控制器只需要继承基础的控制器即可。
虽说扩展性不大(还得看内部权限判断逻辑),某些特定情况下或者做一些特定的权限判断还是有点用的。
直接写到一个中间件里面就可以了
@Ryan 说的好像很有道理
我就是通过给每个路由设置别名, 然后分配权限 控制权限.
@Ryan 开头已经说过可以用中间件等方式去做,这个只是另外一种方法
构造方法和中间件都是不错的办法?