首页 > 解决方案 > 如何根据角色限制 Laravel 登录?

问题描述

我正在寻找一种更好、更有效的方法来限制用户基于他们给定的角色登录到应用程序。例如只有Users具有角色Administrator才能能够登录到应用程序仪表板。

这是我的实现

谢谢

用户表 用户表

用户表播种器

<?php

use App\User;
use Illuminate\Database\Seeder;

class UsersTableSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        $user = new User();
        $user->name = "admin";
        $user->email = "";
        $user->mobile = "";
        $user->is_admin = true;
        $user->password = bcrypt("");
        $user->active = false;
        $user->save();
    }
}

登录方式

  public function login(Request $request)
    {
        // Check validation
        $validator = $this->validate($request, [
            'email' => 'required | email',
            'password' => 'required | string | min:8',
        ]);

        if ($this->authenticate($request)) {
            return redirect()->route('home');
        }

        return redirect('/')->withErrors($validator, 'login');
    }

验证方法

    public function authenticate($request)
    {
        return \Auth::guard()->attempt([
            'email' => $request->email,
            'password' => $request->password,
        ],
            $request->filled('remember')
        );
    }

标签: phplaravel

解决方案


在您的登录控制器中覆盖此方法以限制登录

protected function credentials(Request $request)
{
    return array_merge($request->only($this->username(), 'password'), ['is_admin' => 1]);
}

/**
 * Get the failed login response instance.
 *
 * @param  \Illuminate\Http\Request  $request
 * @return \Illuminate\Http\RedirectResponse
 */
protected function sendFailedLoginResponse(Request $request)
{
    $errors = [$this->username() => trans('auth.failed')];

    // Load user from database
    $user = User::where($this->username(), $request->{$this->username()})->first();

    // Check if user was successfully loaded, that the password matches
    // and is_admin not 1. If so, override the default error message.
    if ($user && \Hash::check($request->password, $user->password) && $user->is_admin != 1) {
        $errors = [$this->username() => "You don't have access to login this system"];
    }

    if ($request->expectsJson()) {
        return response()->json($errors, 422);
    }
    return redirect()->back()
        ->withInput($request->only($this->username(), 'remember'))
        ->withErrors($errors);
}

确保在顶部使用它。

use Illuminate\Http\Request;
use App\User;

推荐阅读