在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存储在用户表
中提前致谢...
答案 0 :(得分:1)
您最好创建一个中间件来检查用户角色,并根据角色将用户重定向到不同的页面!
运行以下命令创建一个检查用户角色的中间件。
php artisan make:middleware CheckRoleMiddleware
该命令将在名为App\Http\Middleware
的{{1}}下创建一个文件,此类将出现一个预定义的方法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
答案 1 :(得分:0)
让我们忽略关于这些东西应该如何工作的一切以及它默认情况下的工作方式以及你拥有的东西。
你觉得这里有问题吗?
if ($rolename == "student")
elseif ($rolename == "Teacher")
elseif ($rolename == "parent")
如果没有,让我们这样试试:
student
Teacher
parent
哪一个与其他人不一样?哪一个是&#34;没有工作&#34;正确?
我想假设您以一致的方式命名这些角色,因此Teacher
应为teacher
。
答案 2 :(得分:-3)
您可以通过覆盖一两个方法来完成默认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(...);
}
与构建视图和收集数据相关的一切都是它自己的路径。您所要做的就是返回登录流程的重定向。您重定向到的位置负责收集显示视图所需的数据。