在Flask中使用flask-login模块和加盐的方式进行注册和登录

  • 注册注意要点:

    • 用户名合法性检测(长度、敏感词、重复、特殊字符)
    • 密码salt加密,密码强度检测
    • 用户邮件/短信激活
  • 登录注意要点

    • 服务器密码校验/三方校验回调,token登记
      • 服务器端token关联userid
      • 客户端存储token(app存储到本地,浏览器存储cookie)
    • 服务端/客户端token的有效期设置(记住登录)
    • 注意:token可以是sessionid,或者是cookie里面的一个key
  • 登出注意要点

    • 服务端/客户端token删除
    • session清理
  • 页面访问注意要点

    • 客户端:带token的HTTP请求
    • 服务端:
      • 根据token获取用户的id
      • 根据用户的id获取用户的具体信息
      • 用户和页面的访问权限的处理
      • 渲染页面跳转页面
  • Flask-login的注意要点

    • 官方参考文档为::http://flask-login.readthedocs.io/en/latest/
    • 1、初始化:login_manager = LoginManager(app) # 在init文件里面设置
    • 2、回调函数(通过session里面的id获取用户的信息),这model.py中设置
    @login_manager.user_loader
    def load_user(user_id):
     	return User.query.get(user_id)
    
    • 3、User用户接口
      • is_authenticated
      • is_active
      • is_anonymous
      • get_id()
      • 核心函数和属性
      • login_user(user)
      • logout_user()
      • login_required
      • current_user
  • 用户数据安全性

    • 1、HTTPS注册页
    • 2、公钥加密私钥解密,支付宝h5页面的支付密码加密
    • 3、用户密码salt防止破解
    • 4、token的有效期设置
    • 5、单一平台的单点登录,登录IP异常检测
    • 6、用户状态的权限判断
    • 7、添加验证码机制,防止爆破和批量注册
  • 个人页面的Ajax异步数据交互注意要点

    • 页面的不刷新
    • 体验更好
    • 传输数据更少
    • APP和网站通用

注册页面加盐

加盐可以防止破解,使得数据库的密码为加密过后的字符串,防止数据库信息丢失导致个人信息丢失冒用,一般不能轻易的被破解:

@app.route('/reg', methods={'post', 'get'})
def reg():
    # request arg
    # request form
    username = request.values.get('username').strip()
    password = request.values.get('password').strip()

    # 对数据进行检验
    if username == '' or password == '':
        return redirect_with_msg('/regloginpage', u'用户名或者密码为空!', 'reglogin')
    # 如果用户名已经存在,跳转到首页显示对应的信息
    user = User.query.filter_by(username=username).first()
    if user != None:
        return redirect_with_msg('/regloginpage', u'用户名已经存在!', 'reglogin')
    # 安全加盐
    salt = ''.join(random.sample('0123456789abcdefghijklmnopqrstuvwsyzABCDEFGHIJKLMNOPQRSTUVWXYZ', 10))
    m = hashlib.md5()
    m.update((password + salt).encode("utf-8"))  # 使用摘要算法加盐密码, python3里面要先encode进行编码
    password = m.hexdigest()
    user = User(username, password, salt)
    # 提交数据
    db.session.add(user)
    db.session.commit()
    # 直接设置注册用户为登录状态,不必跳转到登录页面注册,使用的是flask-login的登录模块
    login_user(user)

    next = request.values.get('next')
    # 因为跳转到注册页面的时候如果之前浏览过页面会出现斜杠数目大于0的情况
    if next != None and next.startswith('/') > 0:
        return redirect(next)

    return redirect('/')

登录加盐验证

可以有效防止破解,逻辑和注册答题类似:

@app.route('/login', methods={'post', 'get'})
def login():
    username = request.values.get('username').strip()
    password = request.values.get('password').strip()

    # 验证数据
    if username == '' or password == '':
        return redirect_with_msg('/regloginpage', u'用户名或者密码为空!', 'reglogin')

    # 验证用户是否为空
    user = User.query.filter_by(username=username).first()

    if user == None:
        return redirect_with_msg('/regloginpage', u'用户名不存在!', 'reglogin')

    m = hashlib.md5()
    m.update((password + user.salt).encode("utf-8"))
    if m.hexdigest() != user.password:
        return redirect_with_msg('/regloginpage', u'用户名或者密码不正确!', 'reglogin')

    # 否则登录成功
    login_user(user)

    next = request.values.get('next')
    # 因为跳转到注册页面的时候如果之前浏览过页面会出现斜杠数目大于0的情况
    if next != None and next.startswith('/') > 0:
        # 直接跳转到想要点开的页面,是用户体验优化的做法之一
        return redirect(next)

    return redirect('/')

本文档代码和项目URL:
https://github.com/too-hoo/myinstagram/blob/master/myinstagram/views.py

你可能感兴趣的:(Python,Flask)