在laravel我有不同权限的学生,家长,员工(教师,图书管理员,监护人)角色......基于用户角色,当用户登录时,它应该重定向到不同的刀片文件。我的问题是如果用户父母或学生是重定向到不同的仪表板,但无论何时用户是教师或其他人,它都没有登录,但在用户表中已存在用户。
下面是我的LoginController代码
LoginController.php:
public function login(Request $request){
if(Auth::attempt([
'email'=>$request->email,
'username'=>$request->username,
'password'=>$request->password,
]))
{
$user=User::where('username',$request->username)->first();
$usertype=$user->user_type;
$username=$user->username;
$roles=DB::table('roles')->where('id','=',$usertype)->first();
$rolename=$roles->role_name;
if($rolename=="student"){
$student=DB::table('students')->where('stud_adm_id','=',$username)->first();
$classid=$student->class_id;
$sectionid=$student->section_id;
$class=DB::table('classtables')->where('id',$classid)->first();
$section=DB::table('sections')->where('id',$sectionid)->first();
return view('studentdashboard',compact('student','class','section'));
}elseif($rolename=="Teacher"){
$employeedetails=DB::table('employees')->where('employee_fname','=',$username)->first();
return view('teacherdashboard',compact('employeedetails'));
}
elseif($rolename=="parent"){
$parentdetails=DB::table('parents')->where('mother_phone','=',$username)->first();
$stateid=$parentdetails->state;
$state=DB::table('states')->where('state_id','=',$stateid)->first();
return view('parentdashboard',compact('parentdetails','state'));
}
}else{
return redirect()->back();
}
}
我的角色在角色表中提到,而且id存储在users表中
提前致谢...
您最好创建一个中间件来检查用户角色,并根据角色将用户重定向到不同的页面!
运行以下命令以创建检查用户角色的中间件。
php artisan make:middleware CheckRoleMiddleware
该命令将在App\Http\Middleware
下创建一个名为CheckRoleMiddleware
的文件,这个类将来自一个预定义的方法handle()
,你可以放置检查用户角色的逻辑并将它们重定向到不同的页面示例:
<?php namespace App\Http\Middleware;
use Closure;
class CheckRoleMiddleware {
public function handle($request, Closure $next)
{
//User role is admin
if ( Auth::check() && Auth::user()->isAdmin() )
{
return $next($request);
}
//If user role is student
if(Auth::check() && auth()->user()->role === 'student')
{
return view('studentDashboard');
or route('routeName');
}
//If user role is teacher
if(Auth::check() && auth()->user()->role ==='teacher')
{
return view('teacherDashboard');
or route('routeName');
}
//default redirect
return redirect('home');
}
}
并且不要忘记将CheckRoleMiddleware
添加到App\Http\Kernel.php
protected $routeMiddleware = [
'auth' => 'App\Http\Middleware\Authenticate',
'auth.basic' => 'Illuminate\Auth\Middleware\AuthenticateWithBasicAuth',
'guest' => 'App\Http\Middleware\RedirectIfAuthenticated',
'user-role' => 'App\Http\Middleware\CheckRoleMiddleware', // this line right here
];
让我们忽略关于这些东西应该如何工作的一切以及默认情况下它是如何工作的并且拿走你拥有的东西。
你在这看到一个问题:
if ($rolename == "student")
elseif ($rolename == "Teacher")
elseif ($rolename == "parent")
如果没有,让我们这样试试:
student
Teacher
parent
哪一个不像其他人?哪一个是“没有正常工作”?
我想假设你以一致的方式命名这些角色,所以Teacher
应该是teacher
。
你可以通过覆盖一两个方法来完成你想用默认的LoginController
做的所有事情。
您不应该从处理路径返回视图。 POST REDIRECT GET
。 POST进来,返回一个REDIRECT,导致GET请求(很可能会返回一个视图)。
要验证登录凭据:
protected function validateLogin(Request $request)
{
$this->validate($request, [
'email' => '...',
'username' => '...',
'password' => '...',
]);
}
要从请求中使用哪些凭据:
protected function credentials(Request $request)
{
return $request->only('email', 'username', 'password');
}
验证成功后返回的响应:
protected function authenticated(Request $request, $user)
{
// do your role checking here
// return a redirect response to where you want that particular user type to go
// return redirect()->route(...);
}
与构建视图和收集数据相关的一切都是它自己的路径。您所要做的就是返回登录流程的重定向。您重定向到的位置负责收集显示视图所需的数据。