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 自定义命名密码列的主要内容,如果未能解决你的问题,请参考以下文章