В чем разница между политикой авторизации и функциональностью в Laravel? - PullRequest
0 голосов
/ 21 февраля 2019

Я использую базовую систему политик laravel для защиты неавторизованного пользователя от поста обновления.Например, у пользователя есть Id 1 и In posts. Таблица User_id также равна 1.

Теперь $this->authorize('update',$post); способом я могу передать только одну переменную $post для аутентификации.в то время как в методе can я также могу использовать $user переменную $user->can('update',$post) для авторизации.

Вот код:

В PostPolicy.php:

public function update(User $user, Post $post)
{
    return $user->id === $post->user_id;
}

В AuthServiceProvider.php:

protected $policies = [
    Post::class => PostPolicy::class
]

В контроллере Авторизовать путь:

public function update(Request $request, $id)
{
    $post=Post::find(1);
    $user=User::find(1); 
    $this->authorize('update',$post);
    return 'Hello Everything Access For You ';
}

Использование метода can в контроллере:

public function update(Request $request, $id)
{
    $post=Post::find(1);
    $user=User::find(1); 
    if($user->can('update',$post)){
        return 'Your are allowed';
    }
    else
    {
        return 'Your are Not allowed'; 
    }
}

Прав ли я для этих двух функций.Есть ли разница?Какой метод я должен использовать.Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 21 февраля 2019

$this->authorize() проверяет, авторизован ли текущий пользователь .$user->can() проверяет, авторизован ли пользователь в $user.Оба принимают одну и ту же базовую политику для принятия решения.

Основное различие между ними заключается в том, что $this->authorize() выдает исключение, если текущий пользователь не авторизован (так как он предназначен для использования в контроллере)тогда как $user->can() просто возвращает true / false.

Если вы хотите, чтобы контроллер действовал так, как будто он выполняет $this->authorize() для другого пользователя , отличного от текущего,Вы можете сделать это:

// where "123" is the user you want to check against
$user = App\User::find(123);

if(!$user->can('update', $post) {
    throw new \Illuminate\Auth\Access\AuthorizationException;
}

Тем не менее, это редко то, что вы хотите сделать - не имеет (обычно) большого смысла определять, может ли текущий пользователь сделатьчто-то на основе разрешений другого пользователя.

0 голосов
/ 21 февраля 2019

Если вы используете любой из authorize() или can(), цель состоит в том, чтобы проверить, авторизован ли пользователь для выполнения определенных задач.

Но:

  • В случае authorize(), если произойдет сбой (возвращает false из метода политики), метод authorize вызовет исключение Illuminate \ Auth \ Access \ AuthorizationException, которое обработчик исключений Laravel по умолчанию преобразует в ответ HTTP с 403 * 1010.*

  • В случае can() это просто базовый метод, чтобы проверить, авторизован пользователь или нет, а остальное вам придется обрабатывать самостоятельно.Например, что делать, если он не авторизован.

Учитывая вышеперечисленные факторы, я бы сказал, что $this->authorize('update',$post); проще использовать в контроллере.

Проверьте больше о том же в документация

Также вы можете сделать:

$request->user()->can(), если вы хотите проверить авторизацию текущего запрашивающего пользователя.

Обновление:

authorize() предназначен для авторизации текущего пользователя, вошедшего в систему, где laravel автоматически передает текущего пользователя в политику.

В то время как вы можете использовать can для любого пользовательского экземпляра.

  • $request->user()->can(), если вы хотите проверить авторизацию текущего запрашивающего пользователя.
  • $user = $user::find($id); $user->can(...) если это любой другой пользователь
...