原文:https://qianjinyike.com/laravel-%E5%86%85%E7%BD%AE-web-%E8%AE%A4%E8%AF%81/
- 什么是web认证
用户注册成功(登陆成功)后。在服务器端生成 session 文件,并返回session文件名存入客户端cookie中。
用户带着cookie中的session文件名去服务器端中查找session文件,找到了就认证成功,否则失败
- 准备工作
生成Laravel默认登陆验证功能,请参考:
Laravel默认登陆验证功能
PS:如果不需要注册功能,可以路由中指定Auth::routes([‘register’ => false]);。
- 重定向
在以下控制器内,如果定义了重定向方法或者属性,则会自动重定向
// LoginController, RegisterController, ResetPasswordController, ConfirmPasswordController and VerificationController
protected $redirectTo = '/';
# 方法的优先级高于属性定义
protected function redirectTo()
{
// 可以写一些逻辑
return '/path';
// return route('login');
}
- 修改验证方式
// app/Http/Controllers/Auth/LoginController.php追加
public function username(){
return 'name'; // 默认 email
}
- 添加登陆认证
在路由中增加Auth认证的中间件
Route::get('profile', function () {
return '1234';
})->middleware('auth');
在构造函数中增加中间件
public function __construct()
{
$this->middleware('auth')->except('create', 'delete');
$this->middleware('auth')->only('create');
}
- 获取登陆信息和登出
$user = Auth::user();
$id = Auth::id();
$request->user()
if (Auth::check()) // 判断是否登录
Auth::logout();
- 手动覆写登录方法
# 当你不喜欢自带的控制器去认证用户,你可以移除这些控制器,
# 引入 Auth facade,利用 attempt 手动认证
class LoginController extends Controller
{
public function authenticate(Request $request)
{
$request->validate([
'email' => 'required|email',
'password' => 'required|min:5'
]);
if (\Auth::attempt(['email' => $request->email, 'password' => $request->password])) {
session()->flash('success', '登陆成功');
return redirect()->route('home');
} else {
session()->flash('danger', '登陆失败');
return back();
}
}
}
attempt例子中,第一个数组代表要验证字段,第二个字段代表是否记住用户(session永不过期,一直处于登录状态)
if (Auth::attempt(['email' => $email, 'password' => $password], $remember)) {
// The user is being remembered... 内置的 LoginController 已经实现 remember
// $remember的值为bool
}
- 单设备登录
// 取消登陆在别的设备上的认证
// app/Http/Kernel.php中取消注释:\Illuminate\Session\Middleware\AuthenticateSession::class,
// $password为登录密码,执行这段语句后,将会踢掉正在登录的同一账户
Auth::logoutOtherDevices($password);