Laravel手动身份验证:Auth::try总是false


Laravel manual authentication: Auth::attempt always false

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

 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中更改某些内容,因为我使用了name而不是username进行身份验证?

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.');
}

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

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

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

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

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

你可以在你的实际表上随心所欲地命名字段,你只需要让Eloquent意识到这一点。

检查下面的代码

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!');
     }
 }

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

更换,

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

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

也请检查此链接。

因为您使用名称而不是电子邮件(默认)作为用户名进行身份验证。您应该在Auth::attempt1中添加$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特性覆盖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;
    }
}

一切似乎都是正确的。

users表中的列名是什么?

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

Route::group(['middleware' => ['web']], function () {
    Route::post('/logintest', 'mycontroller@authenticate'); 
});
  1. 如果您使用的是版本5或5.2 ,请查看Routes.php中的上述更改

  2. 确保您的用户表字段名称是"名称"answers"密码",否则更新它。

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

如果你能向我们展示用户表模式,那就更好了

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

为什么不使用命令php artisan make:auth?它会使你需要的一切。

如果您想使用Name作为唯一用户名,密码恶魔名作为Password

你可以这样做。。

在您的AuthController中添加此方法

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

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

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

希望这能奏效。

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

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

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