Laravel手动身份验证:Auth::attempt always false

Laravel manual authentication: Auth::attempt always false

提问人:micky 提问时间:5/17/2016 最后编辑:micky 更新时间:5/25/2016 访问量:12328

问:

我正在使用Laravel手动身份验证系统。提交表单将重定向到如下所示的此路由。在 authenticate () 函数中,名称和密码与我之前存储的名称和密码永远不匹配。即 始终是 false。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()函数中,我正在与普通密码进行比较。我在某处阅读会自动处理它。或者我应该在配置/身份验证中更改一些东西.php因为我使用了名称而不是用户名进行身份验证?Auth

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.');
}
PHP Laravel LaRavel-5

评论

0赞 VipindasKS 5/19/2016
你能给我们看一下路由文件吗?
0赞 micky 5/19/2016
@VipindasKS我已经在顶部展示了它们。
0赞 VipindasKS 5/20/2016
这是唯一定义的路由吗?只是想确保它不会与任何其他路由冲突。特别是,如果你之前做过一个 php artisan make:auth。
0赞 Repox 5/25/2016
我们能看到用户表的迁移文件吗?

答:

0赞 linuxartisan 5/17/2016 #1

一切似乎都是正确的。

users 表中的列名是什么?

名称区分大小写。因此,请确保它们确实是 and 而不是 和 .NamePasswordnamepassword

评论

0赞 linuxartisan 5/18/2016
在尝试更改为public function authenticate(Request $request)$password=$input['password'];$password=bcrypt($input['password']);
4赞 Javid Aliyev 5/17/2016 #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!');
     }
 }

评论

0赞 micky 5/17/2016
发现由于密码错误而为 false。我在注册用户时使用了 bcrypt()。 我怎样才能在这里使用它来访问?Auth::attempt$password=bcrypt($input['password']);
1赞 Javid Aliyev 5/17/2016
$password = 输入::get('密码');$hashed = 哈希::make($password);
0赞 Javid Aliyev 5/17/2016
你能在这里写代码吗?我不知道你做什么
0赞 toha 5/26/2016
代码在哪里?是否上传刀片和控制器文件?你说:“我用名字而不是用户名来验证”-->你能上传项目或必要的配置和文件吗?将 vendor/laravel/framework/src/Illuminate/Foundation/Auth/AuthenticatesAndRegistersUsers.php 文件的副本保存在哪里?
0赞 Mohamed Elbiheiry 5/17/2016 #3

你为什么不使用这个命令?它将提供您需要的一切。php artisan make:auth

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

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

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

如果您能向我们展示用户表架构,那就更好了

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

评论

0赞 VipindasKS 5/20/2016
您能否显示“用户”表的表结构?
0赞 micky 5/20/2016
是的。我将“密码”更改为“密码”,它突然起作用了。谢谢你的努力。
5赞 lagbox 5/20/2016 #5

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

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

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

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

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

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

0赞 Parvez Rahaman 5/23/2016 #6

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

你可以这样做..

在 AuthController 中,添加此方法

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

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

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

希望这能奏效。

评论

0赞 lagbox 5/26/2016
他们不使用默认的 AuthController。
1赞 Chay22 5/24/2016 #7

因为您使用名称而不是电子邮件(默认)作为要进行身份验证的用户名。您应该在 .$usernameAuthController

....

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

....
}

或者,您可以覆盖 trait 中的方法。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\AuthenticatableUser

....

class User extends Authenticatable
{

....

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

评论

0赞 lagbox 5/26/2016
他们没有使用 AuthController,如果他们使用 AuthController,他们就会绕过所有这些,因为他们代码中的方法是手写的。attempt
0赞 CarlosCarucce 5/25/2016 #8

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

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

//...
if (Auth::attempt(['name' => $name, 'password' => $password]) ) {
//...
2赞 Ravi Hirani 5/25/2016 #9

您应该用小写字母写 Password 的 p 字符。

取代

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

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

也检查此链接