美文网首页
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