laravel 4 自定义命名密码列

Posted

技术标签:

【中文标题】laravel 4 自定义命名密码列【英文标题】:laravel 4 custom named password column 【发布时间】:2014-11-18 02:23:43 【问题描述】:

所以我已经发现了一些问题,即您必须覆盖 getAuthPassword() 才能从数据库中提供密码列的自定义名称。尝试将此方法与数据库中的列同名,但没有奏效。它仍然会出现此错误:未定义的索引:密码。

这是授权:

if (Auth::attempt(Input::only('user_displayName'), Input::get('user_password')))

尝试在表单和控制器中将 user_password 更改为密码均无效。

所以问题是如果我在数据库中有一个名为“user_password”的列,有没有办法让 Auth 工作?

P.S 检查了我找到的所有旧解决方案

编辑

用户表结构:

+======================+
|        User          |
+======================+
|       user_id        |
+----------------------+
|   user_displayName   |
+----------------------+
|     user_fname       |
+----------------------+
|      user_lname      |
+----------------------+
|      user_email      |
+----------------------+
|     user_password    |
+----------------------+
|      created_at      |
+----------------------+
|      updated_at      |
+----------------------+

【问题讨论】:

请发布您的迁移或架构的 sql 转储。没关系再读一遍。不是必需的,但仍然可能会有所帮助。 你可以看看***.com/questions/26073309/…它对我有用 【参考方案1】:

tldr;只要您的 User 模型正确实现了接口,您就可以将密码字段命名为任何您喜欢的名称。

但是,您不能将不同的数组键传递给 Auth::attempt 方法 - 只有 password 索引可以在那里

首先你做错了 - 你需要传递一组凭据作为第一个参数:

if (Auth::attempt(Input::only('user_displayName', 'user_password')))

接下来,不幸的是,Eloquent 提供程序在代码中硬编码了password 数组索引,因此您无法将user_password 传递给attempt 方法。

所以这就是你需要的:

$credentials = Input::only('user_displayName');
$credentials['password'] = Input::get('user_password');

if (Auth::attempt($credentials))

// or simply rename the input in your form to password and:
if (Auth::attempt(Input::only('user_displayName', 'password')))

【讨论】:

如果我错了,请纠正我,但它看起来不像是硬编码到函数中。 github.com/laravel/framework/blob/4.2/src/Illuminate/Auth/… @mschuett 好吧,你错了;)不是Guard,而是Eloquent 提供者:github.com/laravel/framework/blob/4.2/src/Illuminate/Auth/… 我的错误没有遵循函数调用足够好的捕获。在我看来,这似乎是设计上的疏忽,而且很容易解决。 它有效。我使用的教程甚至没有显示第一个必须是数组。谢谢 这个。应该贴。它不在文档中的任何地方。【参考方案2】:

我没有对此进行测试,但我相信您只需要覆盖 UserTrait.php 中的一个函数,尽管不要破解源代码。在您的模型/User.php 文件中添加以下函数。

/**
 * Get the password for the user.
 *
 * @return string
 */
public function getAuthPassword()

    return $this->user_password;

【讨论】:

是的,我试过完全一样,没有任何改变。【参考方案3】:

对于实现给定接口不够用的情况(例如,您有两个密码列,一个用户密码和一个支持密码),有一个静态解决方案。

$qry = DB::table('users')
        ->where('email', $email)
        ->whereNotNull('support_password')
        ->first();

if(!empty($qry))

    $check = Hash::check($password, $qry->support_password);
    if ($check)
    
        Auth::loginUsingId($qry->id, true);
    

【讨论】:

【参考方案4】:

这是我在不更改供应商代码的情况下将 Laravel 登录的默认电子邮件字段更改为“email_address”的方法。

我创建了一个扩展供应商 AuthenticatesUsers 特征的特征类。并且只扩展了用户名方法。

App\Http\Controllers\Auth\AuthenticatesLogins.php:

namespace App\Http\Controllers\Auth;

use Illuminate\Foundation\Auth\AuthenticatesUsers;

trait AuthenticatesLogins

    use AuthenticatesUsers 
        AuthenticatesUsers::username as parentUsername;
    

    /**
     * Get the login username to be used by the controller.
     *
     * @return string
     */
    public function username()
    
        $this->parentUsername();
        return 'email_address';
    

现在在 App\Http\Controllers\Controller\LoginController.php:

class LoginController extends Controller

    use AuthenticatesLogins; // <-- for custom login fields
    // etc.

然后……完成了!希望这会有所帮助。

【讨论】:

以上是关于laravel 4 自定义命名密码列的主要内容,如果未能解决你的问题,请参考以下文章

在 Laravel 5.4 中自定义忘记密码的电子邮件

为自定义验证规则命名 - Laravel 8

GridControl列自定义排序

Laravel 引入自定义类库或第三方类库

Laravel composer自定义命令空间,方便引用第三方库

jquery datatable后台分页移动端隐藏列自定义列显示格式