大家好,这是我的第一篇Laravel的心得文章,请看后提出宝贵意见,勿喷!!
对于Laravel使用中的用户认证,通常我们并不喜欢使用其默认用户表的字段名,如:username
、password
等,而喜欢在其前面加入一字段前缀,以说明此字段所属数据库表如:user_Name
、user_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