Laravel手动验证:Auth ::尝试始终为false

时间:2016-05-17 06:32:51

标签: php laravel laravel-5

我正在使用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.');
}

9 个答案:

答案 0 :(得分:6)

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

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

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

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

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

您可以在实际的桌子上为字段命名,只需要让Eloquent知道这一点。

答案 1 :(得分:3)

检查以下代码

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

答案 2 :(得分:2)

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

替换,

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

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

同时检查此link

答案 3 :(得分:1)

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

....

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';

....
}

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

....

class AuthController extends Controller
{


use AuthenticatesAndRegistersUsers, ThrottlesLogins;

/**
 * Get the login username to be used by the controller.
 *
 * @return string
 */
public function loginUsername()
{
    return 'Name';
}

....
}

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

....

class User extends Authenticatable
{

....

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

答案 4 :(得分:0)

一切似乎都是正确的。

users表中的列名是什么?

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

答案 5 :(得分:0)

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

答案 6 :(得分:0)

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

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

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

  4. 如果您能向我们展示用户表架构

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

答案 7 :(得分:0)

如果您想将Password用作唯一用户名和密码fiendname作为public function loginUsername() { return 'Name'; }

你可以这样做..

在AuthController中添加此方法

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

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

{{1}}

希望这会奏效。

答案 8 :(得分:0)

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

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

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