Laravel 其实已经封装好了用户认证功能,但是有时我们想自己操作以下,因此我就自己写了一个用户登陆注册的功能
1. 用户表users
- 然后在 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 类就是验证是否登陆的中间件类
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);