在其他的 PHP 框架中,如果要实现登陆注册、表单验证、记住密码、多次登陆锁定账户、发邮件重置密码这一系列功能,这是一个非常繁琐的事情,就算是非常有经验的老手,实现起来也需要花费不少功夫,想想都很头疼。
那么这些功能,在 laravel 中实现,需要多久呢?是一星期、一天、还是一小时呢?正确的答案是1秒钟
。
相关文档 https://laravel.com/docs/5.5/authentication
打开命令行,输入
php artisan make:auth
出现有一个提示,说我们布局模板已经有了,是否还要重新创建一个?默认是no
,那么我们直接按回车
就好了,不然就会把我们自己做的布局覆盖掉了。
The [layouts/app.blade.php] view already exists. Do you want to replace it? (yes/no) [no]:
好了,恭喜你,登录注册所有的一切功能你已经做完了。好,我们这一集就到这里。O(∩_∩) O 哈哈~
等等。。。这真的就做完了吗?这是绝对是真的。猜到你还是一脸懵逼的样子,就这么结束了,我实在于心不忍啊,那我还是来说一下刚才到底实现了什么吧。
先来php artisan route:list
看一下路由,咦,居然自己多出来一堆跟登录注册相关的路由。
再到 routes/web.php
中看一下,自动被添加上了Auth::routes()
这么一条路由。可想而知,这一条路由的作用就是为了生成登录注册相关的一系列路由。
那么我们先来访问一下/login
,看看这个登录是怎么回事。浏览器中出现一个表单,看来这就是登录的地方了。
但是我们现在数据库中还没有用户,所以接着去访问一下/register
。
出来一个注册用户的表单,好,我们来填写一下看看。这里的邮件地址一定要填写一个真实可用的邮件地址,不然后面做到找回密码功能就不好处理了。
You are logged in!
提示,你已经登录了。这是不是说明,刚才我们填写的信息已经存入数据库,并自动实现了登录呢?
打开数据库的users
表,发现我们刚才填写的数据,确实已经注册进去了,而且密码也自动做了加密。
这时候,我们再重新访问/register
或者/login
,发现都自动跳转到了/home
。这是因为当前用户已经登录, 所以不能再重复的登录注册了。
看来确实是这么回事啊,这就说明 laravel 的登录注册功能,确确实实已经可以用了啊。
来实现一点小功能,用户登录后,右上角的登录注册按钮,应该显示成当前登录
用户的信息,并且添加退出
功能。
在app.blade.php
布局模板中,将整块登录注册
按钮部分的代码,替换成
@if (Auth::guest())
<div class="am-topbar-right">
<a href="{{route('login')}}" class="am-btn am-btn-secondary am-topbar-btn am-btn-sm">
<span class="am-icon-user"></span> Login
</a>
</div>
<div class="am-topbar-right">
<a href="{{route('register')}}" class="am-btn am-btn-primary am-topbar-btn am-btn-sm">
<span class="am-icon-pencil"></span> Sign Up
</a>
</div>
@else
<div class="am-collapse am-topbar-collapse" id="topbar-collapse">
<ul class="am-nav am-nav-pills am-topbar-nav am-topbar-right admin-header-list">
<li class="am-dropdown" data-am-dropdown>
<a class="am-btn-secondary am-dropdown-toggle" data-am-dropdown-toggle href="javascript:;">
<span class="am-icon-user"></span> {{Auth::user()->name}}
<span class="am-icon-caret-down"></span>
</a>
<ul class="am-dropdown-content">
<li>
<a href="{{ url('/logout') }}" onclick="event.preventDefault(); document.getElementById('logout-form').submit();">
<span class="am-icon-power-off"></span> 退出
</a>
<form id="logout-form" action="{{ url('/logout') }}" method="POST" style="display: none;">
{{ csrf_field() }}
</form>
</li>
</ul>
</li>
</ul>
</div>
@endif
样式有点奇怪,那么就去common.css
中,第九行
处,添加这样的css
代码
.am-nav > li.am-dropdown > a:focus, .am-nav > li.am-dropdown > a:hover {
background-color: teal;
}
.am-dropdown.am-active .am-btn-secondary.am-dropdown-toggle {
background-color: teal;
}
.am-topbar .am-topbar-right .am-dropdown-content a {
color: teal;
}
刷新,现在好看多了。
登陆或者注册后,都是跳转到了/home
这个页面,但实际上,我根本不需要这么个页面。我们希望登陆或者注册成功后,都跳转到首页。
那就找到App/Http/Controllers中的
AuthLoginController和
RegisterController,修改
$redirectTo`为
protected $redirectTo = '/';
路由中,自动生成
Route::get('/home', 'HomeController@index')->name('home');
也可以直接删掉了。
退出后,我们故意输入错误的密码,当错误5次
后,就会提示
Too many login attempts. Please try again in 50 seconds.
尝试的错误太多了,要 50 秒后再试。这时候,就算输入的是正确密码,那也是无法正常登陆的。
如果你希望修改下错误的次数和禁止登陆的时间。那么可以到 AuthLoginController
中,添加这样的属性
//错误3次后
protected $maxAttempts = '3';
//禁止登陆1个小时
protected $decayMinutes = '60';
这时候如果你错误3次
,就真的会让你1个小时
后再登录了。那你现在可以先去泡一杯咖啡,先去休息 1 小时,再来学习后面的课程了。
如果你实在等不了1个小时
,那好吧。。。找到 storage/framework/cache/data
目录,将里面的缓存文件直接删掉就好了。注意,千万不要删除错了,如果把storage/framework/cache/data
这些 laravel 自带文件夹删掉了,laravel
会无法运行的。
再来登录,ok 了。
最后来总结下今天课程的内容,在 laravel 中实现登陆注册,就是这么的简单,一条php artisan make:auth
命令就会实现所有的功能。
web.php
中也会自动的生成登陆注册对应的路由。
需要注意的是布局模板部分,这里需要好好看一下。
@if (Auth::guest())
这行代码的作用是,判断如果用户是 guest,也是没有登录,那就显示登陆
和注册
按钮。
@else
后面,就是登陆过后,就应该显示当前登陆的用户信息和退出按钮了。
退出
按钮部分的代码实现也有一些奇怪,这里为什么要有js
代码和一个隐藏表单
呢?这是因为路由中
Method | URI |
---|---|
POST | logout |
logout
对应的请求是post
,而一个普通的超链接是不好发送post请求
的。除此外,安全上要用的csrf token
也没法发送过去。
那么就可以做这样的一个超链接,但点击后,实际上却是提交了一个隐藏的表单。这就实现了,用一个超链接
来发送post请求
和传递csrf token
。
现在各方面看着都很好了,美中不足的是,表单的样式和我们项目整体风格不一致,提示的错误信息也还是英文的,这个我们后面的课程再一一解决。
好,这一集真的就到这里了。bye~
已添加到喜欢了