【问题标题】:HttpException in Handler.php line 107: This action is unauthorizedHandler.php 第 107 行中的 HttpException:此操作未经授权
【发布时间】:2016-11-27 18:06:39
【问题描述】:

我正在学习 Laravel 5。我已经完成了文档的Quickstart - intermediate。我想将任务操作的授权检查应用于用户的操作。我想检查目标用户是否是当前登录用户,以便使用用户的编辑操作。但是,当我尝试访问 http://myfirst.app/users/2/edit 时,浏览器一直告诉我:

FatalThrowableError in UsersPolicy.php line 20:
Type error: Argument 1 passed to App\Policies\UsersPolicy::edit() must be an instance of Illuminate\Http\Request, instance of App\User given

Routes.php

Route::get('/users/{user}', 'UsersController@view');
Route::get('/users/{user}/edit', 'UsersController@edit');
Route::patch('/users/{user}', 'UsersController@update');

AuthServiceProvider.php

protected $policies = [
    'App\Model' => 'App\Policies\ModelPolicy',
    'App\Task' => 'App\Policies\TaskPolicy',
    'App\User' => 'App\Policies\UsersPolicy',
];

UsersPolicy.php

namespace App\Policies;

use App\User;
use Illuminate\Http\Request;
use Illuminate\Auth\Access\HandlesAuthorization;

class UsersPolicy
{
    use HandlesAuthorization;

    public function edit(Request  $request, User $user)
    {
        return $request->user()->id === $user->id;
    }

    public function update(Request  $request, User $user)
    {
        return $request->user()->id === $user->id;
    }
}

UsersController.php

namespace App\Http\Controllers;

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

class UsersController extends Controller
{

    protected $user;

    public function __construct() {
        $this->middleware('auth');
    }

    public function view(Request $request, User $user)
    {    
        if($request->user()->id == $user->id){
            return view('users.view', ['user' => $user]);
        }
        return redirect('/tasks');
    }

    public function edit(Request $request, User $user)
    {
        $this->authorize('edit', $user);
        return view('users.edit', compact('user'));
    }

    public function update(Request $request, User $user)
    {
        $this->authorize('update', $user);        
        $user->update($request->all());    
        return redirect('/users/'.$user->id);
    }
}

Document'sTaskController 的delete 函数中,$user 没有传递到$this->authorized('destroy', $task) 以允许TaskPolicy 的destroy 函数使用$user

TaskController.php

public function destroy(Task $task)
{
    $this->authorize('destroy', $task);
    $task->delete();
    return redirect('/tasks');

}

TaskPolicy.php

public function destroy(User $user, Task $task)
{
    return $user->id === $task->user_id;
}

反正我跟着异常,在UsersController的edit函数的参数中加了$request

$this->authorize('edit', $request, $user);

我得到了

HttpException in Handler.php line 107:
This action is unauthorized.

我该怎么办?

【问题讨论】:

    标签: laravel-5 policy authorize


    【解决方案1】:

    在您的请求文件集中

      public function authorize()
    {
        return true;
    }
    

    【讨论】:

      【解决方案2】:

      根据documentation:“当没有经过身份验证的用户时,门将自动为所有能力返回 false”。因此,在进行任何授权之前,请检查 Auth::user() 是否返回当前经过身份验证的用户。

      【讨论】:

        【解决方案3】:

        试试这个:在 UsersPolicy.php 添加:

        enter code here/**
         * @var User
         */
        protected $user;
        
        /**
         * Create a new policy instance.
         *
         * @param User $user
         */
        public function __construct(User $user)
        {
            $this->user = $user;
        }
        

        然后在您的 UsersController.php 中将 $this->authorize('edit', $user); 更改为 $this->authorize('edit');

        希望有帮助

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-04-20
          • 2019-05-04
          • 2020-04-23
          • 1970-01-01
          • 1970-01-01
          • 2022-07-01
          相关资源
          最近更新 更多