Laravel5で社内専用サイト(6-3)

前回は、ロールとパーミッションのデータをいくつか入力してみました。今回は、このロールとパーミッションを関連づけしたいと思います。

ロールとパーミッションの関連づけ

ロールの詳細ページから、パーミッションの許可(allow)の設定を行いたいと思います。getViewを下記のように作成します。

app/Http/ControllersAuth/AclController.php

//ロールの詳細
 public function getView($role_id)
 {
 $role=Role::find($role_id);
 //ユーザーが取得しているパーミッションのリスト
 $lists=$role->permissions->lists('id');
 //全パーミッションから取得済みパーミッションを除外して取得
 $permissions=Permission::whereNotIn('id',$lists)->get();
 return view('acl.view',compact('role','permissions'));
 }

  • まず、ユーザーが取得しているパーミッションのリストを作成します。
  • そして、全パーミッションから取得済みパーミッションを除外したデータを取得します。

詳細ページのビューを下記のように作成します。

app/resources/views/acl/view.blade.php

@extends('tbs.base')
@section('navbar')
 @include('acl.navbar')
@stop
@section('content')
<h2>{{ $role->display_name }}の明細</h2>
{!! session('warning') !!}
<table class="table table-bordered table-striped">
 <thead>
 <tr>
 <th>ロール名</th>
 <th>表示名</th>
 <th>説明</th>
 </tr>
 </thead>
 <tbody>
 <tr>
 <td>{{ $role->name }}</td>
 <td>{{ $role->display_name }}</td>
 <td>{{ $role->description }}</td>
 </tr>
 </tbody>
</table>
<hr>
@if($role->permissions->count())
<form method="POST" action="{{ url('acl/deny') }}">
{!! csrf_field() !!}
 <h3>アクセス許可パーミッション</h3>
 <table class="table table-bordered table-striped">
 <thead>
 <tr>
 <th>パーミッション</th>
 <th>表示名</th>
 <th>説明</th>
 </tr>
 </thead>
 <tbody>
 @foreach($role->permissions as $p)
 <tr>
 <td><label><input type="checkbox" name="deny[]" value="{{$p->id}}">
 &nbsp;{{ $p->name }}</label>
 </td>
 <td>{{ $p->display_name }}</td>
 <td>{{ $p->description }}</td>
 </tr>
 @endforeach
 </tbody>
 </table>
 <input type="hidden" name="role_id" value="{{ $role->id }}">
 <input type="submit" class="btn btn-danger" value="権限の削除">
</form>
 @endif
 
 @if($permissions->count())
<form method="POST" action="{{ url('acl/allow') }}">
 {!! csrf_field() !!}
 <h3>未登録パーミッション</h3>
 <table class="table table-bordered table-striped">
 <thead>
 <tr>
 <th>パーミッション</th>
 <th>表示名</th>
 <th>説明</th>
 </tr>
 </thead>
 <tbody>

 @foreach($permissions as $p)
 <tr>
 <td><label><input type="checkbox" name="allow[]" value="{{$p->id}}">
 {{ $p->name }}</label>
 </td>
 <td>{{ $p->display_name }}</td>
 <td>{{ $p->description }}</td>
 </tr>
 @endforeach
 </tbody>
 </table>
 <input type="hidden" name="role_id" value="{{ $role->id }}">
 <input type="submit" class="btn btn-primary" value="権限の付与"> 
</form>
@endif
@stop

そして、受け取った値を処理するためのalowメソッドとdenyメソッドを作成します。

app/Http/Controllers/Auth/AclController.php

  //パーミッションの付与
 public function postAllow(Request $request)
 {
 $role=Role::find($request->role_id);
 $permissions=$request->allow;
 if($permissions):
 foreach($permissions as $p):
 $role->permissions()->attach($p);
 endforeach;
 else:
 return back()->withWarning('<div class="alert alert-danger">権限が選択されていません</div>');
 endif;
 return redirect('acl/view/'.$role->id);
 }
 //パーミッションの削除
 public function postDeny(Request $request)
 {
 $role=Role::find($request->role_id);
 $permissions=$request->deny;
 if($permissions):
 foreach($permissions as $p):
 $role->permissions()->detach($p);
 endforeach;
 else:
 return back()->withWarning('<div class="alert alert-danger">権限が選択されていません</div>');
 endif;
 return redirect('acl/view/'.$role->id);
 }

これで、下記のような基本的なデータベースは作成できました。

2015-08-18 9-14-45

未登録パーミッションの一覧から、許可したいアクションを選択し、権限の付与ボタンをクリックすると、アクセス許可パーミッションになります。又、アクセス許可パーミッションの中から、許可を取り消したいアクションを選択して、権限の削除ボタンをクリックすると、未登録パーミッションになり、そのアクションには、アクセスできなくなります。

次回は、ACLの本題に入りたいと思います。

このエントリーを含むはてなブックマーク Buzzurlにブックマーク livedoorクリップ Yahoo!ブックマークに登録

トラックバック&コメント

この投稿のトラックバックURL:

コメントをどうぞ

このページの先頭へ