Laravel技巧库

用户注册、登录和退出

此课程是收费课程,请先购买或加入会员后再访问。

实现用户登陆注册

在其他的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中的AuthLoginControllerRegisterController,修改$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~


现在就注册ITFun.tv会员
持续关注IT界最新技术,随时更新相关课程。在线学习IT课程或直接报名参加线下武汉PHP、Web前端培训。

仅仅30秒钟就可以简单注册

会员注册(免费)
×