Laravel:如何确保用户在注册后和登录后进入特定于角色的主视图?

时间:2019-03-28 08:12:58

标签: laravel laravel-authorization laravel-5.8 laravel-authentication

我在laravel-5.8中为一个大学网站创建了一个自定义的多重身份验证系统,每个用户都在其中注册特定角色:管理员,教职员工或HOD(系主任)。

我正在使用运行后得到的控制器和视图

php artisan make:auth

注册后,所有用户都将重定向到默认主页,无论其角色如何。 3个角色在列角色下分别以0、1和2的形式存储在Users表中。我修改了默认情况下出现的Users表。

我的登录机制运行良好。用户将被重定向到其角色的主页。这是我的方法:

LoginController.php

public function login(Request $request){
if(Auth::attempt(['PID' => $request->PID, 'password' => $request->password])){

    $user = User::where('PID',$request->PID)->first();

    if($user->role == '0'){
        return redirect('home');
    }
    else{
        if($user->role == '1'){
            return redirect('hodhome');
        }
        else{
            return redirect('adminhome');
        }
    }
}
return redirect()->back();
}

这是来自 login.blade.php

的POST请求所使用的路由
Route::post('/login/custom', 'auth\LoginController@login')->name('login.custom');

但是,每次我注册新用户时,即使他们是管理员或HOD,也会将用户带到教师的主页路线。这是注册机制:

RegisterController.php (仅在下面显示相关功能)

use RegistersUsers;
protected $redirectTo = '/home';
public function __construct()
{
    $this->middleware('guest');
}
//validator function and create function after this line

我试图通过以下操作使其正常工作:将变量redirectTo更改为一个函数。     //一个想法:替换为“ protected $ redirectTo ='/ home';”通过...

protected function redirectTo(array $data){
    if($data['role']=='0'){ return redirect('home'); }
    elseif($data['role']=='1'){ return redirect('hodhome'); }
    else return redirect('adminhome');
}

但是它不起作用,因为我似乎缺少了一些东西。

另一个麻烦的事实是,登录后用户可以访问其他角色的主页。我的路线中的middleware('auth')有助于防止未登录时访问URL,但这不会阻止已登录的用户访问其他主页。

以下是前往首页的路线:

Auth::routes();

//-------------------MULTI AUTH SYSTEM------------------------------------------

Route::post('/login/custom', 'auth\LoginController@login')->name('login.custom');

Route::get('/home', 'HomeController@index')->name('home');

route::get('/adminhome', function () {
    return view('adminhome');
})->middleware('auth');

route::get('/hodhome', function () {
    return view('hodhome');
})->middleware('auth');
//----------------------------------------------------------------------------

默认的welcome.blade.php也会将登录用户重定向到教师的主页:

@if (Route::has('login'))
        <div class="top-right links">
            @auth
                <a href="{{ url('/home') }}">Home</a>
            @else
                <a href="{{ route('login') }}">Login</a>

                @if (Route::has('register'))
                    <a href="{{ route('register') }}">Register</a>
                @endif
            @endauth
        </div>
    @endif

  1. 如何确保新注册后以及登录时用户访问正确的主页?
  2. 如何确保一个角色的主页对其他角色不可用?

编辑1:

在合并@ N69S建议的更改之后,这就是发生的情况:

  • 页面已成为特定角色。
  • 一个角色无法访问另一个角​​色的页面,未经身份验证的用户无法查看除欢迎页面之外的任何页面。

该解决方案有效。但是,当尝试对URL进行非法访问时,必须生成一个错误。 而是将用户发送到欢迎页面。该页面的右上角只有一个链接,称为“ HOME” 。管理员或HOD用户登录后,此链接不起作用,因为它路由到'/home',如下所示:

//welcome.blade.php
<body>
    <div class="flex-center position-ref full-height">
        @if (Route::has('login'))
            <div class="top-right links">
                @auth
                    <a href="{{ url('/home') }}">Home</a>
                @else
                    <a href="{{ route('login') }}">Login</a>

                    @if (Route::has('register'))
                        <a href="{{ route('register') }}">Register</a>
                    @endif
                @endauth
            </div>
        @endif

        <div class="content">
            <div class="title m-b-md text-center">
                COLLEGE ADMINISTRATION <br> SYSTEM
            </div>
        </div>
    </div>
</body>

如何更改此视图文件以将登录用户发送到其角色的HOME?

1 个答案:

答案 0 :(得分:0)

一个完整而正确的解决方案是将实体(HOD,Admin,User)分开,并为每个实体(auth:hod,auth:admin,auth)配置auth

另一种解决方案是制作3个单独的中间件,并相应地将其中的一条路由分组。

btw,redirectTo()方法不带参数。来自Illuminate\Foundation\Auth\RedirectsUsers特质

/**
 * Get the post register / login redirect path.
 *
 * @return string
 */
public function redirectPath()
{
    if (method_exists($this, 'redirectTo')) {
        return $this->redirectTo();
    }

    return property_exists($this, 'redirectTo') ? $this->redirectTo : '/home';
}

---------------编辑

对于3种中间件解决方案,您可以使用命令php artisan make:middleware Admin,这将创建类文件app/Http/ Middleware/Admin.php

handle方法中,您可以执行类似的操作

public function handle($request, Closure $next)
{
    if(auth()->user() && auth()->user()->role == 2){
        return $next($request);
    }
    return redirect(‘login’)->with(‘error’,’You have not admin access’);
}

并对HOD执行相同操作

要像在路由中使用auth一样使用它,请将中间件添加到App\Http\Kernel.php的内核$routeMiddleware

protected $routeMiddleware = [
    //....,
    //....,
    'admin' => \App\Http\Middleware\Admin::class,
];