在 Laravel 5.2 中修改原生认证
Posted
技术标签:
【中文标题】在 Laravel 5.2 中修改原生认证【英文标题】:Modify native authentication in Laravel 5.2 【发布时间】:2016-04-23 12:43:06 【问题描述】:我在 Laravel 5.2 中使用开箱即用的身份验证(使用工匠命令 make:auth)。它就像一个魅力。
问题是,我想限制只有活动用户的登录(deleted_at = NULL)。
但是,当使用软删除时,我无法使用 user_id 外键检索其他模型(尽管用户已被删除,但我仍然必须访问用户信息)。
什么是好的方法?
我想出的另一种方法是使用“活动”布尔列而不是“deleted_at”日期列。这样,我可以只过滤具有“active”=TRUE 的用户,并且外键没有问题。
在这种情况下,我如何才能限制用户仅在“活动”设置为 TRUE 时才能登录?
干杯!
【问题讨论】:
我不明白您为什么希望另一列模仿deleted_at
列,您的理由似乎没有多大意义。
如果我使用 deleted_at 列软删除,在检索附加到“用户”的其他模型时,我无法检索用户。或者我可以吗?那太好了
你有雄辩的withTrashed
和onlyTrashed
方法来确保你得到删除项目或只删除项目的结果。这些应该可以很好地满足您的目的。然后您可以使用trashed
方法来检测模型是否已被软删除。
在引用其他模型的用户时(例如,从国家/地区的角度查询所有活动和非活动用户时),我可以使用 withTrashed 吗?回到最初的问题:只有“deleted_at”用户才能登录吗?
【参考方案1】:
您始终可以将任何额外参数传递给Auth::attempt()
方法,如下所示:
if (Auth::attempt(['email' => $email, 'password' => $password, 'active' => 1]))
// Redirect to required route/url
据我了解,您也可以对 deleted_at
字段执行类似操作。
【讨论】:
【参考方案2】:Laravel 用于在控制器中进行身份验证的 trait 有一个 handleUserWasAuthenticated()
方法。它检查另一个名为authenticated()
(默认情况下未定义)的方法,并在完全验证用户并让他们访问您的应用程序之前调用该方法。因此,如果您在自己的 AuthController 中定义此方法,则可以进行任何身份验证后检查,例如用户是否处于活动状态。
class AuthController
public function authenticated($request, $user)
if (! $user->is_active)
// Throw exception, display error etc.
return redirect()->intended($this->redirectPath());
【讨论】:
【参考方案3】:在Auth\AuthController.php中,添加authenticated()
函数
use Auth;
class AuthController extends Controller
.
.
.
public function authenticated($request, $user)
if (! $user->active)
Auth::logout();
return redirect('login')->withErrors([
$this->loginUsername() => 'Your '.$this->loginUsername().' is not active. Please contact Administrators'
]);
else
return redirect()->intended($this->redirectPath());
【讨论】:
以上是关于在 Laravel 5.2 中修改原生认证的主要内容,如果未能解决你的问题,请参考以下文章
Laravel 5.2 用户认证,怎样用Flash Message显示错误信息