■概要
Laravelで特定のページ(/manage)を管理者IDを持っているユーザーのみ表示出来るようにしたいと考えています。
laravelのPolicyを使って管理者IDの利用者以外がmanage.blade.phpにアクセスしようとするとTOPページ('/')にリダイレクトさせる処理を書いたのですが、アクセス制限したいページが増えたので別のメソッドに定義してそのメソッドを呼び出すようにしたところリダイレクトしなくなりました。(制限したいページが通常通り表示されてしまう)
原因、対処法等わかりましたら教えていただけると助かります!
A.最初のコード(ちゃんと動作したコード)
php
1//ProjectController.php 2 3class ProjectController 4{ 5 /* プロジェクト管理画面表示 */ 6 public function getProjectManager(){ 7 8 //①policyを使って特定ユーザー以外を'/'にリダイレクト 9 $id = \Auth::user()->id; 10 $user = User::findOrFail($id); 11 if (Gate::denies('display',$user)) { 12 return redirect("/"); 13 } 14 15 //②projectsテーブルからidとtitleを全て取得 16 $keys = ['id','title']; 17 $projects = $this->project->getProjectInfo($keys); 18 19 //③取得したデータと一緒にviewにリターン 20 return view('manager.manage')->with('projects',$projects); 21 22 } 23}
php
1//UserPolicy.php 2 3class UserPolicy 4{ 5 //userのidが2の場合trueを返す 6 public function display(User $user){ 7 return $user->id == 2; 8 } 9}
B.ProjectControllerのgetProjectManager()メソッド内のアクセス制限部分を別メソッドcheckManager()に分割したコード(UserPolicy.phpは変更なし)
(ちゃんと動作せずに管理画面が表示されてしまう)
php
1//ProjectController.php 2 3class ProjectController 4{ 5 /* プロジェクト管理画面表示 */ 6 public function getProjectManager(){ 7 8 //外出ししたcheckManagerメソッドを実行 9 $this->checkManager(); 10 11 $keys = ['id','title']; 12 $projects = $this->project->getProjectInfo($keys); 13 14 return view('manager.manage')->with('projects',$projects); 15 16 } 17 18 public function checkManager(){ 19 //①policyを使って特定ユーザー以外を'/'にリダイレクト 20 $id = \Auth::user()->id; 21 $user = User::findOrFail($id); 22 if (Gate::denies('display',$user)) { 23 return redirect("/"); 24 } 25 } 26} 27
Aのコードだとちゃんとリダイレクトされるのですが、Bのコードだとリダイレクトされずに制限したいはずのページが表示されてしまいます。
■原因調査過程
Bのコードにてexit()を使って調べたのですが、どうも、
if(Gate::denies('display',$user)){}の中までは処理が進んでいるようで、中身を以下のように記述すると、ページにはaと表示されます。
php
1if(Gate::denies('display',$user)){ 2 echo 'a'; 3 exit(); 4 return redirect("/"); 5}
なのでreturn redirect("/")の部分がちゃんと効いていないと思います。
ただ、同じProjectController.php内でメソッドとして外出ししただけでredirectが効かなくなる理由が全くわかりません。
もしおわかりになる方がいらっしゃいましたらご教示頂けると嬉しいです。
■環境
・cloud9
どうぞ宜しくお願い致します。

回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/10/06 08:31
2016/10/06 11:19