认证与安全性
设定
Laravel 的目标就是要让实现认证机制变得简单。事实上,几乎所有的设置默认就已经完成了。有关认证的配置文件都放在 app/config/auth.php
里,而在这些文件里也都包含了良好的注释描述每一个选项的所对应的认证行为及动作。
Laravel 默认在 app/models
文件夹内就包含了一个使用 Eloquent 认证驱动的User
模型。请记得在建立模型结构时,密码字段至少要有 60 个字串宽度。
假如您的应用程序并不是使用 Eloquent ,您也可以使用 Laravel 的查询构造器做 database
认证驱动。
在开始之前,请先确认您的 users
(或其他同义) 数据库表包含一个名为 remember_token
长度为100的string类型、可接受 null 的字段。这个字段将会被用来储存「记住我」的 session token。
储存密码
Laravel 的 Hash
类提供了安全的 Bcrypt 哈希演算法:
对密码加密
$password = Hash::make('secret');
验证密码
if (Hash::check('secret', $hashedPassword))
{
// The passwords match...
}
确认密码是否需要重新加密
if (Hash::needsRehash($hashed))
{
$hashed = Hash::make('secret');
}
用户认证
您可以使用 Auth::attempt
方法来验证用户成功登录之前的信息确认:
if (Auth::attempt(array('email' => $email, 'password' => $password)))
{
return Redirect::intended('dashboard');
}
需提醒的是 email
并不是一个必要的字 段,在这里仅用于示范。您可以使用数据库里任何类似于「用户名称」的字段做为帐号的唯一标识。若用户尚未登入的话,认证筛选器会使用 Redirect::intended
方法重定向跳转用户至指定的 URL。我们可指定一个备用 URI ,当预定重定向跳转位置不存在时使用。
当 attempt
方法被调用时,auth.attempt
事件 将会被触发。假如认证成功的话,则 auth.login
事件会接着被触发。
判定用户是否已登入
判定一个用户是否已经登入您的应用程序,您可以使用 check
这个方法:
if (Auth::check())
{
// The user is logged in...
}
认证一个用户并且「记住」他
假如您想要在您的应用程序内提供「记住我」的选项,您可以在 attempt
方法的第二个参数复制为 true
,这样就可以保留用户的认证身份 (或直到他手动登出为止)。当然,您的 users
数据库表必需包括一个字串类型的 remember_token
字段来储存「记住我」的标记。
if (Auth::attempt(array('email' => $email, 'password' => $password), true))
{
// The user is being remembered...
}
注意: 假如 attempt
方法回传 true
,则表示用户已经登入您的应用程序。
通过记住我来认证用户
假如您让用户通过「记住我」的方式来登入,则您可以使用 viaRemember
方法来判定用户是否拥有「记住我」cookie 来认证用户登入:
if (Auth::viaRemember())
{
//
}
条件认证用户
在认证过程中,您可能会想要增加额外的认证条件:
if (Auth::attempt(array('email' => $email, 'password' => $password, 'active' => 1)))
{
// The user is active, not suspended, and exists.
}
为了增加对 session 的保护,用户的 session ID 将会在用户认证完成后自动重新产生。
取得已登入的用户信息
当用户完成认证后,您就可以通过模型来取得相关的数据:
$email = Auth::user()->email;
取得登入用户的 ID,您可以使用 id
方法:
$id = Auth::id();
若想要通过用户的 ID 来登入应用程序,可直接使用 loginUsingId
方法:
Auth::loginUsingId(1);
验证用户信息而不要登入
validate
方法可以让您验证用户信息而不真的登入应用程序:
if (Auth::validate($credentials))
{
//
}