【问题标题】:Laravel manual authentication: Auth::attempt always falseLaravel 手动身份验证:Auth::attempt 始终为 false
【发布时间】:2016-05-17 06:32:51
【问题描述】:

我正在使用 laravel 手动身份验证系统。提交表单重定向到如下所示的此路由。并且在 authenticate() 函数中,名称和密码永远不会与我之前存储的匹配。即Auth::attempt 始终为假。

 Route::post('/logintest', 'mycontroller@authenticate');
    Route::get('/home', ['middleware' => 'auth', function() {
  echo "home page";});
}]);

认证功能:

public function authenticate(Request $request)
         {
            $input=$request->all();
            $password=$input['password'];
            $name=$input['name'];

            if (Auth::attempt(['Name' => $name, 'Password' => $password]) ){
            return redirect()->intended('/home');
        }   else 
          {
                return redirect('/login')->with('message','Error logging in!');
            }
        }

我以这种方式注册了用户。密码使用 bcrypt() 进行哈希处理。功能。但是在 authenticate() 函数中,我正在与普通密码进行比较。我在某处读到Auth 会自动处理它。或者我是否应该在 config/auth.php 中更改某些内容,因为我使用名称而不是用户名进行身份验证?

public function register(Request $request)
{
    $input=$request->all();
    $password=bcrypt($input['password']);
    $name=$input['name'];
    $insert= User::insert(['Name'=>$name,'Password'=>$password]);
    return redirect('/login')
            ->with('message','successfully Registered.');
}

【问题讨论】:

  • 你能给我们看看路由文件吗?
  • @VipindasKS 我已经在顶部展示了它们。
  • 这是唯一定义的路线。只是想确保它不与任何其他路线冲突。特别是,如果你之前做过 php artisan make:auth。
  • 我们可以看看你的用户表迁移文件吗?

标签: php laravel laravel-5


【解决方案1】:

名称有问题。 Auth@attempt 获取所有这些凭据,除了 password(区分大小写),您传入该数组并运行 where 查询(这是您可以向尝试添加额外约束的方式,因为它们只是 where 条件)。如果它找到一个模型,它将对您传递的password 凭据(区分大小写)和从$model->getAuthPassword() 获取的模型的哈希密码进行哈希检查。

凭证中的这个字段是一个特殊的字段,因为它是 Auth 需要的,因此它知道凭证中的哪个字段是密码。它与您在users 表中使用的字段没有直接关联,并且必须在凭据数组中命名为password。除了“密码”之外,您传递的凭据中的其他字段确实与用户表上的字段直接相关,因为它们是对该表进行数据库查询的条件。

如果您使用表格上的“密码”以外的字段作为密码,则必须在用户模型中声明。在您的情况下,您使用的是“密码”。 (这都是区分大小写的)

class User ....
{
    ...
    public function getAuthPassword()
    {
        return $this->Password; // case sensitive
    }
    ...
}

传递凭据时,您传递的是纯文本密码,因为会发生hash_check,而不是直接比较。

您可以在实际表格中随意命名字段,您只需让 Eloquent 意识到这一点。

【讨论】:

    【解决方案2】:

    检查下面的代码

    public function authenticate(Request $request)
    {
         $password = $request->input('password');
         $name = $request->input('name');
    
         if (Auth::attempt(['name' => $name, 'password' => $password]) )
         {
              return redirect()->intended('/home');
         }   
         else 
         {
              return view('login')->withErrors('Error logging in!');
         }
     }
    

    【讨论】:

    • 发现Auth::attempt是假的,因为密码错误。我在注册用户时使用了 bcrypt() 。 $password=bcrypt($input['password']);这里怎么使用?
    • $password = Input::get('password'); $hashed = Hash::make($password);
    • 可以在这里写代码吗?我不知道你是做什么的
    • 代码在哪里?你上传刀片和控制器文件吗?您说:“我使用名称而不是用户名进行身份验证”--> 您可以上传项目或必要的配置和文件吗?您在哪里保存 vendor/laravel/framework/src/Illuminate/Foundation/Auth/AuthenticatesAndRegistersUsers.php 文件的副本?
    【解决方案3】:

    你应该用小写字母写密码的p字符。

    替换,

    Auth::attempt(['Name' => $name, 'Password' => $password])
    

    Auth::attempt(['Name' => $name, 'password' => $password]) // 'p' is in small letter here.
    

    也检查一下link

    【讨论】:

      【解决方案4】:

      当您使用姓名而不是电子邮件(默认)作为用户名进行身份验证时。您应该在 AuthController 中添加 $username 属性。

      ....
      
      class AuthController extends Controller
      {
      
      
      use AuthenticatesAndRegistersUsers, ThrottlesLogins;
      
      /**
       * Override the input name 'email'
       * Change it as the name on blade
       *
       * @var string $username
       */
      protected $username = 'Name';
      
      ....
      }
      

      或者,您可以从 Illuminate\Foundation\Auth\AuthenticatesUsers trait 覆盖 loginUsername() 方法。

      ....
      
      class AuthController extends Controller
      {
      
      
      use AuthenticatesAndRegistersUsers, ThrottlesLogins;
      
      /**
       * Get the login username to be used by the controller.
       *
       * @return string
       */
      public function loginUsername()
      {
          return 'Name';
      }
      
      ....
      }
      

      正如其他人所说,案件很重要。然后,您需要在 User 模型上从 Illuminate\Auth\Authenticatable 特征覆盖 getAuthPassword() 方法

      ....
      
      class User extends Authenticatable
      {
      
      ....
      
          /**
           * Get the password for the user.
           *
           * @return string
           */
          public function getAuthPassword()
          {
              return $this->Password;
          }
      }
      

      【讨论】:

      • 他们没有使用 AuthController,如果他们使用了,他们会绕过所有这些,因为他们代码中的 attempt 方法是手写的。
      【解决方案5】:

      一切似乎都是正确的。

      users 表中的列名是什么?

      名称区分大小写。因此,请确保它们确实是 NamePassword 而不是 namepassword

      【讨论】:

      • public function authenticate(Request $request) 中尝试将$password=$input['password']; 更改为$password=bcrypt($input['password']);
      【解决方案6】:
      Route::group(['middleware' => ['web']], function () {
          Route::post('/logintest', 'mycontroller@authenticate'); 
      });
      
      1. 如果您使用的是版本 5 或 5.2,请检查 Routes.php 中的上述更改

      2. 确保您的用户表字段名称为“名称”和“密码”,否则更新它。

      3. 检查Password 字段的字段长度(在您的数据库中,users 表)。它应该包含一个冗长的散列密码,例如 $2y$10$eM.kmjTwEIykhNUqMsNzMud0E6eO6RUYAzTqirrbozY1zdhVwQmsC 至少,(varchar(60))

      如果您能向我们展示用户表架构会更好

      1. 最后,确保您输入的密码正确(因为我在您的代码中看不到太多错误)

      【讨论】:

      • 你能展示一下'users'表的表结构吗?
      • 是的。我将“密码”更改为“密码”,它突然起作用了。感谢您的努力。
      【解决方案7】:

      为什么不使用命令php artisan make:auth?它会满足您的一切需求。

      【讨论】:

        【解决方案8】:

        如果您想使用 Name 作为唯一的用户名和密码 fiendname 作为 Password

        你可以这样做..

        在你的 AuthController 中添加这个方法

        public function loginUsername()
        {
            return 'Name';
        }
        

        并在您的用户模型中添加此方法

        public function getAuthPassword()
        {
            return $this->Password; 
        }
        

        希望这会奏效。

        【讨论】:

        • 他们没有使用默认的 AuthController。
        【解决方案9】:

        尝试在此行中切换到小写索引:

        //...
        if (Auth::attempt(['Name' => $name, 'Password' => $password]) ) {
        //...
        

        //...
        if (Auth::attempt(['name' => $name, 'password' => $password]) ) {
        //...
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2013-11-28
          • 2020-07-25
          • 2014-05-22
          • 1970-01-01
          • 2017-11-01
          • 1970-01-01
          • 2017-05-11
          相关资源
          最近更新 更多