laravel5.5用户认证
1. 命令
php artisan make:auth # 生成文件和配置
php artisan migrate # 创建数据表
以上命令主要做了几件事
- route/web.php中增加了路由配置
- resources/views/auth和resources/views/layouts创建了视图文件
2. 快速认证
主要涉及到Controllers\Auth下面的文件
打开文件你可能会发现里面并没有定位各种方法,也没有继承关系,但是有使用trait,你可以看到use xxxx;这句话,打开相应文件会发现别有洞天。
2.1 自定义路径
当用户成功通过身份认证后,他们会被重定向到 /home URI。你可以通过在 LoginController、RegisterController 和 ResetPasswordController中设置 redirectTo 属性来自定义重定向的位置:
protected $redirectTo = '/';
如果重定向路径需要自定义生成逻辑,你可以定义 redirectTo 方法来代替 redirectTo 属性:
protected function redirectTo()
{
return '/path';
}
{tip} redirectTo 方法优先于 redirectTo 属性。
2.2 自定义用户名
Laravel 默认使用 email 字段来认证。如果你想用其他字段认证,可以在 LoginController 里面定义一个 username 方法:
public function username()
{
return 'username';
}
2.3 自定义看守器
你还可以自定义用于认证和注册用户的「看守器」。要实现这一功能,需要在 LoginController、RegisterController 和 ResetPasswordController 中定义 guard 方法。该方法需要返回一个看守器实例:
use Illuminate\Support\Facades\Auth;
protected function guard()
{
return Auth::guard('guard-name');
}
2.4 自定义验证/存储
要修改新用户在应用注册时所需的表单字段,或者自定义如何将新用户存储到数据库中,你可以修改 RegisterController 类。该类负责验证和创建应用的新用户。
RegisterController 的 validator 方法包含了应用验证新用户的规则,你可以按需要自定义该方法。
RegisterController 的 create 方法负责使用 Eloquent ORM 在数据库中创建新的 App\User 记录。你可以根据数据库的需要自定义该方法。
2.5 Auth::xx()
你可以通过 Auth facade 来访问认证的用户:
use Illuminate\Support\Facades\Auth;
// 获取当前已认证的用户...
$user = Auth::user();
// 获取当前已认证的用户 ID...
$id = Auth::id();
//是否认证
Auth::check()
2.6 保护路由
路由中间件 用于只允许通过认证的用户访问指定的路由。Laravel 自带了在 Illuminate\Auth\Middleware\Authenticate 中定义的 auth 中间件。由于这个中间件已经在 HTTP 内核中注册,所以只需要将中间件附加到路由定义中:
Route::get('profile', function () {
// 只有认证过的用户可以...
})->middleware('auth');
当然,如果使用 控制器,则可以在构造器中调用 middleware 方法来代替在路由中直接定义:
public function __construct()
{
$this->middleware('auth');
}
2.7 指定看守器
将 auth 中间件添加到路由时,还需要指定使用哪个看守器来认证用户。指定的看守器对应配置文件 auth.php 中 guards 数组的某个键:
public function __construct()
{
$this->middleware('auth:api');
}
3 手动认证用户
3.1 不使用Controllers\Auth里面的控制器,自己直接调用认证类进行用户验证
<?php
namespace App\Http\Controllers;
use Illuminate\Support\Facades\Auth;
class LoginController extends Controller
{
/**
* 处理身份认证尝试.
*
* @return Response
*/
public function authenticate()
{
if (Auth::attempt(['email' => $email, 'password' => $password])) {
// 认证通过...
return redirect()->intended('dashboard');
}
}
}
- attempt 方法会接受一个键值对数组作为其第一个参数。这个数组的值将用来在数据库表中查找用户,如果匹配则返回true,否则返回false
- 重定向器上的 intended 方法将重定向到用户尝试访问的 URL。如果该 URL 无效,会给该方法传递回退 URI。
3.2 指定额外条件
除了用户的电子邮件和密码之外,你还可以向身份验证查询添加额外的条件。例如,我们可能会验证用户是否被标记为「活动」状态:
if (Auth::attempt(['email' => $email, 'password' => $password, 'active' => 1])) {
// 用户处于活动状态,不被暂停,并且存在。
}
3.3 访问指定的看守器实例
可以通过 Auth facade 的 guard 方法来指定要使用哪个看守器实例。这允许你使用完全独立的可认证模型或用户表来管理应用的抽离出来的身份验证。
传递给 guard 方法的看守器名称应该与 auth.php 配置文件中 guards 中的其中一个值相对应:
if (Auth::guard('admin')->attempt($credentials)) {
//
}
3.4 注销用户
要让用户从应用中注销,可以在 Auth facade 上使用 logout 方法。这会清除用户会话中的身份验证信息:
Auth::logout();
3.5 记住用户
如果你想要在应用中提供「记住我」的功能 , 则可以传递一个布尔值作为 attempt 方法的第二个参数,这会使在用户手动注销前一直保持已验证状态。当然,users 数据表必须包含 remember_token 字段,这是用来保存「记住我」的令牌。
if (Auth::attempt(['email' => $email, 'password' => $password], $remember)) {
// 这个用户被记住了...
}
{tip} 如果你使用 Laravel 内置的 LoginController,则「记住」用户的逻辑已经由控制器使用的 traits 来实现。
如果你「记住」用户,可以使用 viaRemember 方法来检查这个用户是否使用「记住我」 cookie 进行认证:
if (Auth::viaRemember()) {
//
}
3.6其它认证方法
- 验证用户实例
如果需要将现有用户实例记录到应用,可以使用用户实例调用 login 方法。给定的对象必须实现了 Illuminate\Contracts\Auth\Authenticatable 契约 。当然,Laravel 自带的 App\User 模型已经实现了这个接口:
Auth::login($user);
// 登录并且「记住」给定用户...
Auth::login($user, true);
当然,你也可以指定要使用的看守器实例:
Auth::guard('admin')->login($user);
- 通过 ID 验证用户
你可以使用 loginUsingId 方法通过其 ID 将用户记录到应用中。这个方法只接受要验证的用户的主键:
Auth::loginUsingId(1);
//登录并且「记住」给定的用户...
Auth::loginUsingId(1, true);
- 仅验证用户一次
你可以使用 once 方法将用户记录到单个请求的应用中。不会使用任何会话或 cookies, 这个对于构建无状态的 API 非常的有用:
if (Auth::once($credentials)) {
//
}
laravel5.5用户认证的更多相关文章
- laravel5.5用户认证源码分析
目录 1. 生成相关文件和配置 2. 分析路由文件 3. 以登陆开始为例,分析auth到底是怎么工作的 3.1 分析登录文件 3.2 分析门面Auth. 1. 生成相关文件和配置 快速生成命令 php ...
- Nodejs之MEAN栈开发(八)---- 用户认证与会话管理详解
用户认证与会话管理基本上是每个网站必备的一个功能.在Asp.net下做的比较多,大体的思路都是先根据用户提供的用户名和密码到数据库找到用户信息,然后校验,校验成功之后记住用户的姓名和相关信息,这个信息 ...
- Django--自定义用户认证
Django自带的用户认证 以前都是用Django自带的用户认证,用户名字段一对一关系对应Django--User表(其实它也是继承了abstractbaseuser). 1 2 3 from dja ...
- linux(十二)___Apache服务器用户认证、虚拟主机的配置
创建xiangkejin zhangsan两个用户 可看见文件中创建的两个用户: 建立虚拟目录并配置用户认证 ①建立虚拟目录 /xiangkejin ②在Apache的主配置文件httpd.conf ...
- [django]用户认证中只允许登陆用户访问(网页安全问题)
当设计一个重要网页时,一般要求未从登陆界面访问的用户不能进入其他页面,那么需要如何设置呢? 如下 django中的url.py urlpatterns = [ url(r'^$', 'login ...
- 使用JDBC实现Oracle用户认证
两天时间写的小品,以前的J2EE环境基本使用框架.现在使用JDBC配合Oracle存储过程模拟了一下用户注册和用户认证. 一.添加必须的jar包 需要JDBC连接Oracle的包和shiro-core ...
- ldap实现用户认证
LDAP的用户认证类. public class LDAPHelper { private DirectoryEntry _objDirectoryEntry; /// <summary> ...
- auth用户认证库
关于auth库,建议如下:1. ion_auth,基于Redux重写而成,非常不错的认证库,国外用的很多,几个最新的ci2.0.2基础上的开源系统(如doveforum)都用它,支持ci 2.0和以上 ...
- 禅道PMS兼容redmine用户认证接口
项目地址:https://github.com/web3d/zentao-redmine-userauth zentao-redmine-userauth 做了一个基本的用户认证接口,兼容redmin ...
随机推荐
- C++ Eigen库和Matlab对比
// A simple quickref for Eigen. Add anything that's missing. // Main author: Keir Mierle #include &l ...
- Jmeter入门5 关联 响应数据传递-正则表达式提取器
在测试过程中,遇到一个问题:用户登录成功后服务器会返回一个登录凭证,之后所有的操作都需要带上此凭证.我们怎么获取登录凭证并传递给后续的操作? Jmeter提供了正则表达式提取器,用变量提取参数,后续通 ...
- 【PHP 模板引擎】Prototype 原型版发布!
在文章的开头,首先要向一直关注我的人说声抱歉!因为原本是打算在前端框架5.0发布之后,就立马完成 PHP 模板引擎的初版.但我没能做到,而且一直拖到了15年元旦才完成,有很严重的拖延症我很惭愧,再次抱 ...
- iOS开发:小技巧积累2
http://blog.sina.com.cn/s/articlelist_1935098904_1_1.html .获取全局的Delegate对象,这样我们可以调用这个对象里的方法和变量: [(My ...
- Codeforces Round #347 (Div.2)_B. Rebus
题目链接:http://codeforces.com/contest/664/problem/B B. Rebus time limit per test 1 second memory limit ...
- 在使用HTMLTestRunner时,报告为空,错误提示<_io.TextIOWrapper name='<stderr>' mode='w' encoding='utf_8'>
<_io.TextIOWrapper name='<stderr>' mode='w' encoding='utf_8'> Time Elapsed: 0:00:21.3163 ...
- ajax实现分页页签
在一些搜索列表的页面中,我们会遇到一些需要处理页签的需求,一般这样的页面,要么是在JSP中处理,每次都跳页.这样做是个很方便的方法.但是如果页面上有很多和列表无关,每次都需要重新渲染是不是显得慢了一些 ...
- Spring初始化Bean或销毁Bean前执行操作的方式
如果想在Spring初始化后,或者销毁前做某些操作,常用的设定方式有三种: 第一种:通过 在xml中定义init-method 和 destory-method方法 推荐使用,缺陷是只能在XML中使用 ...
- top小火箭
// my.js function $(id){return document.getElementById(id)};function show(obj){obj.style.display = & ...
- udp发送广播消息
import socket if __name__ == '__main__': # 创建udpsocket udp_socket = socket.socket(socket.AF_INET, so ...