[英]Laravel auth to check for column before logging in
我正在使用Laravel 5.4及其内置的Auth API。 我在users
表中添加了一个名为is_admin
的列。 我想修改登录过程,以便登录仅在is_admin == 1
。 我看过Illuminate\\Foundation\\Auth\\AuthenticatesUsers.php
( Github ),我可能会在那里做出改变但是如果可能的话我宁愿不打扰核心。 有没有更优雅的方式来做到这一点?
我用类似@Sagar Arora的解决方案解决了这个问题。 在运行artisan make:auth
时创建的app\\Http\\Controllers\\Auth\\LoginController.php
中,我覆盖了AuthenticatesUsers
的attemptLogin
方法。 这是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.