私の役割は動的であり、ユーザーの権限も動的です。ユーザーが特定のページへのアクセスを許可されているかどうかを検証するには、2つの方法があります。
アプローチ1
class BaseController extends Controller
{
public function __construct() {
if(!\Auth::user()->IsPredefined) {
$result = $this->ValidateAuthorization();
if(!$result) {
\Auth::logout();
return redirect()->route("login");
}
}
}
private function ValidateAuthorization() {
$ActionName = \Route::getCurrentRoute()->getPath();
switch ($ActionName) {
case "ChangePassword":
$ModuleID = ModuleEnum::AccountManagemenet;
$ActionID = AccountActionEnum::ChangePassword;
return CheckUsePermissions($ModuleID, $ActionID);
}
}
private function CheckUsePermissions($ModuleID, $ActionID) {
$User = MySession::UserPermissions();
foreach($User->UserRolePermissions as $UserRolePermission) {
$CurrentActionID = $UserRolePermission->RolePermission->Permission->ActionID;
$CurrentModuleID = $UserRolePermission->RolePermission->Permission->ModuleID;
if($CurrentActionID == $ActionID && $CurrentModuleID == $ModuleID &&
$UserRolePermission->IsActive == true) {
return true;
}
}
return false;
}
}
アプローチ2
RequestクラスでAuthorizeメソッドを使用する
public function authorize()
{
return true;
}
錯乱
動的ロールの場合、次のようにします。
次の権限があるとします。
これで、Super Admin
(明らかに上記のすべてのアクセス許可を持っている)は、ロールを作成し、Hotel Manager
にのみアクセス許可を割り当てることができManage Hotels
ます。
次のようなルートの場合:
Route::get('/admin/hotels', 'HotelsController@index')->name('admin.hotels.index');
Route Group
ミドルウェアを入れてに入れます:
Route::group(['prefix' => '/admin/hotels', 'middleware' => ['permission:manage_hotels']], function () {
Route::get('/', 'HotelsController@index')->name('admin.hotels.index');
Route::post('/', 'HotelsController@create')->name('admin.hotels.create');
});
次に、Permission
ミドルウェアを作成します。
class Permission
{
public function handle($request, Closure $next, $permission)
{
//if not super admin (super admin role_id is 1)
if(auth()->user()->role_id != 1) {
//explode extra param passed to this middleware (here manage_hotels)
$permission_array = explode('_', $permission);
foreach ($permission_array as $key => $value) {
$permission_array[$key] = ucfirst($value);
}
$permission_name = implode(' ', $permission_array);
$permitted = auth()->user()->role->permissions()->where('name', $permission_name)->first();
if(! $permitted) {
return redirect()->route('admin.dashboard')->withErrors(['error' => ['message' => 'You are not allowed to perform this action.']]);
}
}
return $next($request);
}
}
もちろん、これらのルートをラップしAdmin Middleware
て、ユーザーがログインし、管理者の役割を持っていることを確認する必要があります。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加