zoukankan      html  css  js  c++  java
  • 【laravel】用户认证之----手动认证用户

    模型

    如果某个模型类需要用于认证,必须继承自 IlluminateFoundationAuthUser 基类,否则会报错。然后在这个模型类中使用 Notifiable Trait,里面提供了用户发送通知的相关方法。配置 $hidden 属性,在返回查询结果的时候将敏感信息过滤掉,避免安全隐患。

    <?php
    
    namespace AppModels;
    
    use IlluminateFoundationAuthUser;
    use IlluminateNotificationsNotifiable;
    
    class Manager extends User
    {
        use Notifiable;
    
        protected $hidden = ['password', 'remember_token'];
    }

    手动认证:attempt

    public function login(Request $request)
    {
        $rs = Auth::guard('admin')->attempt($request->only(['email', 'password']));
        if ($rs) {
            return redirect()->intended('dashboard');
        }
    }

    attempt 方法接受一个键值对数组作为其第一个参数。数组中的值将被用于在数据表中查找用户。所以,在上例中,用户将通过 email 字段的值进行检索。如果找到了这个用户,数据库中保存的哈希密码将被用来与传递给方法的数组中 password 的哈希值进行比较。你不应该将指定为密码的 password 的值进行哈希操作,因为框架将在比较前,自动对其进行hash操作。如果这两个哈希密码匹配,就会为用户开启一个已认证的会话。

    如果认证成功那么 attempt 方法将返回 true。反之,会返回 false 。

    重定向器上的 intended 方法将重定向用户到他们曾经希望访问的 URL,这个 URL 之前被用户认证中间件拦截了。可以给这个方法传递一个回退 URI,用于预期的地址不可用的情况。

    记住用户

    如果想在应用中提供「记住我」的功能 ,你可以给 attempt 方法的第二个参数传入一个布尔值,这将永久保持用户的认证状态,或者直到他们手动注销登录。当然,你的用户表必须包含名为 remember_token 的字符串字段,它将被用于保存「记住我」的令牌。

    if (Auth::attempt(['email' => $email, 'password' => $password], $remember)) {
        // 这个用户被记住了...
    }

    如果你启用了「记住」用户,你可以使用 viaRemember 方法确定用户是否正使用「记住我」的cookie令牌进行的认证 

    if (Auth::viaRemember()) {
        //
    }

    注销登录

    要将用户从应用中注销,你可以使用 Auth 门面上的 logout 方法。这将清除用户会话中的认证信息:

    Auth::logout();

    其它认证方式

    通过用户实例登入应用

    如果你需要把现存的用户实例登入应用, 你可以调用 login 方法并附带用户实例作为参数。给定的这个对象必须实现 IlluminateContractsAuthAuthenticatable 契约,或者继承自IlluminateFoundationAuthUser基类。

    Auth::login($user);
    
    // 登录并且「记住」给定的用户...
    Auth::login($user, true);

    通过 ID 验证用户

    要使用用户的 ID 登录应用,你可以使用 loginUsingId 方法。这个方法接受需要认证的用户主键:

    Auth::loginUsingId(1);
    
    // 登录并且「记住」给定的用户...
    Auth::loginUsingId(1, true);

    仅验证用户一次

    你可以在单次请求中使用 once 方法将用户登录到应用中。这将不会使用任何 Session 或者 Cookie,这意味着在构建无状态API时,此方法可能会有所帮助:

    if (Auth::once($credentials)) {
        //
    }

    让其它设备上的 Session 失效

    Laravel 还提供了一种机制,用于将其它设备上的用户 Session 失效和「注销」,而不会使其当前设备上的 Session 失效。首先,你需要保证IlluminateSessionMiddlewareAuthenticateSession 中间件在你的app/Http/Kernel.php类中的 web 中间件组中,并且没有被注释掉:

    'web' => [
        // ...
        IlluminateSessionMiddlewareAuthenticateSession::class,
        // ...
    ],

    然后, 你就可以使用 Auth 门面上的 logoutOtherDevices 方法。此方法要求用户提供其当前密码,你的应用程序应通过输入表单接受该密码:

    use IlluminateSupportFacadesAuth;
    
    Auth::logoutOtherDevices($password);

     参考文档

    官方文档:https://learnku.com/docs/laravel/5.7/authentication/2269#08b509

    laravel学院:https://laravelacademy.org/post/9733.html

  • 相关阅读:
    C#转义字符,以及@的作用
    建立数据库链接 create database link以及synonym
    Oracle11g密码区分大小写导致database link无法连接
    ES5:深入解析如何js定义类或对象。
    jQuery.extend()、jQuery.fn.extend()扩展方法示例详解
    浅析JavaScript访问对象属性和方法及区别
    Angular ui-router的常用配置参数详解
    Angular 通过constant(name,value),value(name,value)创建服务
    Angular ocLazyLoad 与ui-router的配合使用
    AngularJs指令配置参数scope详解
  • 原文地址:https://www.cnblogs.com/jxl1996/p/10352395.html
Copyright © 2011-2022 走看看