繁体   English   中英

Laravel auth在登录前检查列

[英]Laravel auth to check for column before logging in

我正在使用Laravel 5.4及其内置的Auth API。 我在users表中添加了一个名为is_admin的列。 我想修改登录过程,以便登录仅在is_admin == 1 我看过Illuminate\\Foundation\\Auth\\AuthenticatesUsers.phpGithub ),我可能会在那里做出改变但是如果可能的话我宁愿不打扰核心。 有没有更优雅的方式来做到这一点?

我用类似@Sagar Arora的解决方案解决了这个问题。 在运行artisan make:auth时创建的app\\Http\\Controllers\\Auth\\LoginController.php中,我覆盖了AuthenticatesUsersattemptLogin方法。 这是LoginController.php的代码:

protected function attemptLogin(Request $request)
{
    return (auth()->attempt(['email' => $request->email, 'password' => $request->password, 'is_admin' => 1]));
}

现在只有is_admin == 1用户才会登录。

就像你提到的那样,你永远不应该触摸核心文件。 但是如果你能看到laravel在LoginController上添加了AuthenticatesUsers作为trait ,这意味着你可以通过在LoginController中添加credentials()来简单地覆盖它,如下所示。

/**
 * Get the needed authorization credentials from the request.
 *
 * @param  \Illuminate\Http\Request  $request
 * @return array
 */
protected function credentials(Request $request)
{
    return [
        'email'    => $request->input('email'),
        'password' => $request->input('password'),
        'is_admin' => 1
    ];
}

您可以创建登录功能:

所以在你的登录功能中你可以通过以下方式检查:

if (Auth::attempt(['email' => $email, 'password' => $password, 'is_admin' => 1])) {
    // The user is active, not suspended, and exists.
}

您在此处查看手动登录过程以及其他字段:

https://laravel.com/docs/5.4/authentication#authenticating-users谢谢

我认为更好的方法是实际允许所有用户登录。 然后通过admin中间件限制访问。 这样,您可以将此中间件应用于任意数量的路由。

通过包装必要的路线来使用它

Route::group(['middleware' => 'admin'], function() {
    // auth protected routes
});

这样您就可以创建app\\Http\\Middleware\\RedirectIfNotAdmin

<?php

namespace App\Http\Middleware;

use Closure;

class RedirectIfNotAdmin
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        $user = $request->user();

        if ( $user && $user->is_admin ) {
            return $next($request);
        }

        return redirect('/');
    }
}

然后在app\\Http\\Kernel.php它追加到$routeMiddleware属性:

protected $routeMiddleware = [
        // ... other middlewares
        'admin' => \App\Http\Middleware\RedirectIfNotAdmin::class
    ];

这个解决方案可能并不优雅,但仍然有效。

将此添加到LoginController

protected function authenticated(Request $request, $user)
{
    if ( ! $user->is_admin ) {
        Auth::logout();
        return redirect('login')->withErrors(['is_admin' => 'Only admin users may log in']);
    }
}

然后把它放在auth/login.blade.php

@if($errors->has('is_admin'))
    <div class="alert alert-danger" role="alert">{{ $errors->first('is_admin') }}</div>
@endif

还要记住,您应该禁用注册功能,因为在注册用户后仍然会登录。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM