2016-10-29 18 views
4

Итак, я читал об использовании политик laravel для предоставления полномочий по ресурсам моего приложения, но, похоже, проблема там, хотя я последовали за учебником.Использование проверки this-> authorize() в контроллере laravel внутри метода store()

У меня есть пользовательская модель, которая не может быть создана по HTTP-запросам, кроме других пользователей, у которых есть Entrust роль «Admin» или «Broker». То, что я понял и сумел заставить его работать на другие действия, как пользователи индексации было следующее:

  1. Внутри AuthServiceProvider.php внутри частного $policies массива, я зарегистрировал этот класс пользователей с UserPolicy класса, как тот

    класс AuthServiceProvider расширяет ServiceProvider {

      protected $policies = [ 
    
          'App\Model' => 'App\Policies\ModelPolicy', 
           User::class => UserPolicy::class, 
           Insured::class => InsuredPolicy::class 
         ]; 
    
         public function boot(GateContract $gate) 
         { 
          $this->registerPolicies($gate); 
         } 
    

    }

  2. Определение класса контроллера UserPolicy

    класса UserPolicy {

    use HandlesAuthorization; 
    
    protected $user; 
    
    public function __construct(User $user) { 
        $this->user = $user; 
    } 
    
    public function index(User $user) { 
        $is_authorized = $user->hasRole('Admin'); 
        return $is_authorized; 
    } 
    
    public function show(User $user, User $user_res) { 
    
        $is_authorized = ($user->id == $user_res->id); 
        return $is_authorized;  
    } 
    
    public function store() { 
        $is_authorized = $user->hasRole('Admin'); 
        return $is_authorized; 
    } 
    

    }

  3. Тогда внутри UserController класса, перед выполнением критического действия я использую this->authorize() проверку, чтобы остановить или продолжить в зависимости от привилегий пользователя

    класс UserController расширяет Контроллер {

    public function index() 
    { 
        //temporary authentication here 
        $users = User::all(); 
        $this->authorize('index', User::class); 
        return $users; 
    } 
    
    public function show($id) 
    { 
        $user = User::find($id); 
        $this->authorize('show', $user); 
        return $user; 
    } 
    
    public function store(Request $request) { 
    
    
        $user = new User; 
        $user->name = $request->get('name'); 
        $user->email = $request->get('email'); 
        $user->password = \Hash::make($request->get('password')); 
    
        $this->authorize('store', User::class); 
    
        $user->save(); 
    
        return $user; 
    
    } 
    

    }

Проблема в том, что$this->authorize() всегда останавливает процесс на магазине действия возвращающегося исключение: Это действие является несанкционированным.

Я попробовал несколько вариантов для аргументов AUTHORIZE() и не могу заставить его работать как действие индекса

ответ

1

В store() функция UserPolicy::class вы не проходя модель пользователя объекта:

public function store(User $user) { 
    $is_authorized = $user->hasRole('Admin'); 
    return true; 
} 

отсутствующий аргумент User $user.

Возможно, это и является причиной проблемы.

+0

Это решило! Я помню, я пытался передать аргументы до этого метода, и тогда это не сработало. Большое спасибо –

+0

Рад помочь, и добро пожаловать в переполнение стека. Если этот ответ решит вашу проблему, отметьте его как принятый. –

 Смежные вопросы

  • Нет связанных вопросов^_^