【问题标题】:phpuint Illuminate\Auth\Access\AuthorizationException: This action is unauthorizedppuint Illuminate\Auth\Access\AuthorizationException:此操作未经授权
【发布时间】:2020-04-23 03:13:47
【问题描述】:

我在这样的控制器中有index 方法

 public function index()
{
     $this->authorize('index', Contact::class);
  ....
}

ContactPolicy中的index方法

public function index()
{
    return Auth::user()->can('view_Contact');
}

和这样的测试方法

/** @test */
public function a_user_without_permission_can_not_see_contacts()
{
    $this->login(['no_permission']);
    $this->get('/contacts')
        ->assertStatus(403);
}

当我运行测试时显示此错误

1) 测试\功能\AccountTest::a_user_without_permission_can_not_see_contacts Illuminate\Auth\Access\AuthorizationException:此操作未经授权。

注意1: 当我将我的控制器更改为此它可以正常工作并显示为绿色

public function index()
{
    if(Auth::user()->can('view_Contact')){
      ........
    }else
    return response()->view('403',['msg' => 'you_not_have_not_permission'])->setStatusCode(403) ;

注意2
在测试类的登录方法中,我发送用户权限参数并且它正常工作。

【问题讨论】:

    标签: laravel laravel-5 laravel-5.8 laravel-authorization laravel-unit-test


    【解决方案1】:

    如果用户未获得授权,authorize 方法将引发异常。您需要使用@expectesException 或类似方法来指示您的测试预计会出现异常。

    或者,您可以在 Handler 类中添加一个条件来捕获此类异常并返回 403 响应


    编辑:更多解释

    当您调用authorize 方法并且用户没有权限时,程序会抛出异常。 当用户调用 api 时,异常被转换为 403 状态的响应并显示给用户,但是当您从程序本身内部调用 api 时,抛出异常并且程序停止,因此会有没有任何 JSON 响应。 要处理这种情况,您有两种选择:

    1- 如果你决定不改变你的程序,那么你应该告诉你的测试期待一个 AuthorizationException 抛出,而不是期待一个特定状态的响应。你可以阅读如何做到这一点hear

    2- 你可以改变你的代码,而不是将处理异常的任务委托给 Laravel,你可以在 Handler 类中自己做,并准备一个 403 状态的 JSON 响应,然后你的测试应该可以正确运行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-04-20
      • 2019-05-04
      • 1970-01-01
      • 1970-01-01
      • 2016-11-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多