【问题标题】:Managing permissions in a large Laravel project using Exceptions?使用异常管理大型 Laravel 项目中的权限?
【发布时间】:2021-11-07 20:17:48
【问题描述】:

我正在开发一个大型 Laravel 项目,该项目有 5 种用户类型、大约 50 个模型和相同数量的控制器。

每种用户类型都有自己的权限,根据不同的因素从单独的表中计算出来,因此简单的模型策略不起作用。

到目前为止,我所做的是为每个模型创建一个策略并在那里进行计算:

class MyModelPolicy {
    function someActionName(){
        // Check whether user have the permission or not.
        // I only return a simple true/false here, as I might need to 
        // reuse this somewhere else.
        return $resultAsBoolean;
    }
}

现在,在控制器中,我使用了一个辅助函数,它使用 Gate 外观并引发自定义异常:

function checkUserAccess( $someActionName, $args = [ 'some arguments' ] ){
    $gate = Gate::inspect( $someActionName, $args );
    if( $gate->denied() ) {
        // Throw exception here
        throw new PermissionDeniedException( 'message here' );
    }
}

还有控制器本身:

public function store(){
    // Check permissions
    checkUserAccess('permissions to check');
   // All good, continue
}

对于最后一部分,我定义了一个自定义异常,它扩展了基本的 Laravel 扩展类,并有一个 render() 方法来决定要做什么:

class PermissionDeniedException extends Exception {
    public function render(){
        /**
         * Our custom permissionDeniedException has been
         * triggered. Do the right action based on the 
         * current situation. This will always terminate the app.
         */
    }
}

现在我知道使用异常来控制流不是一个好主意,但是由于这个异常会完全终止应用程序,所以我对使用它并不感到太糟糕。但是,这里唯一的问题是我的控制器的每个方法(总共大约 350 个)现在都可以抛出异常。我想通过将所有方法设置为私有来解决这个问题,然后使用__call() 魔术方法并且只从那里抛出一个异常。

对于这种情况有没有更好的解决方案?还是当项目变得过于复杂时这是不可避免的?

【问题讨论】:

    标签: php laravel authorization


    【解决方案1】:

    抛出异常是处理流的一种正常方法,它必须终止并有特定的响应。这与异常 Handler.php 非常吻合。

    您的解决方案很好,但总的来说,您正在尝试做的事情有语法糖。如下图,如果没有权限,会抛出Illuminate\Auth\Access\AuthorizationException

    Gate::authorize('permissions to check', $yourModel);
    

    然而,这里唯一的问题是我的每一个方法 控制器(总共大约 350 个)现在可以抛出异常

    这不是问题,想象一下如果您使用模型绑定,例如。通过 URl 参数进行模型注入。从使用的任何地方,它都可以抛出ModelNotFoundException。这些将由 Exception Handler.php 处理,我认为没有什么可担心的。

    【讨论】:

    • 谢谢。我注意到抛出异常是一项昂贵的操作,但考虑到这个异常会终止他的应用程序这一事实,我想这会很好。顺便说一句,我认为可以修改门抛出的异常并抛出自定义异常,这是真的吗?
    猜你喜欢
    • 2014-01-09
    • 1970-01-01
    • 2011-12-28
    • 1970-01-01
    • 2012-07-06
    • 1970-01-01
    • 2016-05-11
    • 2011-06-16
    • 2018-01-08
    相关资源
    最近更新 更多