方法 Illuminate\Auth\RequestGuard::attempt 不存在

Posted

技术标签:

【中文标题】方法 Illuminate\\Auth\\RequestGuard::attempt 不存在【英文标题】:Method Illuminate\Auth\RequestGuard::attempt does not exist方法 Illuminate\Auth\RequestGuard::attempt 不存在 【发布时间】:2018-08-08 03:44:09 【问题描述】:

我是 laravel 和 lumen 的新手。 我在 lumen 5.6 中使用 oauth2.0 创建了一个登录 api,我已经安装了护照并生成了令牌。 下面是我的登录控制器功能,它工作正常。它返回令牌。

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Route;
//use Illuminate\Support\Facades\DB;
use App\User;
use Auth;

public function login(Request $request)
        
            global $app;    
            $proxy = Request::create(
                '/oauth/token',
                'post',
                [
                    'grant_type'    =>  env('API_GRAND_TYPE'),
                    'client_id'     =>  env('API_CLIENT_ID'),
                    'client_secret' =>  env('API_CLIENT_SECRET'),
                    'username'      =>  $request->username,
                    'password'      =>  $request->password,
                ]

            );
            return $app->dispatch($proxy);
          

由于除了用户名和密码之外,我还必须检查用户状态,因此我需要先检查用户凭据。所以我喜欢这个。

public function login(Request $request)


    $credentials = $request->only('username', 'password');

    if (Auth::attempt($credentials)) 
        return ['result' => 'ok'];
    

    return ['result' => 'not ok'];


Here i am getting this error.
Method Illuminate\Auth\RequestGuard::attempt does not exist.

So i tried Auth::check instead of Auth::attempt.
Now there is no error but it always return false even though the credentials are valid.

I searched a lot for a solution but i didn't get.

【问题讨论】:

任何解决方案...? 【参考方案1】:

功能守卫仅适用于带有网络中间件的路由

public function login() 

  if(Auth::guard('web')->attempt(['email' => $email, 'password' => $password], false, false)) requests
     // good
   else 
    // invalid credentials, act accordingly
 

【讨论】:

问题是像 spatie/laravel-permission 这样的包函数在 api 上工作,所以我认为我们应该将 api 和 web 混合用于 RESTFUL 应用程序 注意:使用@Samuel Dervis 解决方案时,不要忘记从'middleware' => 'auth: api' 删除您的登录路径,如果它在里面。守卫方法也接受api参数,为Auth::guard('api'),但我目前在使用时遇到了困难。 在我的例子中,我的控制器类被命名为Auth。所以我必须为Illuminate\Support\Facades\Auth 创建一个别名。 救命,谢谢,我刚刚用它创建了一个新方法,以避免损坏我当前使用的 api auth 方法,并且像一个魅力一样工作【参考方案2】:

将默认保护更改为“web”解决了我的问题。

配置/auth.php

'defaults' => [
        'guard' => 'web',
        'passwords' => 'users',
    ],

【讨论】:

这在使用多个守卫和一个包 laravel spatie 进行权限管理时会出现问题。

以上是关于方法 Illuminate\Auth\RequestGuard::attempt 不存在的主要内容,如果未能解决你的问题,请参考以下文章

init()方法和构造方法的区别

GroovyGroovy 扩展方法 ( 扩展静态方法示例 | 扩展实例方法示例 | 扩展实例方法与扩展静态方法代码相同 )

Python中静态方法和类方法的区别

类方法和实例方法

Java中的构造方法与普通方法的区别? 啥情况下用构造方法啥情况下用普通的方法

Python中静态方法和类方法的区别