Laravel 已经预设了两个认证相关的控制器。 `AuthController`处理新的用户注册和「登陆」,而 `PasswordController` 可以帮助已经注册的用户重置密码。
每个控制器使用 `trait` 引入需要的方法。在大多数应用上,你不需要修改这些控制器。这些控制器用到的视图放在 `resources/views/auth` 目录下。你可以依照需求修改這些视图。
### 用户注册
要修改应用注册新用户时所用到的表单字段,可以修改 App\Services\Registrar 类。这个类负责验证和建立应用的新用户。
Registrar 的 `validator` 方法包含新用户时的验证规则,而 Registrar 的 `create` 方法负责在数据库中建立一条新的 User 记录。你可以自由的修改这些方法。`Registrar` 方法是通过`AuthenticatesAndRegistersUsers trait` 的中的 `AuthController` 调用的。
### 手动认证
如果你不想使用预设的 `AuthController`,你需要直接使用 Laravel 的身份验证类来管理用户认证。别担心,这也很简单的!首先,让我们看看 attempt 方法:
~~~
~~~
<?php namespace App\Http\Controllers;
use Auth;
use Illuminate\Routing\Controller;
class AuthController extends Controller {
/**
* Handle an authentication attempt.
*
* @return Response
*/
public function authenticate()
{
if (Auth::attempt(['email' => $email, 'password' => $password]))
{
return redirect()->intended('dashboard');
}
}
}
~~~
~~~
attempt 方法可以接受由键值对组成的数组作为第一个参数。password 的值会先进行 哈希。数组中的其他 值会被用来查询数据表里的用户。所以,在上面的示例中,会根据 email 列的值找出用户。如果找到该用户,会比对数据库中存储的哈希过的密码以及数组中的哈希过后的 password值。假设两个哈希后的密码相同,会重新为用户启动认证通过的 session。
如果认证成功, `attempt` 将会返回 `true`。否则则返回 `false`。
> 注意:在上面的示例中,并不一定要使用 email 字段,这只是作为示例。你应该使用对应到数据表中的「username」的任何键值。
`intended` 方法会重定向到用户尝试要访问的 URL , 其值会在进行认证过滤前被存起来。也可以给这个方法传入一个预设的 URI,防止重定向的网址无法使用。
### 以特定条件验证用户
在认证过程中,你可能会想要加入额外的认证条件:
~~~
~~~
if (Auth::attempt(['email' => $email, 'password' => $password, 'active' => 1]))
{
// The user is active, not suspended, and exists.
}
~~~
~~~
### 判断用户是否已验证
判断一个用户是否已经登录,你可以使用 check 方法:
~~~
~~~
if (Auth::check())
{
// The user is logged in...
}
~~~
~~~
### 认证用户并且「记住」他
假如你想要在应用中提供「记住我」的功能,你可以传入布尔值作为 `attempt` 方法的第二个参数,这样就可以保留用户的认证身份(或直到他手动登出为止)。当然,你的 `users` 数据表必需包括一个字符串类型的 `remember_token` 列來储存「记住我」的标识。
~~~
~~~
if (Auth::attempt(['email' => $email, 'password' => $password], $remember))
{
// The user is being remembered...
}
~~~
~~~
假如有使用「记住我」功能,可以使用 viaRemember 方法判定用户是否拥有「记住我」的 cookie 來判定用户认证:
~~~
~~~
if (Auth::viaRemember())
{
//
}
~~~
~~~
### 以 ID 认证用户
要通过 ID 来认证用户,使用 `loginUsingId` 方法:
~~~
~~~
Auth::loginUsingId(1);
~~~
~~~
### 验证用户信息而不登陆
`validate` 方法可以让你验证用户凭证信息而不用真的登陆应用:
~~~
~~~
if (Auth::validate($credentials))
{
//
}
~~~
~~~
### 在单一请求内登陆用户
你也可以使用 `once` 方法來让用户在单一请求内登陆。不会有任何 `session` 或 `cookie` 产生:
~~~
~~~
if (Auth::once($credentials))
{
//
}
~~~
~~~
### 手动登陆用户
假如你需要将一个已经存在的用户实例登陆应用,你可以调用 `login` 方法并且传入用户实例:
`Auth::login($user);`
这个方式和使用 `attempt` 方法验证用户凭证信息是一样的。
用户登出
`Auth::logout();`
当然,假设你使用 Laravel 內建的认证控制器,预设提供了让用户登出的方法。
### 认证事件
当 `attempt` 方法被调用时,`auth.attempt` 事件 会被触发。假设用户尝试认证成功并且登陆了,`auth.login` 事件会被触发。
- 前言
- 发行说明/L5新特性
- 升级向导
- 升级到 5.0.16
- 从 4.2 升级到 5.0
- 从 4.1 升级到 4.2
- 从 4.1.x 升级到 4.1.29
- 从 4.1.25 升级到 4.1.26
- 从 4.0 升级到 4.1
- 贡献向导
- 环境配置
- 安装
- 配置
- 基本功能
- 路由
- 基本路由
- CSRF 保护
- 方法欺骗
- 路由参数
- 命名路由
- 路由群组
- 路由模型绑定
- 抛出 404 错误
- 中间件
- 建立中间件
- 注册中间件
- 可终止中间件
- 控制器
- 基础控制器
- 控制器中间件
- 隐式控制器
- RESTful 资源控制器
- 请求
- 取得请求实例
- 取得输入数据
- 旧输入数据
- Cookies
- 上传文件
- 其他的请求信息
- 响应
- 基本响应
- 重定向
- 其他响应
- 响应宏
- 系统架构
- 服务提供者
- 基本提供者例子
- 注册提供者
- 缓载提供者
- 服务容器
- 基本用法
- 将接口绑定到实现
- 上下文绑定
- 标签
- 实际应用
- 容器事件
- 参考:理解PHP 依赖注入|Laravel IoC容器
- Contracts
- 为什么用 Contracts
- Contract 参考
- 如何使用 Contracts
- Facades
- 实际用法
- 建立 Facades
- 模拟 Facades
- Facade 类参考
- 请求的生命周期
- 生命周期概要
- 聚焦于服务提供者
- 应用程序结构
- 根目录
- App 目录
- 为应用程序配置命名空间
- 系统服务
- 认证
- 用户认证
- 取得经过认证的用户
- 保护路由
- HTTP 基本认证
- 忘记密码与重设
- 第三方登陆认证
- 交易
- 配置文件
- 订购方案
- 一次性付款
- Single Charges
- 免信用卡试用
- 订购转换
- 订购数量
- 取消订购
- 恢复订购
- 确认订购状态
- 处理失败订阅
- 处理其它 Stripe Webhooks
- 收据
- 缓存
- 配置
- 缓存用法
- 递增与递减
- 缓存标签
- 缓存事件
- 数据库缓存
- 集合
- Command Bus
- 建立命令
- 调用命令
- 命令队列
- 命令管道
- 核心扩展
- 管理者和工厂
- 缓存
- Session
- 认证
- 基于服务容器的扩展
- Laravel Elixir
- 安装与配置
- 使用方式
- Gulp
- Custom Tasks and Extensions
- 加密
- Envoy 任务执行器
- 安装
- 执行任务
- 多服务器
- 并行执行
- 任务宏
- 通知
- 更新 Envoy
- 错误与日志
- 配置
- 错误处理
- HTTP 异常
- 日志
- 事件
- 基本用法
- 事件处理队列
- 事件订阅者
- 文件系统与云存储
- 配置文件
- 基本用法
- 自定义文件系统
- 哈希
- 基本用法
- 辅助方法
- 数组
- 路径
- 路由
- 字符串
- 网址(URL)
- 其他
- 本地化
- 语言文件
- 基本用法
- 复数
- 验证
- 覆写扩展包的语言文件
- 邮件
- 配置
- 基本用法
- 内嵌附件
- 邮件队列
- 邮件与本地端开发
- 扩展包开发
- 视图
- 语言
- 配置文件
- 公共资源
- 发布分类文件
- 路由
- 分页
- 配置
- 使用
- 追加分页链接
- 转换至 JSON
- 队列
- 设置
- 基本用法
- 队列闭包
- 执行一个队列监听
- 常驻队列处理器
- 推送队列
- 已失败的工作
- 会话
- 配置
- 使用 Session
- 暂存数据(Flash Data)
- 数据库 Sessions
- Session 驱动
- 模板
- Blade 模板
- Blade 控制语法结构
- Blade 扩展
- 参考:@section与@yield 介绍
- 单元测试
- 定义并执行测试
- 测试环境
- 从测试调用路由
- 模拟 Facades
- 框架 Assertions
- 辅助方法
- 重置应用程序
- 表单验证
- 基本用法
- 控制器验证
- 表单请求验证
- 使用错误信息
- 错误信息 & 视图
- 可用验证规则
- 条件验证规则
- 自定义错误信息
- 自定义验证规则
- 数据库
- 使用基础
- 配置
- 读取/写入连接
- 执行查找
- 数据库事务处理
- 获取连接
- 日志记录
- 查询构造器
- Selects
- Joins
- 高级 Wheres
- 聚合
- 原生表达式
- 添加
- 更新
- 删除
- Unions
- 悲观锁定 (Pessimistic Locking)
- Eloquent ORM
- 基本用法
- 批量赋值
- 新增,更新,删除
- 软删除
- 时间戳
- 范围查询
- Global Scopes
- 关联
- 关联查询
- 预载入
- 新增关联模型
- 更新上层时间戳
- 使用枢纽表
- 集合
- 获取器和修改器
- 日期转换器
- 属性类型转换
- 模型事件
- 模型观察者
- 模型 URL 生成
- 转换成数组 / JSON
- 结构生成器
- 建立与删除数据表
- 加入字段
- 修改字段
- 修改字段名称
- 移除字段
- 检查是否存在
- 加入索引
- 外键
- 移除索引
- 移除时间戳记和软删除
- 保存引擎
- 迁移和数据填充
- 建立迁移文件
- 执行迁移
- 回滚迁移
- 数据填充
- Redis
- 配置
- 使用方式
- 管道
- 开发包
- Confide 用户身份认证
- Entrust 权限管理
- Shoppingcart 购物车
- Genertators 代码生成工具
- IDE Helper IDE助手
- Artisan 命令行工具
- 概览
- 用法
- 在命令行接口以外的地方调用命令
- 定时调用 Artisan 命令
- 开发
- 建立自定义命令
- 注册自定义命令
- CoverPage