根据在laravel控制器中使用if条件提到的角色,重定向到laravel中的不同视图

问题描述 投票:0回答:3

在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表中

提前致谢...

laravel laravel-5.4
3个回答
1
投票

您最好创建一个中间件来检查用户角色,并根据角色将用户重定向到不同的页面!

运行以下命令以创建检查用户角色的中间件。

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
];

0
投票

让我们忽略关于这些东西应该如何工作的一切以及默认情况下它是如何工作的并且拿走你拥有的东西。

你在这看到一个问题:

if ($rolename == "student")

elseif ($rolename == "Teacher")

elseif ($rolename == "parent")

如果没有,让我们这样试试:

student
Teacher
parent

哪一个不像其他人?哪一个是“没有正常工作”?

我想假设你以一致的方式命名这些角色,所以Teacher应该是teacher


-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(...);
}

与构建视图和收集数据相关的一切都是它自己的路径。您所要做的就是返回登录流程的重定向。您重定向到的位置负责收集显示视图所需的数据。

© www.soinside.com 2019 - 2024. All rights reserved.