这可能是一个反复出现的问题,为什么认证:尝试总是返回错误,但尽管寻找答案,我无法进一步解决我的问题。
我有一个学生表,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]);
}
}
在这一点上,我没有得到任何答案,为什么尝试方法失败,因为我已经确保登录信息是正确的?你能看看我还漏了什么吗?
谢谢
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_密码”输入传递给尝试之前,对其进行散列。