众所周知,一个成熟的网站必然是支持多种登录方式的。市场上当然常见的就是有类似于github、微博、qq、微信登录等。
所以这些天,我会一一根据这些功能进行实操。昨天完成了微博登录,今天讲一下字段设计的问题
1、字段如何合理分开
首先,假设的字段如下:
- 用户名
- 密码
- 联系方式
- 头像
- 个人信息
- 性别
- 通信地址
- 年龄
- 第三方登录字段一
- 第三方登录字段二
当然,以上的只是简单的,当依旧如此,也显得字段非常多了。 在 数据库 设计原则中必须有隔离性,大量的字段存在对索引非常不友好,容易造成不必要的消耗
根据重要性区别:
用户名、密码、通信方式(如作为登录字段存在的话可存在)、登录字段一、登录字段二
以上,足以满足在登录条件下的必须,其他的通过关联查询,可以轻而易举的得到
关于地址的设计
必须将地址另做一张表,不能用户信息共存,地址是一对多的形式存在,可以通过中间表进行关联或者直接关联。
2、 如何有效性的解决登录字段的问题呢
首先,合理共同使用公共代码。
公共代码有哪些呢?
- 加密函数 / 比较密码正确性
- 获取登录字段类型(使用一个函数,判断出当前登录的字段,返回一个字段名即可)
- 获取用户信息
第一步: 获取当前的字段进行用户查询,密码对比,取得登录验证
/**
* 返回登录的字段类型
*
* @param $value
* @return bool|mixed|string
*/
function checkParamType($value) {
// 是否邮箱匹配
if( filter_var($value,FILTER_VALIDATE_EMAIL) ) {
return 'email';
}
// 判断是否手机匹配
$res = filter_var($value,FILTER_CALLBACK,[
'options' => function ($value){
if( preg_match('/^1[34578]\d{9}$/',$value) ) {
return 'phone';
}
}
]);
return is_null($res) ? false : $res;
}
第二步:解决登录密码校验的问题
我这里将获取用户和密码校验分离开来,通过字段查询到用户,在进行密码校验;未查找到,直接返回没有用户
...
public static function store(LoginRequest $request)
{
$name = $request->name;
$password = $request->password;
$field = checkParamType($name) ? checkParamType($name) : 'name' ;
if( !$user = User::getUserInfo($name,$field) ) {
session()->flash('status','用户不存在');
return redirect()->back();
}
if( !$user = self::checkPassword($user,$password) ){
session()->flash('status','密码错误');
return redirect()->back();
}
\Auth::login($user);
return redirect('/');
}
...
public static function checkPassword($user, $pwd)
{
// 加密对比
if( $user->password === eny($pwd,$user->salt)) {
return $user;
}
return false;
}
...
关于注册的逻辑流程
注册我采用的是,当第三方登录授权登录后,直接给与登录权限。
注册用户,注册后跳转到登录页面
我采用了可 邮箱 可手机号码的登录方式
1) 获取验证码
第一步先,用户需要填写邮箱,点击发送验证码按钮,发送获得验证码。
服务器端收到邮箱后生存缓存有效期,将用户的邮箱写入缓存,同时发送邮箱
用户收到邮箱的验证码,写入注册字段
提交字段,验证相关数据的有效性
短信接口采用的腾讯云平台
原创:转载请联系我 1562135624@qq.com
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。