2016-09-10 18 views
1

私は、ポリシーを使用して「これを許可されたユーザーですか?」という機能を構築しようとしているLaravel Authorizationのドキュメントに従っていますが、動作させることはできません。私はThis action is unauthorizedを手に入れています。私は経路ミドルウェアも試しました。Laravel 5.3で動作するポリシーを取得できません。

PagePolicy.php

namespace App\Policies; 

use App\Models\User; 
use App\Models\Page; 

use Illuminate\Auth\Access\HandlesAuthorization; 

class PagePolicy 
{ 
    use HandlesAuthorization; 

    /** 
    * Determine whether the user can view the page. 
    * 
    * @param App\Models\User $user 
    * @param App\Models\Page $page 
    * @return mixed 
    */ 
    public function view(User $user, Page $page) 
    { 
     return $user->id === $page->user_id; 
    } 

    /** 
    * Determine whether the user can create pages. 
    * 
    * @param App\Models\User $user 
    * @return mixed 
    */ 
    public function create(User $user) 
    { 

    } 

    /** 
    * Determine whether the user can update the page. 
    * 
    * @param App\Models\User $user 
    * @param App\Models\Page $page 
    * @return mixed 
    */ 
    public function update(User $user, Page $page) 
    { 
     // 
    } 

    /** 
    * Determine whether the user can delete the page. 
    * 
    * @param App\Models\User $user 
    * @param App\Models\Page $page 
    * @return mixed 
    */ 
    public function delete(User $user, Page $page) 
    { 
     // 
    } 
} 

PageController.php

namespace App\Http\Controllers; 

use Auth; 
use Carbon\Carbon; 

use App\Models\Page; 

use App\Http\Requests\PageRequest; 

class PageController extends ApiController 
{ 
    public function createNewPage(PageRequest $request) 
    { 
     $this->authorize('create', Page::class); 

     $request->merge([ 
      'user_id' => Auth::id(), 
      'published_at' => Carbon::now(), 
     ]); 

     if (Page::create($request->all())) { 
      return response()->json('success', 201); 
     } 

     return response()->json('error', 500); 
    } 

} 

AuthServiceProvidor.php

namespace App\Providers; 

use App\Models\Page; 
use App\Policies\PagePolicy; 

use Illuminate\Support\Facades\Gate; 
use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider; 

class AuthServiceProvider extends ServiceProvider 
{ 
    /** 
    * The policy mappings for the application. 
    * 
    * @var array 
    */ 
    protected $policies = [ 
     Page::class => PagePolicy::class, 
    ]; 

    /** 
    * Register any authentication/authorization services. 
    * 
    * @return void 
    */ 
    public function boot() 
    { 
     $this->registerPolicies(); 

     // 
    } 
} 
+0

これらのIDは一致していますか? –

+0

はい。私はauth-> id = 1とpage-> user_id = 1としてログインしています –

+0

ポリシーメソッドのdd()はどうでしょうか?実際に呼び出されたかどうかを確認することができます(そして、オブジェクトはあなたが期待するものです) –

答えて

1

それはあなたが提供してきたので、認可しようとしているどのアクション私には全く明らかではありませんコントローラで作成するための呼び出しがプロのみページを閲覧するためのポリシーチェックが行われました。あなたが同じタイプのものであることを確認するために型比較をしようとしている値を、var_dump/ddに確実に渡します。何かが明示的にキャストされていると、整数を文字列として返す特定のデータベースドライバで問題が発生する可能性があります。

+0

こんにちは。上記のFabianの回答の下にコメントを追加しました。それが物事をわずかにクリアするかどうかは分かりません。 –

+0

Fabianのコメントを追加して状況を明らかにするために、Laravelは "$ this-> authorize"に渡された最初の引数と同じ名前の関数を探します。この変更を加えても問題がさらに解決されない場合は、問題をさらに診断するために、最新のバージョンまたは最高のバージョンを表示するように、元々掲載されたコードを自由に更新してください。 – alaric

0

あなたのポリシーではなく、あなたのPageRequestクラスに問題がないと思います。 App\Http\Requests\PageRequestクラスのauthorize()メソッドがtrueを返すことを確認します。

class PageRequest extends FormRequest 
{ 
    /** 
    * Determine if the user is authorized to make this request. 
    * 
    * @return bool 
    */ 
    public function authorize() 
    { 
     return true; // you can also check the authorization using PagePolicy here 
    } 
} 
0

私はそれを把握することができました。私はRoute Model Bindingを使用していませんでした。そこで、authorize()をページ呼び出しの後に追加し、Page::classの代わりに$page変数を使用しました。

public function update(PageUpdateRequest $request, $pageSlug) 
{ 
    $page = Page::where(['user_id' => Auth::id(), 'slug' => $pageSlug])->first(); 
    $this->authorize('update', $page); 
    $page->update($request->all()); 
    return fractal()->item($page, new PageTransformer())->toArray(); 
} 
+0

これについて詳しく説明できますか?私はあなたが何をしたのか分かりません。 – Dubby

+0

@Dubbyあなたはこれを理解したことがありますか?私は同じ問題を抱えています。 – ganicus

-1

現在のコード:

protected $policies = [ 
    Task::class => TaskPolicy::class, 
]; 

ソリューションコード:

protected $policies = [ 
    'App\Task' => 'App\Policies\TaskPolicy', 
]; 

Laravelのウェブサイト上でIntermediate Task List Tutorialを追従しながら、私は、同じ問題を経験しました。

解決策は実際にGithub code for this tutorialにあります。

+0

これは基本的に同じことですが、これがうまくいかなかった場合は、インポートを混乱させる必要があります。 – falnyr

関連する問題