Tôi có nhiều hệ thống quản trị: một là quản trị viên cấp cao và một là quản trị viên thông thường, được phân biệt bởi thuộc tính is_admin
trong bảng người dùng.Nhiều AdminMiddleware Sự mơ hồ
Và hai middlewares này: SuperAdminMiddleware.php
public function handle($request, Closure $next, $guard = null)
{
if(Auth::check())
{
if($request->user()->is_admin==1)
{
return $next($request);
}
return redirect('/login');
}
else
{
return redirect('/login');
}
}
và NormalAdminMiddleware.php
public function handle($request, Closure $next, $guard = null)
{
if(Auth::check())
{
if($request->user()->is_admin==2)
{
return $next($request);
}
return redirect('/login');
}
else
{
return redirect('/login');
}
}
và trong LoginController:
protected function authenticated()
{
if (auth()->user()->is_admin==1) {
return redirect('/super-admin');
}
else if(auth()->user()->is_admin==2){
return redirect('/normal-admin');
}
else {
return redirect('/home');
}
}
Bây giờ, Xóa và Đọc nên được thiết kế theo cách mà quản trị viên cấp cao có thể xóa và xem tất cả chi tiết người dùng, trong khi quản trị viên thông thường chỉ có thể nhìn thấy người dùng của thành phố.
id name city is_admin
1 Non Maety 1
3 Pom Lorey 2
4 Rom Lorey 0
2 Yer Easter 0
Không thể xem tất cả. trong khi Pom chỉ thấy id 3 và 4.
Nếu tôi đặt hiển thị và xóa tuyến dưới SuperAdminMiddleware, Quản trị viên thông thường không thể xem hồ sơ của thành phố.
Route::group(['middleware' => ['App\Http\Middleware\SuperAdminMiddleware']], function() {
Route::get('/show/{id}', '[email protected]');
Route::post('/delete', '[email protected]');
});
Và nếu tôi đặt các tuyến này dưới cả SuperAdminMiddleware và NormalAddminMiddleware. NormalAdminMiddleware cũng có thể xem các hồ sơ khác của thành phố.
Route::group(['middleware' => ['App\Http\Middleware\NormalAdminMiddleware']], function() {
Route::get('/show/{id}', '[email protected]');
Route::post('/delete', '[email protected]');
});
Làm cách nào để khắc phục tình trạng này?
Đầu tiên Theo điều kiện phần mềm trung gian của bạn, Nếu bạn đang sử dụng cả hai, thì bất kỳ phần mềm trung gian nào không thành công cho cả superadmin và normaladmin, Vì vậy, cả người dùng không thể truy cập. Nhóm tuyến đường phải được tách riêng cho superadmin và normaladmin. Sau đó, từ bộ điều khiển của bạn, bạn có thể vượt qua mệnh đề where để đạt được đầu ra – Hari
Tại thời điểm này, bạn có thể đơn giản hóa giữa và chỉ sử dụng một lần kiểm tra 'is_admin> 0' Middleware không phải là cách để ẩn nội dung/nút hoặc các hành động khác dựa trên quản trị cấp độ. Tôi khuyên bạn nên xem xét Cổng/Chính sách https://laravel.com/docs/5.4/authorization để kiểm tra quyền đối với hành động. Sử dụng AdminMiddleware của bạn để kiểm tra xem người dùng có được phép truy cập các tuyến đường và kiểm tra các tuyến đường riêng lẻ bằng cách sử dụng các đối tượng cổng/chính sách – Ken
@Ken nhận được dấu cộng. Một người dùng siêu và bình thường được phân biệt tốt nhất bởi vai trò họ chơi và quyền họ có. Bạn cũng có thể xem xét các gói ACL như [ủy thác] (https: // github.com/Zizaco/ủy thác) hoặc [Sentinel] (https://github.com/cartalyst/sentinel). – joshuamabina