代码之家  ›  专栏  ›  技术社区  ›  paranoid

phpuint照亮\授权\访问\授权异常:此操作未经授权

  •  1
  • paranoid  · 技术社区  · 5 年前

    我有 index 控制器中的方法如下

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

    指数 方法in ContactPolicy

    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) 测试\功能\帐户测试::a_user_without_permission_can_not_see_contacts 照亮\授权\访问\授权异常:此操作未经授权。

    注1 : 当我将“我的控制器”更改为此时,它会正常工作并显示绿色

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

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

    0 回复  |  直到 5 年前
        1
  •  1
  •   Community CDub    5 年前

    这个 authorize 如果用户未被授权,该方法将抛出异常。你需要使用 @expectesException 或类似的方法,向测试发出异常信号。

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


    编辑:更多说明

    当你打电话的时候 授权 如果方法和用户没有权限,程序将抛出异常。 当用户调用api时,异常会被转换为403状态的响应并显示给用户,但当您从程序本身调用api时会抛出异常并停止程序,因此不会有任何JSON响应。 要处理这种情况,您有两个选择:

    1-如果您决定不更改程序,那么您应该告诉您的测试预期会抛出AuthorizationException,而不是期望收到具有特定状态的响应。你可以阅读如何做到这一点 hear

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