美文网首页
Laravel 6 内置 web 认证

Laravel 6 内置 web 认证

作者: Leonzai | 来源:发表于2019-11-12 15:04 被阅读0次

    交流群 375462817
    视频教程 https://space.bilibili.com/476513143

    原理

    原理

    1. 注册:用户注册成功后。在服务器端生成 session 文件。给用户传递 session (文件名)。
    2. 登陆:用户使用账号密码登陆成功。在服务器端生成 session 文件。给用户传递 session (文件名)。
    3. 认证:将用户传来的 session 作为文件名去查找文件,找到了就认证成功,否则失败。

    准备

    composer create-project --prefer-dist laravel/laravel laravel6
    下载 node   https://nodejs.org/en/
    composer require laravel/ui
    php artisan ui vue --auth
    npm install cnpm -g --registry=https://registry.npm.taobao.org
    cnpm install
    cnpm run prod
    php artisan migrate
    访问 http://your-app.dev/register
    
    如果不需要注册,可以路由中指定下,Auth::routes(['register' => false]);。
    

    使用

    修改跳转地址

    // LoginController,  RegisterController, ResetPasswordController, ConfirmPasswordController and  VerificationController
    protected $redirectTo = '/';
    
    # 方法的优先级高于属性定义
    protected function redirectTo()
    {
        // 可以写一些逻辑
        return '/path';
        // return route('login');
    }
    

    认证字段修改

    public function username(){
        return 'name';  // 默认 email
    }
    
    // $request->validate([
    //     $this->username() => 'required|string',
    //     'password' => 'required|string',
    // ]);
    

    获取登陆后的信息

    $user = Auth::user();
    $id = Auth::id();
    if (Auth::check()) // 最好使用中间件!
    
    $request->user()   // use \Illuminate\Http\Request;
    

    添加认证条件

    Route::get('profile', function () {
        // Only authenticated users may enter...
    })->middleware('auth');
    
    public function __construct()
    {
        $this->middleware('auth');
    }
    
    
    Route::get('/settings/security', function () {
        // Users must confirm their password before continuing...
    })->middleware('password.confirm');
    

    如果登录失败次数过多,会禁止登录一段时间。默认五次。禁止登陆一分钟。
    判断的标准是 username 方法返回值和 ip 。

    登出

    Auth::logout();

    过期时间

    // 默认过期时间是 env('SESSION_LIFETIME', 120);    120 分钟从最后一次访问服务器开始算。
    // 'expire_on_close' => false                     如果是 true,关闭浏览器就过期
    

    手动认证用户

    # 当你不喜欢自带的控制器去认证用户,你可以移除这些控制器,
    # 引入 Auth facade,利用 attempt 手动认证
    class LoginController extends Controller
    {
        public function authenticate(Request $request)
        {
            $credentials = $request->only('email', 'password');
    
            if (Auth::attempt($credentials)) {
                // Authentication passed...
                return redirect('/some/url');
            }
        }
    }
    
    // Route::post('/authenticate', 'Auth\LoginController@authenticate')->name('authenticate');
    
    if (Auth::attempt(['email' => $email, 'password' => $password, 'active' => 1])) {
        // 字段 active 必须是 1
    }
    

    记住用户 (无限期)

    # $remember 是个 bool 值
    if (Auth::attempt(['email' => $email, 'password' => $password], $remember)) {
        // The user is being remembered... 内置的 LoginController 已经实现 remember
    }
    
    Auth::login($user);
    Auth::login($user, true);  // 记住用户 (无限期)
    Auth::loginUsingId(1);
    Auth::loginUsingId(1, true);
    
    Auth::once($credentials); // 临时认证,无状态的。
    

    无登录页面, 利用弹窗请求认证用户

    Route::get('profile', function(){
        // ...
    })->middleware('auth.basic');
    

    单设备登录

    // 取消登陆在别的设备上的认证
    // 取消注释:\Illuminate\Session\Middleware\AuthenticateSession::class,
    Auth::logoutOtherDevices($password);
    

    相关文章

      网友评论

          本文标题:Laravel 6 内置 web 认证

          本文链接:https://www.haomeiwen.com/subject/zrcqictx.html