提问者:小点点

Laravel 5.5身份验证尝试方法仅返回false


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

我有一个学生表,id为std_id,电子邮件为std_电子邮件,密码为std_密码。为了克服默认密码字段,我浏览了一些答案,并建议使用此函数覆盖字段名

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个答案

匿名用户

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

匿名用户

我尝试了不同的方法,都不奏效。不过,我发现了一个非常有趣的发现。也许我以前不知道这件事。当存储密码时,我设置了第一个密码(授权::attempt方法总是返回false)包括至少1个大写字母和1个特殊字符,PW是Abcde12!这每次都失败了。接下来,我添加了一个没有这些规则的简单密码,并将其保存在数据库中作为“秘密”。当我测试登录时,它返回true。所以现在真正的问题是,为什么用特殊字符散列密码不起作用?

匿名用户

看起来你好像是路过这里

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

    Auth::attempt()

方法,当数据库表不包含密码列时。你可能想过去

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

但即便如此,我也不确定

    Auth::attempt()

将知道在将密码输入与数据库中的“std_password”哈希进行比较之前对其进行哈希。你也许能找到一种方法来修改

    Auth::attempt()

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

    bcrypt()

在将“std_密码”输入传递给尝试之前,对其进行散列。