将 laravel 5 内置身份验证扩展为仅登录“如果用户 == 活动”
Posted
技术标签:
【中文标题】将 laravel 5 内置身份验证扩展为仅登录“如果用户 == 活动”【英文标题】:extend laravel 5 built-in authentication to login only "if user == active" 【发布时间】:2015-09-23 12:50:23 【问题描述】:我使用 laravel 5.1.6 包含的身份验证,想知道如何扩展它,像这样工作:
if (Auth::attempt(['email' => $email, 'password' => $password, 'active' => 1]))
// The user is active, not suspended, and exists.
如果用户不是“活跃的”,那么登录应该是不可能的。我在 users 表中有一个“活动”列,值为 0 或 1。我如何在仍然使用带有登录限制的内置身份验证的同时做到这一点。
编辑:
我在 AuthController 中没有 postLogin 函数,只有 use AuthenticatesAndRegistersUsers, ThrottlesLogins;
、__construct()
、validator()
和 create()
函数。我是否必须更改 Illuminate\Foundation\Auth\..
的特征中的某些内容,还是必须在 AuthController 中添加 postLogin()
函数?
【问题讨论】:
Login only if user is active using Laravel的可能重复postLogin
函数在AuthenticatesAndRegistersUsers
trait 中定义,但您可以通过在AuthController
中复制它来覆盖它,然后您可以对其进行修改。
AuthController 使用来自AuthenticatesAndRegistersUsers
的postLogin
函数。您需要通过在 AuthController 中放置一个新的 postLogin
函数来覆盖该函数。看看我在之前评论中链接的问题。
【参考方案1】:
已解决:此链接(教程)将对您有所帮助:https://medium.com/@mshanak/solved-tutorial-laravel-5-3-disable-enable-block-user-login-web-passport-oauth-4bfb74b0c810
第一步:
add new field to the User table called ‘status’ (1:enabled, 0:disabed)
第二步:
to block the web login , in app/Http/Controllers/Auth/LoginController.php add the follwoing function:
/**
* Get the needed authorization credentials from the request.
*
* @param \Illuminate\Http\Request $request
* @return array
*/
protected function credentials(\Illuminate\Http\Request $request)
$credentials = $request->only($this->username(), ‘password’);
return array_add($credentials, ‘status’, ‘1’);
第三步:
to block the user when using passport authentication ( token ) , in the User.php model add the following function :
public function findForPassport($identifier)
return User::orWhere(‘email’, $identifier)->where(‘status’, 1)->first();
完成:)
【讨论】:
【参考方案2】:在 Laravel 上 5.3.*
更新 app/Http/Controllers/Auth/LoginController
class LoginController extends Controller
use AuthenticatesUsers;
/**
* Get the needed authorization credentials from the request.
*
* @param \Illuminate\Http\Request $request
* @return array
*/
protected function credentials(\Illuminate\Http\Request $request)
$credentials = $request->only($this->username(), 'password');
return array_add($credentials, 'active', '1');
// your code here
【讨论】:
我们如何显示“它处于活动状态”的错误?谢谢【参考方案3】:您可以在 AuthController 中覆盖 getCredentials()
方法:
class AuthController extends Controller
use AuthenticatesAndRegistersUsers;
public function getCredentials($request)
$credentials = $request->only($this->loginUsername(), 'password');
return array_add($credentials, 'active', '1');
这将在尝试对用户进行身份验证时添加active = 1
约束。
编辑:如果你想要一个单独的错误消息,如 BrokenBinary 所说,那么 Laravel 允许你定义一个名为 authenticated
的方法,该方法在用户通过身份验证之后调用,但在重定向,允许您进行任何登录后处理。因此,您可以通过检查经过身份验证的用户是否处于活动状态来利用它,如果不是,则抛出异常或显示错误消息:
class AuthController extends Controller
use AuthenticatesAndRegistersUsers;
public function authenticated(Request $request, User $user)
if ($user->active)
return redirect()->intended($this->redirectPath());
else
// Raise exception, or redirect with error saying account is not active
别忘了导入Request
类和User
模型类。
【讨论】:
如果非活动用户尝试登录,他们将收到与电子邮件/密码不匹配时相同的“凭据无效”错误消息。您真的应该告诉用户他们未能登录,因为他们的帐户处于非活动状态。 我有这个authenticated
方法..但它没有被调用..有什么帮助吗?
当使用authenticated 方法时,请记住此时用户实际上已经通过了身份验证。因此,如果他与您的 $user->active 检查不匹配,您将不得不手动将他注销。 (在重定向或抛出异常之前)【参考方案4】:
我现在已经更改了身份验证中间件/app/Http/Middleware/Authenticate.php
(在评论下方添加了块):
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
if ($this->auth->guest())
if ($request->ajax())
return response('Unauthorized.', 401);
else
return redirect()->guest('auth/login');
#logout if user not active
if($this->auth->check() && $this->auth->user()->active !== 1)
$this->auth->logout();
return redirect('auth/login')->withErrors('sorry, this user account is deactivated');
return $next($request);
似乎,如果他们已经登录,它也会注销非活动用户。
【讨论】:
【参考方案5】:我会在postLogin()
函数中添加以下第一件事。
$this->validate($request, [
'email' => 'required|email', 'password' => 'required',
]);
if ($this->auth->validate(['email' => $request->email, 'password' => $request->password, 'active' => 0]))
return redirect($this->loginPath())
->withInput($request->only('email', 'remember'))
->withErrors('Your account is Inactive or not verified');
active
是用户表中的一个标志。 0 = 不活动,1 = 活动。所以整个函数看起来像下面..
public function postLogin(Request $request)
$this->validate($request, [
'email' => 'required|email', 'password' => 'required',
]);
if ($this->auth->validate(['email' => $request->email, 'password' => $request->password, 'active' => 0]))
return redirect($this->loginPath())
->withInput($request->only('email', 'remember'))
->withErrors('Your account is Inactive or not verified');
$credentials = array('email' => $request->email, 'password' => $request->password);
if ($this->auth->attempt($credentials, $request->has('remember')))
return redirect()->intended($this->redirectPath());
return redirect($this->loginPath())
->withInput($request->only('email', 'remember'))
->withErrors([
'email' => 'Incorrect email address or password',
]);
【讨论】:
您的第一次验证检查也会返回“您的帐户处于非活动状态或未验证”的错误电子邮件/密码。您应该验证电子邮件/密码,然后验证活动状态,如果没有失败则登录。 你可以看看我对另一个问题的回答。 ***.com/questions/31015606/… '$this->validate' 验证是否提供了有效的电子邮件和密码。 我说的是你的第一个if()
声明。如果用户处于活动状态但提供不匹配的电子邮件/密码,则它仍会返回“您的帐户处于非活动状态或未验证”错误消息。
如果您看到,如果用户提供了有效的电子邮件和密码,并且如果“活动”=0(非活动),那么只有条件成立。否则它将尝试使用提供的电子邮件、密码登录以上是关于将 laravel 5 内置身份验证扩展为仅登录“如果用户 == 活动”的主要内容,如果未能解决你的问题,请参考以下文章
共享点身份验证。如何从 ADFS 获取 SharePoint cookie