您现在的位置是:网站首页>>PHP>>laravel

laravel 实现自定义注册和登录

发布时间:2018-12-18 16:16:10作者:wangjian浏览量:1312点赞量:1

    laravel框架自带了一套登录注册方法:可以参考:Laravel 的用户认证系统

    在laravel框架中登录注册叫做认证,个人不是很习惯,还是喜欢叫做登录注册

    这里我要说的是根据laravel框架字段登录注册方法来自己定义实现登录注册

    一:导入laravel的认证脚手架(这里你可以不进行下述操作,这里我使用laravel的认证脚手架只是方便用于测试)

    php artisan make:auth

    上述的命令执行完成后会在laravel框架中生成布局、注册和登录视图以及所有的认证接口的路由。同时它还会生成 HomeController 来处理应用的登录请求

    (1)视图:

    php artisan make:auth 命令会在 resources/views/auth 目录创建所有认证需要的视图,还创建了 resources/views/layouts 目录,该目录包含了应用的基本布局视图

    (2)路由:

    php artisan make:auth命令会在routes/web.php文件中生成注册登录等相关路由

    Auth::routes();
    Route::get('/home', 'HomeController@index')->name('home');

    相面的路由以下等同于:Auth::routes();

    // 登录相关路由
    Route::get('login', 'Auth\LoginController@showLoginForm')->name('login');
    Route::post('login', 'Auth\LoginController@login');
    Route::post('logout', 'Auth\LoginController@logout')->name('logout');
    // 注册相关路由
    Route::get('register', 'Auth\RegisterController@showRegistrationForm')->name('register');
    Route::post('register', 'Auth\RegisterController@register');
    // 修改密码相关路由
    Route::get('password/reset', 'Auth\ForgotPasswordController@showLinkRequestForm')->name('password.request');
    Route::post('password/email', 'Auth\ForgotPasswordController@sendResetLinkEmail')->name('password.email');
    Route::get('password/reset/{token}', 'Auth\ResetPasswordController@showResetForm')->name('password.reset');
    Route::post('password/reset', 'Auth\ResetPasswordController@reset');

    (3)HomeController 

    php artisan make:auth命令生成的HomeController.php文件主要用户登录成功后跳转的页面

    二:登录注册配置

    在laravel框架中,登录注册配置文件在config/auth.php文件中

    (1)默认看守器

    image.png

    (2)看守器(用于登录注册)

    guard中的web和api表示两个不同的看守器

    driver表示使用什么方式实现登录注册(一般我们会选择session方式实现登录注册)

    provider和下面的provider配置相互对应

    image.png

    //下面的配置表示有两个看守器
    'guards' => [
       'web' => [
           'driver' => 'session',
           'provider' => 'users',
       ],
       'admin' => [
           'driver' => 'session',
           'provider' => 'admins',
       ],
    ],

    (3)提供器(表示指定登录注册所有的数据库)

    image.png

    //上面两个看守器对应的数据库表
    'providers' => [
       'users' => [
           'driver' => 'eloquent',
           'model' => App\Models\laraver\User::class,
       ],
       'admins' => [
           'driver' => 'eloquent',
           'model' => App\Models\laraver\Staff::class,
       ],
    ],

    三:model配置(这里我使用app\Models\laraver\User.php文件作为登录注册的model为例)

    (1)继承问题

    一般的model是继承

    use Illuminate\Database\Eloquent\Model as Eloquent;

    但是如果你使用这个model作为登录注册的model的话,继承必须改成

    use Illuminate\Foundation\Auth\User as Authenticatable;

    (2)引入Notifiable类

    use Illuminate\Notifications\Notifiable;
    class User extends Authenticatable
    {
        use Notifiable;
        ....
    }

    (3)如果你的数据库没有remember_token字段,需要加上下面属性

    //加上下面这一句,相当于把$rememberTokenName清空,
    protected $rememberTokenName = '';

    如图修改:

    image.png

    三:登录注册退出

    这里注意:登录注册退出继承的Controller内必须有如下内容

    <?php
    namespace App\Http\Controllers;
    use Illuminate\Foundation\Bus\DispatchesJobs;
    use Illuminate\Routing\Controller as BaseController;
    use Illuminate\Foundation\Validation\ValidatesRequests;
    use Illuminate\Foundation\Auth\Access\AuthorizesRequests;
    class Controller extends BaseController
    {
        use AuthorizesRequests, DispatchesJobs, ValidatesRequests;
        ...
    }

    1:使用默认的看守器实现登录注册退出

    (1)登录退出

    <?php
    namespace App\Http\Controllers\Auth;
    use App\Http\Controllers\Controller;
    use Illuminate\Foundation\Auth\AuthenticatesUsers;
    use Illuminate\Http\Request;
    use Illuminate\Support\Facades\Auth;
    use think\exception\ValidateException;
    class LoginController extends Controller {

       use AuthenticatesUsers;
       /**
        * 自动调用guest中间件,guest中间件文件在app/Http/Middleware/RedirectIfAuthenticated.php,
        * 用于如果已经在登录状态时处理,默认的guest中间件处理方式是如果用户是登录状态的话跳转到/home页面
        *
        * @return void
        */
       public function __construct() {
           $this->middleware('guest')->except('logout');
       }
       /**
        * [showLoginForm 登录展示页面]
        * @AuthorHTL wangjian
        * @DateTime  2018-12-19T15:17:55+0800
        * @param     Request                  $request [description]
        * @return    [type]                            [description]
        */
       public function showLoginForm(Request $request) {
           return view('auth.login');
       }
       /**
        * [login 登录逻辑]
        * @AuthorHTL wangjian
        * @DateTime  2018-12-19T15:18:10+0800
        * @param     Request                  $request [description]
        * @return    [type]                            [description]
        */
       public function login(Request $request) {
           try {
               //使用laravel的php artisan make:auth命令生成的登录视图默认传的是email,这里我将email改成了user_name
               // 规则
               $rules = [
                   'user_name' => 'required|string',
                   'password' => 'required|string',
               ];
               // 自定义消息
               $messages = [
                   'user_name.required' => '请输入用户名',
                   'password.required' => '请输入密码',
               ];
               //字段校验
               $this->validate($request, $rules, $messages);
               $data = $request->all();
               if (Auth::attempt(['user_name' => $data['user_name'], 'password' => $data['password']])) {
                   // 登录成功
                   return redirect('/home');
               } else {
                   //登录失败(用户名或密码错误)
                   return redirect('/login');
               }
           } catch (ValidateException $validationException) {
               $message = $validationException->validator->getMessageBag()->first();
               return message;
           }
       }
       /**
        * [logout 退出登录]
        * @AuthorHTL wangjian
        * @DateTime  2018-12-19T15:21:34+0800
        * @param     Request                  $request [description]
        * @return    [type]                            [description]
        */
       public function logout(Request $request) {
           Auth::logout();
           $request->session()->forget(Auth::getName());
           $request->session()->regenerate();
           return redirect('/home');
       }
    }

    (2)注册

    <?php
    namespace App\Http\Controllers\Auth;
    use App\Http\Controllers\Controller;
    use App\Models\laraver\User;
    use Illuminate\Foundation\Auth\RegistersUsers;
    use Illuminate\Http\Request;
    use Illuminate\Support\Facades\Auth;
    use Illuminate\Support\Facades\Validator;
    class RegisterController extends Controller {
       use RegistersUsers;
       /**
        * 自动调用guest中间件,guest中间件文件在app/Http/Middleware/RedirectIfAuthenticated.php,
        * 用于如果已经在登录状态时处理,默认的guest中间件处理方式是如果用户是登录状态的话跳转到/home页面
        *
        * @return void
        */
       public function __construct() {
           $this->middleware('guest');
       }
       /**
        * [showRegistrationForm 注册页面展示]
        * @AuthorHTL wangjian
        * @DateTime  2018-12-19T15:29:03+0800
        * @param     Request                  $request [description]
        * @return    [type]                            [description]
        */
       public function showRegistrationForm(Request $request) {
           return view('auth.register');
       }
       /**
        * [register 注册逻辑]
        * @AuthorHTL wangjian
        * @DateTime  2018-12-19T16:36:07+0800
        * @param     Request                  $request [description]
        * @return    [type]                            [description]
        */
       public function register(Request $request) {
           try {
               // 规则
               // unique:user表示在使用默认看守器对应的库的user表中的user_name字段不能重复
               $rules = [
                   'user_name' => 'required|string|max:10|unique:user',
                   'email' => 'required|string|email|max:255',
                   'password' => 'required|string|confirmed',
               ];
               // 自定义消息
               $messages = [
                   'user_name.required' => '请输入用户名',
                   'user_name.max' => '用户名的长度不能超过10个字符',
                   'user_name.unique' => '用户名已存在',
                   'email.required' => '请输入邮箱',
                   'email.email' => '请输入正确的邮箱格式',
                   'email.max' => '邮箱的长度不能超过255个字符',
                   'password.required' => '请输入密码',
                   'password.confirmed' => '两次密码不相同',
               ];
               $this->validate($request, $rules, $messages); //字段校验
               $data = $request->all();
               //保存数据
               $user = User::create([
                   'user_no' => date('YmdHis'),
                   'user_name' => $data['user_name'],
                   'email' => $data['email'],
                   'password' => bcrypt($data['password']),
                   'create_time' => date('Y-m-d H:i:s'),
               ]);
               // 注册的用户让其进行登陆状态
               Auth::login($user);
               //登录成功跳转
               return $this->registered($request, $user)?: redirect($this->redirectPath());
           } catch (ValidateException $validationException) {
               $message = $validationException->validator->getMessageBag()->first();
               return $message;
           }
       }
    }

    2:不使用默认的看守器实现登录退出注册(这里我使用的是上面配置的admin看守器实现登录退出注册)

    (1)登录退出

    <?php
    namespace App\Http\Controllers\Auth;
    use App\Http\Controllers\Controller;
    use Illuminate\Foundation\Auth\AuthenticatesUsers;
    use Illuminate\Http\Request;
    use Illuminate\Support\Facades\Auth;
    use think\exception\ValidateException;
    class LoginController extends Controller {

       use AuthenticatesUsers;
       /**
         * 自动调用guest中间件,guest中间件文件在app/Http/Middleware/RedirectIfAuthenticated.php,
         * 用于如果已经在登录状态时处理,默认的guest中间件处理方式是如果用户是登录状态的话跳转到/home页面
         *guest:admin表示的是使用admin看守器
         * @return void
         */
       public function __construct() {
           $this->middleware('guest:admin')->except('logout');
       }
       /**
         * [showLoginForm 登录展示页面]
         * @AuthorHTL wangjian
         * @DateTime  2018-12-19T15:17:55+0800
         * @param     Request                  $request [description]
         * @return    [type]                            [description]
         */
       public function showLoginForm(Request $request) {
           return view('auth.login');
       }
       /**
         * [login 登录逻辑]
         * @AuthorHTL wangjian
         * @DateTime  2018-12-19T15:18:10+0800
         * @param     Request                  $request [description]
         * @return    [type]                            [description]
         */
       public function login(Request $request) {
           try {
               //使用laravel的php artisan make:auth命令生成的登录视图默认传的是email,这里我将email改成了user_name
               // 规则
               $rules = [
                   'user_name' => 'required|string',
                   'password' => 'required|string',
               ];
               // 自定义消息
               $messages = [
                   'user_name.required' => '请输入用户名',
                   'password.required' => '请输入密码',
               ];
               //字段校验
               $this->validate($request, $rules, $messages);
               $data = $request->all();
               if (Auth::guard('admin')->attempt(['user_name' => $data['user_name'], 'password' => $data['password']])) {
                   // 登录成功
                   return redirect('/home');
               } else {
                   //登录失败(用户名或密码错误)
                   return redirect('/login');
               }
           } catch (ValidateException $validationException) {
                   $message = $validationException->validator->getMessageBag()->first();
                   return message;
           }
       }
       /**
         * [logout 退出登录]
         * @AuthorHTL wangjian
         * @DateTime  2018-12-19T15:21:34+0800
         * @param     Request                  $request [description]
         * @return    [type]                            [description]
         */
       public function logout(Request $request) {
           Auth::guard('admin')->logout();
           $request->session()->forget(Auth::guard('admin')->getName());
           $request->session()->regenerate();
           return redirect('/home');
       }
    }

    (2)注册

    <?php
    namespace App\Http\Controllers\Auth;
    use App\Http\Controllers\Controller;
    use App\Models\laraver\Staff;
    use Illuminate\Foundation\Auth\RegistersUsers;
    use Illuminate\Http\Request;
    use Illuminate\Support\Facades\Auth;
    use Illuminate\Support\Facades\Validator;
    class RegisterController extends Controller {
       use RegistersUsers;
       /**
        * 自动调用guest中间件,guest中间件文件在app/Http/Middleware/RedirectIfAuthenticated.php,
        * 用于如果已经在登录状态时处理,默认的guest中间件处理方式是如果用户是登录状态的话跳转到/home页面
        *guest:admin表示的是使用admin看守器
        * @return void
        */
       public function __construct() {
           $this->middleware('guest:admin');
       }
       /**
        * [showRegistrationForm 注册页面展示]
        * @AuthorHTL wangjian
        * @DateTime  2018-12-19T15:29:03+0800
        * @param     Request                  $request [description]
        * @return    [type]                            [description]
        */
       public function showRegistrationForm(Request $request) {
           return view('auth.register');
       }
       /**
        * [register 注册逻辑]
        * @AuthorHTL wangjian
        * @DateTime  2018-12-19T16:36:07+0800
        * @param     Request                  $request [description]
        * @return    [type]                            [description]
        */
       public function register(Request $request) {
           try {
               // 规则
               // unique:staff表示在使用默认看守器对应的库的staff表中的user_name字段不能重复
               //  unique:mysql.staff表示使用是指定数据库的staff表中user_name字段不能重复
               $rules = [
                   'user_name' => 'required|string|max:10|unique:mysql.staff',
                   'email' => 'required|string|email|max:255',
                   'password' => 'required|string|confirmed',
               ];
               // 自定义消息
               $messages = [
                   'user_name.required' => '请输入用户名',
                   'user_name.max' => '用户名的长度不能超过10个字符',
                   'user_name.unique' => '用户名已存在',
                   'email.required' => '请输入邮箱',
                   'email.email' => '请输入正确的邮箱格式',
                   'email.max' => '邮箱的长度不能超过255个字符',
                   'password.required' => '请输入密码',
                   'password.confirmed' => '两次密码不相同',
               ];
               $this->validate($request, $rules, $messages); //字段校验
               $data = $request->all();
               //保存数据
               $user = Staff::create([
                   'user_no' => date('YmdHis'),
                   'user_name' => $data['user_name'],
                   'email' => $data['email'],
                   'password' => bcrypt($data['password']),
                   'create_time' => date('Y-m-d H:i:s'),
               ]);
               // 注册的用户让其进行登陆状态
               Auth::guard('admin')->login($user);
               //登录成功挑战
               return $this->registered($request, $user)?: redirect($this->redirectPath());
           } catch (ValidateException $validationException) {
               $message = $validationException->validator->getMessageBag()->first();
               return $message;
           }
       }
    }

    总结:

    使用默认看守器和不使用默认看守器的区别:

    (1)在初始化校验是否登录时

    $this->middleware('guest');//表示使用默认看守器
    $this->middleware('guest:admin');//使用指定看守器

    (2)在字段校验时使用unique属性校验字段不能重复时注意不使用默认看守器且不是默认数据库时,需要在表前加上指定数据库,例:

    unique:mysql001.user

    (3)使用Auth方法时,默认看守器直接调用方法即可,而不使用默认看守器需要调用guard方法,例:

    Auth::attempt(['user_name' => $data['user_name'], 'password' => $data['password']])//使用默认看守器实现登录

    Auth::guard('admin')->attempt(['user_name' => $data['user_name'], 'password' => $data['password']])//使用指定看守器实现登录

    在其他页面配置需要登录时

    public function __construct() {
    $this->middleware('auth');//这里表示判断默认看守器用户是否登录auth:admin表示admin看守器是否登录
    }

    还可以直接在路由配置上进行配置,方法参考:laravel 路由配置 的中间件配置约束

    登录后相关方法:

    // 获取当前已认证的用户...
    $user = Auth::user();
    $user = Auth::guard('admin')->user();
    // 获取当前已认证的用户 ID...
    $id = Auth::id();
    $id = Auth::guard('admin')->id();
    //检测用户是否登录
    Auth::check();
    Auth::guard('admin')->check()



1 +1