Laravel学习笔记(23)laravel6 认证与授权(web)

原文:https://qianjinyike.com/laravel-%E5%86%85%E7%BD%AE-web-%E8%AE%A4%E8%AF%81/

  1. 什么是web认证

用户注册成功(登陆成功)后。在服务器端生成 session 文件,并返回session文件名存入客户端cookie中。
用户带着cookie中的session文件名去服务器端中查找session文件,找到了就认证成功,否则失败

  1. 准备工作

生成Laravel默认登陆验证功能,请参考:
Laravel默认登陆验证功能

PS:如果不需要注册功能,可以路由中指定Auth::routes([‘register’ => false]);。

  1. 重定向

在以下控制器内,如果定义了重定向方法或者属性,则会自动重定向

// LoginController,  RegisterController, ResetPasswordController, ConfirmPasswordController and  VerificationController
protected $redirectTo = '/';

# 方法的优先级高于属性定义
protected function redirectTo()
{
    // 可以写一些逻辑
    return '/path';
    // return route('login');
}
  1. 修改验证方式
// app/Http/Controllers/Auth/LoginController.php追加
public function username(){
    return 'name';  // 默认 email
}
  1. 添加登陆认证

在路由中增加Auth认证的中间件

Route::get('profile', function () {
    return '1234';
})->middleware('auth');

在构造函数中增加中间件

public function __construct()
{
    $this->middleware('auth')->except('create', 'delete');

    $this->middleware('auth')->only('create');
}
  1. 获取登陆信息和登出
$user = Auth::user();
$id = Auth::id();
$request->user()

if (Auth::check())  // 判断是否登录

Auth::logout();
  1. 手动覆写登录方法
# 当你不喜欢自带的控制器去认证用户,你可以移除这些控制器,
# 引入 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
}
  1. 单设备登录
// 取消登陆在别的设备上的认证
// app/Http/Kernel.php中取消注释:\Illuminate\Session\Middleware\AuthenticateSession::class,
// $password为登录密码,执行这段语句后,将会踢掉正在登录的同一账户
Auth::logoutOtherDevices($password);
发布了40 篇原创文章 · 获赞 0 · 访问量 768

猜你喜欢

转载自blog.csdn.net/qj4865/article/details/104332600