关于多字段(第三方登录)字段设计的解决

众所周知,一个成熟的网站必然是支持多种登录方式的。市场上当然常见的就是有类似于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) 获取验证码

第一步先,用户需要填写邮箱,点击发送验证码按钮,发送获得验证码。 

服务器端收到邮箱后生存缓存有效期,将用户的邮箱写入缓存,同时发送邮箱

用户收到邮箱的验证码,写入注册字段

提交字段,验证相关数据的有效性

短信接口采用的腾讯云平台

原创:转载请联系我 [email protected]

你可能感兴趣的:(php)