laravel 5入门系列——7

向laravel 5进军——7

会话

由于Http协议是一个无状态的协议,因此为在不同页面保持用户的登陆状态,我们需要借助会话在浏览器中临时存储用户的身份信息,保证用户在不同页面具有相同的登录状态。


实现登陆以及退出功能

首先创建会话控制器,然后添加路由

php artisan make:controller SessionController
Route::get('login','SessionsController@login')->name('login');
Route::post('login', 'SessionsController@store')->name('login');
Route::delete('logout', 'SessionsController@destroy')->name('logout');

其中GET方法的login返回登陆页面,POST方法的login提交登陆信息,DELETE方法的logout退出登录.
补充一条开发环境中检测已经配置好的路由的命令php artisan route:list
现在应反回以下信息

+--------+-----------+-------------------+---------------+-------------------------------------------------+--------------+
| Domain | Method    | URI               | Name          | Action                                          | Middleware   |
+--------+-----------+-------------------+---------------+-------------------------------------------------+--------------+
|        | GET|HEAD  | /                 |               | App\Http\Controllers\HomePageController@home    | web          |
|        | GET|HEAD  | api/user          |               | Closure                                         | api,auth:api |
|        | GET|HEAD  | login             | login         | App\Http\Controllers\SessionsController@login   | web          |
|        | POST      | login             | login         | App\Http\Controllers\SessionsController@store   | web          |
|        | DELETE    | logout            | logout        | App\Http\Controllers\SessionsController@destroy | web          |
|        | GET|HEAD  | signup            | signup        | App\Http\Controllers\UserController@signup      | web          |
|        | GET|HEAD  | users             | users.index   | App\Http\Controllers\UserController@index       | web          |
|        | POST      | users             | users.store   | App\Http\Controllers\UserController@store       | web          |
|        | GET|HEAD  | users/create      | users.create  | App\Http\Controllers\UserController@create      | web          |
|        | GET|HEAD  | users/{user}      | users.show    | App\Http\Controllers\UserController@show        | web          |
|        | PUT|PATCH | users/{user}      | users.update  | App\Http\Controllers\UserController@update      | web          |
|        | DELETE    | users/{user}      | users.destroy | App\Http\Controllers\UserController@destroy     | web          |
|        | GET|HEAD  | users/{user}/edit | users.edit    | App\Http\Controllers\UserController@edit        | web          |
+--------+-----------+-------------------+---------------+-------------------------------------------------+--------------+

写好路由后写会话控制器的方法:
create方法直接返回登陆的界面,store方法要验证是否符合数据库中的数据,delete方法要退出登录的状态.借助 Laravel 提供的 Authattempt方法可以让我们很方便的完成用户的身份认证操作,使用方法:

if (Auth::attempt(['email' => $email, 'password' => $password])) {
    // 该用户存在于数据库,且邮箱和密码相符合
}

会话在创建的同时,也会种下一个名为 laravel_session 的 HTTP Cookie,以此 Cookie 来记录用户登录状态,最终返回 true;如果匹配后两个值不一致,则返回 false;如果用户未找到,也返回 false。引用Auth前记得对其引用.

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Auth;

class SessionsController extends Controller
{
    public function login()
    {
        return view('login');
    }

     public function store(Request $request)
    {
       $credentials = $this->validate($request, [
           'email' => 'required|email|max:255',
           'password' => 'required'
       ]);

       if (Auth::attempt($credentials)) {
           session()->flash('success', '欢迎回来!');
           return redirect()->route('users.show', [Auth::user()]);
       } else {
           session()->flash('danger', '很抱歉,您的邮箱和密码不匹配');
           return redirect()->back();
       }
    }

    public function destroy(){
           Auth::logout();
           session()->flash('success','退出成功!');
           return redirect('login');
    }
}

使用 session() 方法来访问会话实例。而当我们想存入一条缓存的数据,让它只在下一次的请求内有效时,则可以使用 flash 方法。flash 方法接收两个参数,第一个为会话的键,第二个为会话的值,我们可以通过下面这行代码的为会话赋值。redirect()->back();即返回了原页面.session()调用内容可以写成:
session()->get('success');此时会返回 欢迎回来!
值得注意的是,登陆的users.show路由是需要传参的,这里用到了Auth的Auth::user()方法,很方便.


延长session时长

如果用户登录后没有使用『记住我』功能,则登录状态默认只会被记住两个小时。如果使用了『记住我』功能,则登录状态会被延长到五年。使用 Laravel 提供的『记住我』功能来保存一个记忆令牌,用于长时间记录用户登录的状态。而 Laravel 已默认为用户生成的迁移文件中已经包含了 remember_token 字段,该字段将用于保存『记住我』令牌。

只需要将Attempt方法传入第二个参数,即可开启记住我的功能.

if (Auth::attempt($credentials, $request->has('remember'))) {
           session()->flash('success', '欢迎回来!');
           return redirect()->route('users.show', [Auth::user()]);
       } else {
           session()->flash('danger', '很抱歉,您的邮箱和密码不匹配');
           return redirect()->back();
       }

这里需要配合前端的视图中表单添加一项remember的选项:

<div class="checkbox">
    <label><input type="checkbox" name="remember"> 记住我</label>
</div>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值