Laravel 5.5 Auth try方法仅返回false

时间:2018-08-30 05:17:46

标签: php laravel laravel-5 laravel-5.5

这可能是一个反复出现的问题,为什么auth:attempt总是返回false,但是尽管寻找答案,但我无法进一步解决问题。

我有一个学生表,其ID为std_id,电子邮件为std_email,密码为std_password。为了克服默认的密码字段,我经历了一些答案,并建议使用此功能覆盖字段名称

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

尝试功能为

public function authenticate(Request $request)
    {
        if (Auth::attempt(['std_email' => $request['std_email'], 'password' => $request['std_password']])){
            return response()->json([
                'validated' => true
            ]);
        }else{
            return response()->json([
                'validated' => false
            ]);
        }
    }

所以,我已经更新了两个文件auth / LoginController.php

<?php

namespace App\Http\Controllers\Auth;

use App\Http\Controllers\Controller;
use Illuminate\Foundation\Auth\AuthenticatesUsers;
use \Illuminate\Support\Facades\Auth;
use Illuminate\Http\Request;

class LoginController extends Controller
{
    /*
    |--------------------------------------------------------------------------
    | Login Controller
    |--------------------------------------------------------------------------
    |
    | This controller handles authenticating users for the application and
    | redirecting them to your home screen. The controller uses a trait
    | to conveniently provide its functionality to your applications.
    |
    */

    use AuthenticatesUsers;

    /**
     * Where to redirect users after login.
     *
     * @var string
     */
    protected $redirectTo = '/home';

    /**
     * Create a new controller instance.
     *
     * @return void
     */
    public function __construct()
    {
        $this->middleware('guest')->except('logout');
    }

    public function authenticate(Request $request)
    {
        if (Auth::attempt(['std_email' => $request['std_email'], 'password' => $request['std_password']])){
            return response()->json([
                'validated' => true
            ]);
        }else{
            return response()->json([
                'validated' => false
            ]);
        }
    }

}

,用户模型为

<?php

namespace App;

use Illuminate\Notifications\Notifiable;
use Illuminate\Foundation\Auth\User as Authenticatable;

class User extends Authenticatable
{
    use Notifiable;

    protected $primaryKey = "std_id";
    protected $table = "students";

    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = [
        'std_email', 'std_password',
    ];

    /**
     * The attributes that should be hidden for arrays.
     *
     * @var array
     */
    protected $hidden = [
        //'std_password', 'remember_token',
    ];

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

}

我确保在用户模式下,将主键设置为std_id,将表设置为学生。

此外,当我注册学生时,我使用bcrypt哈希密码并将其保存在数据库中。

public function create(Request $request){

        $account_exists = $this->check_account_exists($request['email']);

        if($account_exists){

            return response()->json(['account'=>true]);

        }else{

            DB::table('students')->insert([
                'std_fname'     => $request['first_name'],
                'std_lname'     => $request['last_name'],
                'std_email'     => $request['email'],
                'std_password'  => bcrypt($request['std_password']),
                'group_id'      => $request['group'],
                'std_isActive'  => 1
            ]);

            return response()->json(['created'=>true]);

        }

    }

在这一点上,我没有得到任何尝试方法失败的答案,因为我已经确定登录信息正确?你能看到我是否想念其他东西吗?

谢谢!

3 个答案:

答案 0 :(得分:0)

使用Hash :: make($ request ['std_password'])加密密码,也请从auth.php共享您的代码

答案 1 :(得分:0)

我尝试了不同的方法,但均无效果。但是,我发现了一个非常有趣的发现。也许我以前不知道这一点。存储密码时,我设置了第一个密码(该auth :: attempt方法始终返回false)包括至少1个大写字母和1个特殊字符,并且PW为“ Abcde12!”。每次都失败。 接下来,我添加了一个没有这些规则的简单密码,并以“秘密”的形式保存在数据库中。当我测试登录名时,它返回true。 因此,现在真正的问题是,为什么对带有特殊字符的密码进行哈希运算不起作用?

答案 2 :(得分:-1)

看起来好像是您要传入

    'password' => $request['std_password']

    Auth::attempt()

当数据库表中不包含“密码”列时的方法。您可能想传递

    'std_password' => $request['std_password']

但即使如此,我仍不确定

    Auth::attempt()

在将密码输入与数据库中的“ std_password”哈希进行比较之前,将知道对密码输入进行哈希处理。您可能会找到一种修改方法

    Auth::attempt()

或创建一个新的try方法,该方法将在比较之前对输入进行哈希处理...或者您可以使用

    bcrypt()

在将“ std_password”输入传递给尝试之前对其进行哈希处理。