laravel5.1の標準ユーザ認証で、一つのカラム(user_permission)で、ログイン可・不可や権限レベルを設定できるようにしてみた
参考URL: Laravelのログイン処理にemailやpassword以外の条件を加える方法
http://qiita.com/sasakure-kei@github/items/388a2900557a6079164d
参考URLの方法だと、指定した値だった場合ログインOK!
まあ普通は、ID and PASSWORD and 有効フラグが全部一致なら認証!って条件が普通だものな~。
今回は権限も兼ねているので、指定された値以外ならOK!という仕様。
1=管理者
2=編集者
3=閲覧者
4=ログイン不可
みたいな感じ。
まず、参考URLに従って、app/Http/Controllers/Auth/AuthController.phpにコードを追加する。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
use Illuminate\Http\Request; // 認証(getCredentials)に必要。参考URLには書いてなかった! class AuthController extends Controller { use AuthenticatesAndRegistersUsers { getCredentials as _getCredentials; } /** * Get the needed authorization credentials from the request. * * @param \Illuminate\Http\Request $request * @return array */ protected function getCredentials(Request $request) { $credentials = $this->_getCredentials($request); //通常の認証に必要な情報を取得(email/usernameとpassword) // 参考URLと同じ $credentials = array_merge($credentials, ['active' => 1]); // 認証情報を追加したい場合にはカラム名と値を指定。何もしないと指定値の場合のみ認証する。 $credentials = array_merge($credentials, ['user_permission' => 4]); return $credentials; } |
このままだと、user_permission=4(ログイン不可)のuserしかログインできないので、処理を追加する。
(user_permissionカラムの時だけ、指定された値以外は認証OKにする。)
project_root/vendor/laravel/framework/src/Illuminate/Auth/EloquentUserProvider.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
public function retrieveByCredentials(array $credentials) { // First we will add each credential element to the query as a where clause. // Then we can execute the query and, if we found a user, return it in a // Eloquent User "model" that will be utilized by the Guard instances. $query = $this->createModel()->newQuery(); foreach ($credentials as $key => $value) { if (! Str::contains($key, 'password')) { // $query->where($key, $value); // 特別なカラム(user_permission)の場合だけ、一致したらログイン不可扱いにする。 if($key === "user_permission"){ $query->where($key, "<>", $value); }else{ $query->where($key, $value); } } } return $query->first(); } |
data.index.php(表示ページ)も、user_permission によって切り分ける。
閲覧者(user_permission=3)でログインしたら、作成ボタン・編集ボタンは表示させない!
1 2 3 4 |
@if(\Auth::user()->user_permission == 1 or \Auth::user()->user_permission == 2) {!! link_to('data/create', '作成', ['class' => 'btn btn-primary']) !!} {!! link_to('data/edit', '編集', ['class' => 'btn btn-primary']) !!} @endif |
URLで、直接アクセスされた時も拒否(ルートに戻す)
DataController.php
1 2 3 4 5 6 7 |
public function edit($id) { // 管理者・編集以外はアクセス出来ない if(\Auth::user()->user_permission == 1 or \Auth::user()->user_permission == 2){ }else{ return redirect()->to('/data'); } |
分かってしまえば、それほど複雑な事をしている訳じゃないけど、ちまちま解析するのは大変だ(^_^;)