向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 提供的 Auth
的attempt
方法可以让我们很方便的完成用户的身份认证操作,使用方法:
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>