美文网首页
Laravel Auth用户认证使用方法——用户密码字段不为pa

Laravel Auth用户认证使用方法——用户密码字段不为pa

作者: 探索因努力而精彩 | 来源:发表于2017-11-30 13:13 被阅读0次
大家好,这是我的第一篇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


相关文章

网友评论

      本文标题:Laravel Auth用户认证使用方法——用户密码字段不为pa

      本文链接:https://www.haomeiwen.com/subject/vulvbxtx.html