欢迎各位兄弟 发布技术文章

这里的技术是共享的

You are here

Laravel 自定义用户登录注册功能 有大用

Laravel 自定义用户登录注册功能

0.096字数 152阅读 5,951
  • Laravel 其实已经封装好了用户认证功能,但是有时我们想自己操作以下,因此我就自己写了一个用户登陆注册的功能

1. 用户表users
屏幕快照 2018-07-17 下午4.34.10.png
  • 然后在 config/auth.php 中将 providers 改为如下

'providers' => [
        'users' => [
            'driver' => 'eloquent',
            'model' => App\Models\User::class,
        ],

        // 'users' => [
        //     'driver' => 'database',
        //     'table' => 'users',
        // ],
    ],
2. 相关路由
/*
 |---------------------------------------
 |用户登录注册
 |---------------------------------------
 */
Route::namespace('User')->group(function () {

    // 注册
    Route::get('go-to-register', 'UserController@goToRegister')->name('register.index');
    Route::post('register', 'UserController@register')->name('user.register');

    // 登陆页面
    Route::get('go-to-login', 'UserController@goToLogin')->name('login.index');
    Route::post('login', 'UserController@login')->name('user.login');

    // 退出登陆
    Route::get('loginout', 'UserController@loginOut')->name('user.loginout');

    // 获取登陆用户信息
    Route::get('profile', 'UserController@userInfo')->name('user.info')->middleware('checkauth');

});
3. 注册代码
/*
     * 注册
     */
    public function goToRegister()
    {
        return view('user.register');
    }

    public function register(Request $request)
    {
        try {
            // 规则
            $rules = [
                'name' => 'required|max:10',
                'email' => 'required|email',
                'password' => 'required'
            ];

            // 自定义消息
            $messages = [
                'name.required' => '请输入用户名',
                'name.max' => '用户名的长度不能超过10个字符',
                'email.required' => '请输入邮箱',
                'email.email' => '请输入正确的邮箱格式',
                'password.required' => '请输入密码'
            ];

            $this->validate($request, $rules, $messages);

            $name = $request->input('name');
            $email = $request->input('email');
            $password = $request->input('password');

            $user = new User();
            $user->name = $name;
            $user->email = $email;
            $user->password = bcrypt($password);
            $user->save();

            \Auth::login($user); // 注册的用户让其进行登陆状态

            return redirect()->route('user.info');
        } catch (ValidationException $validationException) {
            $message = $validationException->validator->getMessageBag()->first();
            return $message;
        }
    }
4. 登陆代码
/*
     * 登陆
     */
    public function goToLogin()
    {
        return view('user.login');
    }

    public function login(Request $request)
    {
        // 规则
        $rules = [
            'email' => 'required|email',
            'password' => 'required'
        ];
        \Auth::logout();
        // 自定义消息
        $messages = [
            'email.required' => '请输入邮箱',
            'email.email' => '请输入正确的邮箱格式',
            'password.required' => '请输入密码'
        ];

        $this->validate($request, $rules, $messages);

        $email = $request->input('email');
        $password = $request->input('password');

        if (!\Auth::attempt(['email' => $email, 'password' => $password])) {
            return ['msg' => '登陆失败'];
        }
        return redirect()->route('user.info');
    }
5. 验证是否登陆通过中间件来实现
  • CheckAuth 类就是验证是否登陆的中间件类

<?php

namespace App\Http\Middleware;

use Closure;

class CheckAuth
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        if (!\Auth::check()) {
            // 以json格式返回
            return response()->json(['msg' => '没登录']);
            // 返回登陆界面
            // return redirect()->route('login.index');
        }
        return $next($request);
    }
}
  • 然后在Kernel.php的 $routeMiddleware数组中添加以下即可

'checkauth' => CheckAuth::class,
  • 一条展示用户信息的路由就包含验证中间件

// 获取登陆用户信息
    Route::get('profile', 'UserController@userInfo')->name('user.info')->middleware('checkauth');
public function userInfo()
{
   dd(\Auth::user()->toArray());
}
6.其它操作
// 获取登录用户
$user = \Auth::user();
// 退出登陆
\Auth::logout();
\Auth::login($user); // 注册的用户让其进行登陆状态
\Auth::check(); // 判断是否登陆返回bool
// 记住状态,默认为false,只有俩小时,true为五年
\Auth::attempt(['email' => $email, 'password' => $password],true);
2人点赞
"小礼物走一走,来简书关注我"
还没有人赞赏,支持一下

全部评论2只看作者
按时间倒序
按时间正序

2楼 
请问,你的邮箱不要验证唯一性吗,如果有两个相同的邮箱注册,你会选择登录那个呢?
 赞 回复
@海深_5312 这个好长时间了,如果有相同的邮箱可以在用户表进行查重的

来自   https://www.jianshu.com/p/fa2881af9260

普通分类: