我正在尝试将旧的PHP / MySQL迁移到Laravel项目。由于这么多原因,我不应该修改数据库表模式。我需要修改Laravel框架类。例如,我想强制Laravel Auth检查users.USER
capitalize列以返回用户,而不是users.user
。我需要知道Laravel框架的哪一部分检查users
数据库表或user
列。如何修改而不中断默认的Auth功能。
更具体一点:我想知道Laravel如何从/Vendor/laravel/framework/src/illuminate/Auth/EloquentUserProvider.php
line 137 validateCredentials()
中的数据库中检索数据。
如果要在laravel应用程序上使用自定义数据库,则只需为数据库的每个表创建一个Model,并设置表名,主键和可填充属性。
更多信息在这里Defining Models
如果您运行命令php artisan make:auth
但是您想要使用另一个或多个字段而不是默认用户并且在不破坏创建的Auth功能的情况下通过,则必须按照下面列出的步骤进行操作:
第一步:为要用于身份验证的表创建模型。为此,运行命令php artisan make:model FooUserTable
,其中'FooUser'是表的名称。
接下来,您必须在模型上设置表名,主键和可填写字段,如下:
class FooUser extends Authenticatable{
protected $table = 'FooUser';
protected $primaryKey = 'foo_id_user'; // Place here the name of the id of your table
protected $fillable = [ // Insert here all the fillable fields of your users table
'field1',
'field2',
...
];
}
请注意,模型现在从Authenticatable而不是model扩展,这是类Illuminate\Foundation\Auth\User
的别名。为了使其有效,只需将use Illuminate\Foundation\Auth\User as Authenticatable
放在文件的顶部即可。
这个很重要!:
要为密码使用其他字段名称,请将函数getAuthPassword
放入users表的模型中,如下所示:
public function getAuthPassword(){
return $this->myPasswordField; // myPasswordField is the field on your users table for password
}
现在,您可以为下一步准备好所有模型。
第二:在文件config > auth.php
上你必须找到providers数组,并将model属性值更改为你的模型类名,例如:
'providers' => [
'users' => [
'driver' => 'eloquent',
'model' => App\FooUser::class, // Place here the name of your model
],
],
一切都准备好了下一步。
第三:现在你必须找到位于app > http > controllers > auth > LoginController.php
的默认Laravel Auth的控制器,并且在类中,你只需要添加一个名为username
的函数,它返回用于auth操作的用户名,如下:
class LoginController extends Controller{
..... // don't change other functions
public function username(){ // add the function username
return 'YourUsernameField';
}
}
刀片登录模板注意:在您的登录刀片模板中,您应该将用户名输入名称更改为新的名称,密码字段名称必须仍为password
,这是因为laravel使用它进行验证,但在内部它将使用您的自定义密码字段名称。
就这样。我希望这可以帮助你。
注意:永远不要将文件编辑到供应商文件夹中!
有关更多信息,请阅读Manually Authenticating Users部分的文档
所有这些都在Laravel 5.4和5.7版本上进行了测试。
您将必须为表和关系创建所有模型。在模型上,您可以指定表名,如果不想,则不必重命名表。
例如。
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class User extends Model{
protected $table = 'users.USER';
}
数据库相关问题/答案:
要从数据库方案中提取模型,您可以使用以下包:
该软件包可以自动生成您在Laravel中开始使用数据库所需的Eloquent模型。
它有一堆易于使用的命令,可以从您的数据库方案中创建模型。
用法
让我们从您的默认连接中构建一些模型。
php artisan code:models
你可以像这样搭建一个特定的表:
php artisan code:models --table=users
您还可以指定连接:
php artisan code:models --connection=mysql
如果您使用的是MySQL数据库,则可以指定要构建的架构:
php artisan code:models --schema=shop
扩展/编辑Auth功能
看看有关manually authenticating的官方文档。
如果您将以下代码段放在Controller中:
public function authenticate(Request $request)
{
$credentials = $request->only('email', 'password');
if (Auth::attempt($credentials)) {
// Authentication passed...
return redirect()->intended('dashboard');
}
}
如果需要指定要使用的属性,可以使用以下命令:
if (Auth::attempt(['email' => $email, 'password' => $password, 'active' => 1])) {
// The user is active, not suspended, and exists.
}
您也可以自己进行检查,然后使用以下代码直接登录您的代码:
Auth::login($user);
// Login and "remember" the given user...
Auth::login($user, true);
我在此处列出的所有内容都在上面关于验证用户身份的链接中。