こんにちは。
Laravel7系を使い、Usersテーブルとは別のテーブルにあるフラグを読み取って一般ユーザー用と管理者用のトップページに割り振りたいと考えています。
Gateを用いて、usersテーブルの「role_name」で割り振ることは出来ましたが、リレーション先であるrolesテーブルの「flag」で割り振る方法を調べましたが、単一のテーブルでのログイン機能実装方法や、usersテーブルとは別で管理者用の同等のテーブルを用意する等、該当のものや近い方法を見つけることが出来ませんでした。
方法としては、ログインのリクエスト情報を取得する際にrolesテーブルを参照し、権限を持っているかどうかで条件分岐するのかなと考えています。
拙い質問で大変申し訳ございませんが、取得したログイン情報からリレーション先のテーブルを参照して判別する方法、又はログイン時におけるログインリクエストの取得方法についてご助言頂きたいと思います。
宜しくお願い致します。
#実現したいこと
①メールアドレスとパスワードでログイン
②ログインのリクエスト情報から、usersの「role_name」を取得する
③取得した「role_name」と同じ所属名をrolesテーブルで探す
④該当の所属名の「flag」を確認し、「1」の場合は管理者用ページに、「0」の場合は一般ユーザー用ページリダイレクトする
#テーブル
######usersテーブル
|id|name|email|role_name|
|:--|:--:|:--:|
|1|テスト|test@test.com|管理者|
#rolesテーブル
id | name | flag |
---|
1 | 管理者 | 1 |
2 | 一般 | 0 |
#ソースコード | | |
######User.php | | |
```php | | |
<?php
namespace App;
use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
class User extends Authenticatable
{
use Notifiable;
/**
* The attributes that are mass assignable.
*
* @var array
*/
protected $fillable = [
'code','name', 'email', 'password','role_name',
];
/**
* The attributes that should be hidden for arrays.
*
* @var array
*/
protected $hidden = [
'password', 'remember_token',
];
/**
* The attributes that should be cast to native types.
*
* @var array
*/
protected $casts = [
'email_verified_at' => 'datetime',
];
public function role()
{ //所属はRolesテーブルを参照する
return $this->belongsTo('App\Role','name');
}
}
```
######Role.php
```php
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Role extends Model
{
//所属テーブルから取得させる
protected $fillable = [
'id','name'
];
public function users()
{
return $this->hasMany('App\User');
}
}
```
######AuthServiceProvider.php
```php
<?php
namespace App\Providers;
use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider;
use Illuminate\Support\Facades\Gate;
class AuthServiceProvider extends ServiceProvider
{
/**
* The policy mappings for the application.
*
* @var array
*/
protected $policies = [
// 'App\Model' => 'App\Policies\ModelPolicy',
];
/**
* Register any authentication / authorization services.
*
* @return void
*/
public function boot()
{
$this->registerPolicies();
//管理者のみアクセスを許可
Gate::define('admin',function($user){
return ($user->role_name='管理者');
});
}
}
```
######LoginController.php
```php
<?php
namespace App\Http\Controllers\Auth;
use App\Http\Controllers\Controller;
use App\Providers\RouteServiceProvider;
use Illuminate\Foundation\Auth\AuthenticatesUsers;
use Illuminate\Support\Facades\Auth;
use App\Role;
use App\User;
class LoginController extends Controller
{
/*
|--------------------------------------------------------------------------
| Login Controller
|--------------------------------------------------------------------------
|
| This controller handles authenticating users for the application and
| redirecting them to your home screen. The controller uses a trait
| to conveniently provide its functionality to your applications.
|
*/
use AuthenticatesUsers;
/**
* Where to redirect users after login.
*
* @var string
*/
protected $redirectTo = RouteServiceProvider::HOME;
protected function authenticated(\Illuminate\Http\Request $request, $user)
{
$roleCh=$this->guard()->user()->role_name;
if($roleCh='管理者'){
return view('admin.top');
}else{
return view('user.top');
}
}
/**
* Create a new controller instance.
*
* @return void
*/
public function __construct()
{
$this->middleware('guest')->except('logout');
}
}
//select * from users inner join roles on users.role_name = roles.name
```