2016-07-24 4 views
2

J'apprends Laravel 5. J'ai terminé le document Quickstart - intermediate. Je veux appliquer le contrôle d'autorisation pour les actions de la tâche à l'utilisateur. Je veux vérifier si l'utilisateur cible est l'utilisateur actuellement connecté afin d'utiliser l'action d'édition de l'utilisateur. Cependant, le navigateur continue de me dire quand j'essaie d'accéder http://myfirst.app/users/2/edit:HttpException dans Handler.php ligne 107: Cette action est non autorisée

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

En fonction de suppression du Document's TaskController, $user n'est pas passé dans $this->authorized('destroy', $task) afin de permettre de détruire la fonction de TaskPolicy utiliser $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; 
} 

Quoi qu'il en soit, je suivais l'exception et a ajouté la demande de $ au paramètre de la fonction d'édition de UsersController

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

Et je reçois

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

Que dois-je faire?

Répondre

0

Essayez ceci: à UsersPolicy.php ajouter:

enter code here/** 
* @var User 
*/ 
protected $user; 

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

Et dans votre changement UsersController.php $this->authorize('edit', $user); à $this->authorize('edit');

espoir qui aide

0

selon documentation: « La porte sera automatiquement renvoie false pour toutes les capacités lorsqu'il n'y a pas d'utilisateur authentifié ". Donc avant de faire une autorisation, veuillez vérifier Auth :: user() si elle renvoie un utilisateur actuellement authentifié.

2

Dans votre fichier de demande d'établissement

public function authorize() 
{ 
    return true; 
}