1.使用命令行直接设置
想要更快上手?只需要在新安装的Laravel应用下运行php artisan make:auth
,然后在浏览器中访问http://my/register
,该命令会生成用户登录注册所需要的所有东西。
Laravel 提供了几个预置的认证控制器,位于 App\Http\Controllers\Auth
命名空间下,RegisterController
用于处理新用户注册,
LoginController
用于处理用户登录认证,ForgotPasswordController
用于处理重置密码邮件链接,
ResetPasswordController
包含重置密码逻辑,每个控制器都使用 trait 来引入它们需要的方法。对很多应用而言,你根本不需要修改这些控制器。
路由
Laravel 通过运行如下命令可快速生成认证所需要的路由和视图:
php artisan make:auth
运行该命令会生成注册和登录视图,以及所有的认证路由,同时生成 HomeController
用于处理应用的登录请求。
视图
正如上面所提到的,php artisan make:auth
命令会在 resources/views/auth
目录下创建所有认证需要的视图。
make:auth
命令还创建了 resources/views/layouts
目录,该目录下包含了应用的基础布局文件。所有这些视图都使用了 Bootstrap CSS 框架,
你也可以根据需要对其进行自定义。
如图:
认证
现在你已经为自带的认证控制器设置好了路由和视图,接下来我们来实现新用户注册和登录认证。你可以在浏览器中访问定义好的路由,
认证控制器默认已经包含了注册及登录逻辑(通过trait)。
自定义路径
当一个用户成功进行登录认证后,默认将会跳转到/home
,你可以通过在LoginController
,RegisterController
和 ResetPasswordController
中定义 redirectTo
属性来自定义登录认证成功之后的跳转路径:
protected $redirectTo = '/';
当一个用户登录认证失败后,默认将会跳转回登录表单对应的页面。
自定义Guard
你还可以自定义用于实现用户注册登录的“guard”,要实现这一功能,需要在 LoginController
,RegisterController
和ResetPasswordController
中定义 guard
方法,该方法将会返回一个guard实例:
use Illuminate\Support\Facades\Auth;
protected function guard()
{
return Auth::guard('guard-name');
}
自定义验证/存储
要修改新用户注册所必需的表单字段,或者自定义新用户字段如何存储到数据库,你可以修改 RegisterController
类。该类负责为应用验证输入参数和创建新用户。
RegisterController
的 validator
方法包含了新用户注册的验证规则,你可以按需要自定义该方法。
RegisterController
的 create
方法负责使用 Eloquent ORM 在数据库中创建新的 App\User
记录。当然,你也可以基于自己的需要自定义该方法.
获取认证用户
你可以通过 Auth
门面访问认证用户:
$user = Auth::user();
2.手动认证用户
当然,你也可以不使用 Laravel 自带的认证控制器。如果你选择移除这些控制器,你需要直接使用 Laravel 认证类来管理用户认证。别担心,这很简单!
我们将会通过 Auth
门面来访问认证服务,因此我们需要确保在类的顶部导入了 Auth
门面,让我们看看 attempt
方法:
<?php
namespace App\Http\Controllers;
use Illuminate\Support\Facades\Auth;
class AuthController extends Controller
{
/**
* Handle an authentication attempt.
*
* @return Response
*/
public function authenticate()
{
if (Auth::attempt(['email' => $email, 'password' => $password])) {
// Authentication passed...
return redirect()->intended('dashboard');
}
}
}
attempt
方法接收键值数组对作为第一个参数,数组中的值被用于从数据表中查找用户,因此,在上面的例子中,用户将会通过email
的值获取,如果用户被找到,
经哈希运算后存储在数据中的密码将会和传递过来的经哈希运算处理的密码值进行比较。如果两个经哈希运算的密码相匹配那么将会为这个用户开启一个认证Session。
如果认证成功的话 attempt
方法将会返回 true
。否则,返回 false
。
重定向器上的 intended
方法将用户重定向到登录之前用户想要访问的 URL,在目标 URL 无效的情况下回退 URI 将会传递给该方法。
指定额外条件
如果需要的话,除了用户邮件和密码之外还可以在认证查询时添加额外的条件,例如,我们可以验证被标记为有效的用户:
if (Auth::attempt(['email' => $email, 'password' => $password, 'active' => 1])) {
// The user is active, not suspended, and exists.
}
注:在这些例子中,并不仅仅限于使用
email
进行登录认证,这里只是作为演示示例,你可以将其修改为数据库中任何其他可用作“username”的字段。
访问指定 Guard 实例
你可以使用 Auth
门面的 guard
方法指定想要使用的 guard 实例,这种机制允许你在同一个应用中对不同的认证模型或用户表实现完全独立的用户认证。
传递给 guard
方法的 guard 名称对应配置文件 auth.php
中 guards
配置的某个键:
if (Auth::guard('admin')->attempt($credentials)) {
//
}
自定义的Guard
在配置文件 config/auth.php
中切换到新的用户提供者。首先,定义一个使用新驱动的 provider
:
'providers' => [
'users' => [
'driver' => 'riak',
],
],
然后,可以在你的 guards
配置中使用这个提供者:
'guards' => [
'web' => [
'driver' => 'session',
'provider' => 'users',
],
],
在这里我使用的是数据库里的用户,这样就指定用户提供者了。
数据表结构:
CREATE TABLE `admin` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(50) NOT NULL DEFAULT '0' COMMENT '登录名',
`password` varchar(80) NOT NULL DEFAULT '0' COMMENT '登录密码',
`remember_token` varchar(100) CHARACTER SET utf8 COLLATE utf8_unicode_ci DEFAULT NULL,
`addtime` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '添加时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=23 DEFAULT CHARSET=utf8 COMMENT='后台管理员';
'guards' => [
'web' => [
'driver' => 'session',
'provider' => 'admin',
],
],
'providers' => [
'admin' => [
'driver' => 'database',
'table' => 'admin',
],
要退出应用,可以使用 Auth
门面的 logout
方法,这将会清除用户 Session 中的认证信息:
Auth::logout();