Laravel Auth用户认证使用方法——用户密码字段不为password时的解决方法

大家好,这是我的第一篇Laravel的心得文章,请看后提出宝贵意见,勿喷!!

对于Laravel使用中的用户认证,通常我们并不喜欢使用其默认用户表的字段名,如:usernamepassword等,而喜欢在其前面加入一字段前缀,以说明此字段所属数据库表如:user_Nameuser_Password等,然而这将让我们陷入无尽的迷茫之中……,其最重要的提示可能就是password相关错误了吧!

在此咱不谈遇到的错误,只谈解决办法,对不起大家,我非常懒惰,就不做事件还原了。废话少说言归正传。

一、关于Laravel版本

Laravel 5.5

二、设置路由

Laravel 提供了一个简单的命令来快速生成身份验证所需的路由和视图:

php artisan make:auth

如果您使用自己的视图模板,则可修改 routes\web.php 文件直接加入路由:

Auth::routes();

查看当前路由以用于编辑修改控制器,其命令返回结果见下图

php artisan route:list
查看当前路由

三、编辑注册控制器

文件位置:app\Http\Controllers\Auth\RegisterController.php

文件头部设置类别名

use Illuminate\Http\Request;
use Illuminate\Auth\Events\Registered;

1、添加方法showRegistrationForm(),此方法用于显示注册页面,对于自定义视图文件名为register.blade.php的可不添加,如非则需要添加。

    /**
     * 显示注册页面
     * @return \Illuminate\View\View|\Illuminate\Contracts\View\Factory
     */
    public function showRegistrationForm() {
        return view('auth.register');
    }

2、添加方法redirectPath()用于实现自定义跳转,此方法将优先于保护变量:protected $redirectTo,可用于自定义的地址跳转。

    /**
     * 注册后跳转地址,在此可以分情况进行跳转
     * @return string
     */
    public function redirectPath() {
        return '/home';
    }

3、添加方法username()用于不以电子邮件进行认证的情况,此处返回的是用户表中为用户名的字段名称。

    /**
     * 自定义用户名, 即不使用默认的电子邮件认证
     *
     * @return string
     */
    public function username() {
        return 'user_Name';     // 我的表用户名,原内容为:username
    }

4、修改原保护方法validator(),用于数据验证错误时显示中文信息

    /**
     * Get a validator for an incoming registration request.
     *
     * @param array $data           
     * @return \Illuminate\Contracts\Validation\Validator
     */
    protected function validator(array $data) {
        // 如下注释掉内容为原始代码
        //return Validator::make ( $data, [ 
        //      'name' => 'required|string|max:255',
        //      'email' => 'required|string|email|max:255|unique:users',
        //      'password' => 'required|string|min:6|confirmed' 
        //] );
        $rules = [
                'user_Name'     => 'required|alpha_num|min:5|max:30|unique:users',
                'user_Email'    => 'required|string|email|max:100|unique:users',
                'user_Password' => 'required|string|min:6|confirmed',
                'I_agree'       => 'required|string',
        ];
         
        $message = [
                'user_Name.required'     => '必须输入用户名',
                'user_Name.alpha_num'    => '用户名只能为字母或数字',
                'user_Name.min'          => '用户名长度不能少于 5 字符',
                'user_Name.max'          => '用户名长度不能超过 30 字符',
                'user_Name.unique'       => '用户名已经存在,请更换注册用户名',
                'user_Email.required'    => '必须输入电子邮箱地址',
                'user_Email.email'       => '电子邮箱地址非法',
                'user_Email.max'         => '电子邮箱地址长度不能超过 100 字符',
                'user_Email.unique'      => '电子邮箱地址已经存在,请更换邮箱地址',
                'user_Password.required' => '必须输入密码',
                'user_Password.min'      => '密码长度最少 6 字符',
                'confirmed'              => '密码和确认密码必须相同',
                'I_agree.required'       => '必须同意服务条款',
        ];
        return Validator::make($data, $rules, $message);
    }

5、修改原保护方法create(),用于保存注册用户信息

    /**
     * Create a new user instance after a valid registration.
     *
     * @param array $data           
     * @return \App\User
     */
    protected function create(array $data) {
        // 如下注释掉内容为原始代码
        //return User::create ( [ 
        //      'name' => $data['name'],
        //      'email' => $data['email'],
        //      'password' => bcrypt($data['password']),
        //]);
        return User::create ( [ 
                'user_Name'     => $data ['user_Name'],
                'user_Email'    => $data ['user_Email'],
                'user_Password' => bcrypt ( $data ['user_Password'] ) 
        ] );
    }

6、添加方法register()用于实现用户注册

    /**
     * 实现用户注册
     * @param Request $request
     * @return \Illuminate\Routing\Redirector|\Illuminate\Http\RedirectResponse
     */
    public function register(Request $request){
        $register = $request->except('_token');
        $this->validator($register)->validate();

        $user = $this->create($register);
         
        event(new Registered($user));
        $this->guard()->login($user);
         
        //return redirect($this->redirectPath());
        return $this->registered($request, $user) ? : redirect($this->redirectPath());
    }

四、编辑登录控制器

文件位置:app\Http\Controllers\Auth\LoginController.php

文件头部设置类别名

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Contracts\Auth\Authenticatable as UserContract;

1、添加方法showLoginForm(),此方法用于显示登录页面,对于自定义视图文件名为login.blade.php的可不添加,如非则需要添加。

    /**
     * 显示登录视图
     * @return \Illuminate\View\View|\Illuminate\Contracts\View\Factory
     */
    public function showLoginForm() {
        return view('auth.login');
    }

2、添加方法username(),此方法用于指定登录用户名所对应数据库表字段名称

    /**
     * 登录使用的用户名定义
     * @return string
     */
    public function username() {
        return 'user_Name';
    }

3、添加保护方法redirectTo()用于实现自定义跳转,此方法将优先于保护变量:protected $redirectTo,可用于自定义的地址跳转。

    /**
     * 登录后跳转地址,在此可以分情况进行跳转
     * @return string
     */
    protected function redirectTo() {
        return '/home';
    }

4、添加保护方法validateLogin(),用于数据验证错误时显示中文信息,后文登录方法中将会用到

    /**
     * 用户登录校验
     * @param Request $request
     */
    protected function validateLogin(Request $request) {
        $rules = [
                'user_Name' => 'required|alpha_num|max:30',
                'user_Password' => 'required|string|min:6',
        ];
    
        $message = [
                'user_Name.required'     => '必须输入用户名',
                'user_Name.alpha_num'    => '用户名只能为字母或数字',
                'user_Name.max'          => '用户名长度不能超过 30 字符',
                'user_Password.required' => '必须输入密码',
                'user_Password.min'      => '密码长度最少 6 字符',
        ];
        $this->validate($request, $rules, $message);
    }

5、添加保护方法credentials(),用于生成用户凭证,此方法也可不做设置,而是在登录时直接以参数形式使用

    /**
     * 生成用户凭证
     * @param Request $request
     * @return \Illuminate\Http\Request[]
     */
    protected function credentials(Request $request) {
        // 这里是使用非password为字段名的关键部分之一
        // Laravel认证凭证中的密码关键字是硬编码
        // 故对于定义密码字段名必须这样书写代码
        // 另一关键部分存在于用户模型中
        return ['user_Name' => $request['user_Name'], 'password' => $request['user_Password']];
    }

6、添加方法login()用于实现用户登录

    /**
     * 用户登录
     * @param Request $request
     */
    public function login(Request $request) {
        $this->validateLogin($request);      
        if ($this->hasTooManyLoginAttempts($request)) { //爆破保护
            $this->fireLockoutEvent($request);
            return $this->sendLockoutResponse($request);
        }       
        $credentials = $this->credentials($request);
        $remember    = $request->input('remember', false);
        
        if(Auth::attempt($credentials, $remember)) {
            echo '登录成功';
        } else {
            echo '登录失败';
        }       
    }

7、添加方法logout(),此方法用于处理用户退出

    /**
     * 退出登录
     */
    function logout() {
        if(Auth::check()){
            Auth::logout();
        }
    }

五、编辑用户模型

文件位置:app\User.php、

事实上此文件应该优先修改才好,但这里为了强调其重要性就把它压轴了。

1、添加变量

    protected $table      = 'users';            //定义用户表名称
    protected $primaryKey = "user_ID";          //定义用户表主键
    public    $timestamps = FALSE;              //是否有created_at和updated_at字段

2、设置可被编辑的字段

    /**
     * 可以被赋值的字段
     *
     * @var array
     */
    protected $fillable = [
            'user_Name',
            'user_Password',
            'user_Email',
    ];

3、设置在模型数组或 JSON 显示中隐藏的属性

    /**
     * 在模型数组或 JSON 显示中隐藏的属性
     *
     * @var array
     */
    protected $hidden = [
        'user_Password', 'remember_token',
    ];

4、添加方法用于获取用户密码,这是自定义用户密码字段的另一关键部分,无此部分,则用户将总是不可登录,通过上网查找相关资料发现,此处均书写为return 'password',让我一度认为此处也是返回字段名称,怪我粗心了,此处应该直接返回用户的密码密文,即密码字段值。

    /**
     * 自定义的密码字段, 无此,对于密码字段名不为password的登录时将出现密码不存在
     * @return string
     */
    public function getAuthPassword() {
        return $this->user_Password;        // 一定要返回加密了的密码
    }

至此,您应该已经能够正确的实现用户的注册与登录了,不信,那就试一试吧!
欢迎提出不同意见!


河北省安新县探索者工作室 王佳辉
网站与程序定制 Office办公开发 请发电子邮件至 bdwjh@163.com


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,189评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,577评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,857评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,703评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,705评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,620评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,995评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,656评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,898评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,639评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,720评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,395评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,982评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,953评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,195评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,907评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,472评论 2 342

推荐阅读更多精彩内容