2016-07-24 4 views
2

Я изучаю Laravel 5. Я закончил документ Quickstart - intermediate. Я хочу применить проверку полномочий для действий Task для пользователя. Я хочу проверить, является ли целевой пользователь текущим зарегистрированным пользователем, чтобы использовать действие редактирования пользователя. Тем не менее, браузер продолжает говорить мне, когда я пытаюсь получить доступ http://myfirst.app/users/2/edit:HttpException в Handler.php line 107: Это действие неавторизованное

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}', '[email protected]'); 
Route::get('/users/{user}/edit', '[email protected]'); 
Route::patch('/users/{user}', '[email protected]'); 

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; 
    } 
} 

UsersControl ler.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's TaskController, в $user не передается в $this->authorized('destroy', $task), с тем чтобы уничтожить функции TaskPolicy на использование $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 в

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

И я получаю

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

Что я должен делать?

ответ

0

Попробуйте это: в 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');

Надежда, что помогает

0

согласно documentation: «Ворота автоматически return false для всех способностей, когда нет аутентифицированного пользователя ». Поэтому перед выполнением любого разрешения проверьте Auth :: user(), если он возвращает пользователя, прошедшего проверку подлинности.

2

В файле запроса установлен

public function authorize() 
{ 
    return true; 
}