2017-11-26 3 views
0

を使用して他のユーザービューのポストを防止することは、私はこのようなルートを持っている:ポリシーLaravel 5.5

Route::get('{username}/posts','[email protected]')->name('post.editor'); 

が、私は彼らに属していないポストを見てから、他のエディタを防ぎたいです。私はPostPolicyを次のように作成しようとしました:

public function view(User $user, Post $post) 
{ 
    return $user->id === $post->user_id || $user->hasRole('admin'); 
} 

私のPostControllerでユーザーを認証するにはどうしたらいいですか?ユーザー名ではなくユーザーIDを使用するので、ポリシーを正しく記述しましたか?ありがとう。

答えて

0

どのように私は私のPostControllerでユーザーを認証することができますか?

承認にはオプションがあります。コントローラーでauthorizeに電話をかけるか、ゲートを呼び出すか、FormRequestでauthorizeメソッドを呼び出します。または、ユーザーモデルでcanを使用します。

public function show(Request $request, Post $post) 
{ 
    // controller authorization helper 
    $this->authorize('view', $post); 
    // user authorization helper 
    if ($request->user()->cant('view', $post)) { 
     // return redirect/throw exception 
    } 
} 

と、それはユーザーIDをユーザー名を使用していないので、私は、正しくポリシーを作成したのですか?このポリシーメソッドは、現在のユーザーが実行される時点で

は、すでに認証され、知られており、ポストを使用して、認証方式に合格しているものです。ポリシーの対象となるポストまたは他のエンティティを、認証呼び出しの前にどのように解決する必要がありますか。

あなたがポリシーのすべての権限チェックに合格できるようにするには「管理者」をしたい場合は、このようにするbeforeメソッドを定義することができます

public function before($user, $ability) 
{ 
    if ($user->hasRole('admin')) { 
     return true; 
    } 
} 

感謝を。

大歓迎です。

0

ここでは、目的を達成するための手順を示します。

1)通常、私は職人が作成してみましょう、あなたは手動で、ポリシーを登録したい場合は、

php artisan make:policy -m=Model 

ただし、次のコマンドを実行して、私のためのポリシーオブジェクトを登録します、あなたはそれらをマッピングする必要があり、あなたのAuthServiceProvider。例えば

protected $policies = [ 
    'App\Post' => 'App\Policies\PostPolicy', 
]; 

2)モデルポリシーにはすでにロジックがあります。

3)コントローラのeditPostアクションの直前に、その人に投稿を表示する権限を与えることができます。

$this->authorize('view', $post); 

4)ブレードで@canと@endcanブロックにアクセスすることもできます。

あなたのユーザー名またはユーザーIDに関する質問があれば、ユーザーオブジェクト全体にアクセスできるので、チェックを実行するためにユーザーから属性を削除することができます。

希望に役立ちます。ここで

はLaravelのコードベースから実際のコード

/** 
* Determine if the given ability should be granted for the current user. 
* 
* @param string $ability 
* @param array|mixed $arguments 
* @return \Illuminate\Auth\Access\Response 
* 
* @throws \Illuminate\Auth\Access\AuthorizationException 
*/ 
public function authorize($ability, $arguments = []) 
{ 
    $result = $this->raw($ability, $arguments); 

    if ($result instanceof Response) { 
     return $result; 
    } 

    return $result ? $this->allow() : $this->deny(); 
} 

ここでは、関連リンク

https://laravel.com/docs/5.5/authorization#creating-policies https://laravel.com/docs/5.5/authorization#authorizing-actions-using-policies

+0

$ this-> authorize( 'view'、$ post);あなたが書いたように、それはユーザー変数を必要としませんか?私はそれをフィルタリングする必要があるので、投稿はこのユーザーに属しています。 – Ying

+0

ユーザーモデルをポリシーモデルにマップすると、ポリシーでユーザーが既に取得されており、ポストにはポストを渡すだけです。 public function view(User $ user、Post $ post) { return $ user-> id === $ post-> user_id || $ user-> hasRole( 'admin'); } – alithedeveloper