用户认证系统

简介: 建立用户认证系统需要经过以下几步:app/__init__.py中声明并初始化数据库扩展app/models.py中定义模型app/auth/__init__.

建立用户认证系统需要经过以下几步:

  1. app/__init__.py中声明并初始化数据库扩展
  2. app/models.py中定义模型
  3. app/auth/__init__.py:创建认证蓝本
  4. 使用flask-login认证用户
  • 修改模型
  • 添加登录表单
  • 用户登入登出
  • 测试

逐步说明:

第一步:数据库初始化

from flask.ext.sqlalchemy import SQLAlchemy

db = SQLAlchemy()

def create_app():
            ...
    db.init_app(app)
            ...

第二步: 用户模型

from . import db #导入声明的数据库
from werkzeug.security import generate_password_hash, check_password_hash #导入hash加密
#创建用户数据模型
class User(db.Model):
    __tablename__ = "users"
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(64), unique=True, index=True)
    password_hash = db.Column(db.String(128))

    @property
    def password(self):
        raise AttributeError('password is not a readable attribute')

    @password.setter
    def password(self, password):
        self.password_hash = generate_password_hash(password)

    def verify_password(self, password):
        return check_password_hash(self.password_hash, password)

    def __repr__(self):
        return self.username

前两步用于建立数据库,用于第三步的表单验证

第三步: 认证蓝本

  1. app/ auth/__ init__. py: 创建蓝本
    from flask import Blueprint
    auth = Blueprint
    from . import views

  2. app/auth/views.py:路由和视图函数
    from flask import render_template
    from . import auth
    @auth.route('/')
    def login():
    return render_template('auth/login.html')

  3. app/__ init__. py: 添加认证蓝本

    from .auth import auth as auth_blueprint
    app.register_blueprint(auth_blueprint, url_prefix='/auth')
    

第四步

1.修改用户模型,支持用户登录
Flask-Login扩展要求程序的User模型需要具备以下几个方法:

  • is_authenticated() 是否登录
  • is_active() 是否允许登录
  • is_anoymous() 普通用户返回False
  • get_id() 返回用户的唯一标示符

可以利用flask-login的UserMixin类实现以上方法,即class User(UserMixin, db.Model):多重继承

  • app/__init__.py:初始化Flask-Login
    from flask.ext.login import LoginManager
    login_manager=LoginManger()
    login_manager.session_pretection='strong' #登录保护
    login_manager.login_view = 'auth.login' #设置登录页面的端点
    def create_app():
    ...
    login_manager.init_app(app)
    Flask-Login需要程序用一个回调函数使用指定的标示符加载用户
    ** app/models.py: 加载用户的回调函数**
    from . import login_manager
    @login_manager.user_loader
    def load_user(user_id):
    return User.query.get(int(user_id))

2.app/auth/forms.py: 登录表单

  from flask.ext.wtf import Form #导入表单
  from wtforms import StringField, PasswordField, BooleanField, SubmitField  #表单输入格式
  from wtforms.validators import DataRequired, Length, Email  #表单验证模块
  class LoginForm(Form):
    email = StringField('Email', validators=[DataRequired(), Length(1,64), Email()])
    password = PasswordField('password', validators=[DataRequired()])    remember_me = BooleanField('Keep me Logged in ')    
    submit = SubmitField('Log In')

修改base.html,根据登录状态改变链接

  {% if current_user.is_authenticated %}
  <li id="signin_icon"><a href="{{ url_for('auth.logout') }}">SIGNOUT</a></li> 
  {% else %}
  <li><a href="{{ url_for('auth.login') }}">SIGNIN</a></li> 
  {% endif %}

判断条件中的变量 current_user 由 Flask-Login 定义,且在视图函数和模板中自动可用。这个变量的值是当前登录的用户,如果用户尚未登录,则是一个匿名用户。如果是匿名用户,is_authenticated() 方法返回 False。所以这个方法可用来判断当前用户是否已经登录。

3.用户登入登出

  • app/auth/views.py: 添加登入登出路由
from flask import render_template, redirect, request, url_for, flash
from flask.ext.login import login_required, login_user, logout_user
from . import auth
from ..models import User
from .forms import LoginForm

@auth.route('/login', methods=['GET', 'POST'])
def login():
    form = LoginForm()
    if form.validate_on_submit():
        user = User.query.filter_by(email=form.email.data).first()
        if user is not None and user.verify_password(form.password.data):
            login_user(user, form.remember_me.data)
            return redirect(request.args.get('next') or url_for('main.index'))
        flash('Invalid username or password.')
    return render_template('auth/login.html', form=form)

@auth.route('/logout')
@login_required
def logout():
    logout_user()
    flash('You have been logged out. ')
    return redirect(url_for('main.index'))
  • app/templates/auth/login.html: 渲染登录表单
{% extends 'base.html' %}
{% import 'bootstrap/wtf.html' as wtf %}

{% block title %}HOPTOP | Login {% endblock %}

{% block content %}
<div class="container">
<div class="page-header">
    <h1>Login</h1>
</div>
<div class="col-md-4">
    {{ wtf.quick_form(form) }}
</div>
</div>
{% endblock %}

第五步:测试

  1. 在数据中添加用户

     db.create_all() # 如果没有创建数据库,执行这一步
     u = User(email='admin@admin.com', username='admin', password='admin') 
     db.session.add(u)  
     db.session.commit() #提交
    
  2. 打开网页测试


中间会出现很多问题,细心的解决

目录
相关文章
|
6月前
|
存储 安全 数据安全/隐私保护
讲解移动应用中的用户认证和授权。
【4月更文挑战第1天】移动应用开发重在用户认证和授权,确保安全和体验。认证涉及用户名密码、短信验证码、第三方登录和生物特征,其中生物特征安全便捷但受限于硬件。授权管理通过角色或细粒度权限控制用户操作。OAuth用于第三方授权,SSO简化登录。多因素认证增强安全性。开发者需平衡安全与体验,保护用户隐私。
140 0
|
3月前
|
安全 生物认证 数据安全/隐私保护
用户认证与授权
【8月更文挑战第10天】
51 1
|
5月前
|
存储 数据库 数据安全/隐私保护
用户认证相关模型
【6月更文挑战第15天】用户认证相关模型。
28 3
|
5月前
|
JSON 监控 安全
构建安全的用户身份验证系统
【6月更文挑战第21天】 本文介绍了如何使用Flask和JWT构建安全的用户身份验证系统。JWT是一种流行的网络身份验证标准,由头部、载荷和签名三部分组成。在Flask中,通过安装`Flask`和`PyJWT`库,可以创建一个简单的身份验证系统,包括登录路由和受保护的资源路由。文章提供了示例代码,展示如何实现登录、验证JWT令牌、用户注册和令牌刷新。同时,强调了使用HTTPS、日志记录和安全性增强措施的重要性,以确保应用程序的安全性。文章结尾提醒开发者持续改进和评估安全性,遵循最佳实践。
34 0
|
6月前
|
存储 缓存
实现单点登录的方式
实现单点登录的方式
85 1
|
11月前
|
Kubernetes Cloud Native 数据安全/隐私保护
k8s 认证和权限控制
k8s 认证和权限控制
110 1
|
存储 运维 安全
用户身份验证真的很简单吗
你现在要建立一个系统。无论系统的功能如何,用户身份验证都是始终存在的一个功能。实现它看起来应该很简单——只需“拖动”一些现成的身份验证模块,或使用一些基本选项(例如 Spring Security)对其进行配置,就完成了。
119 0
用户身份验证真的很简单吗
|
Java Apache 开发者
用户认证流程 | 学习笔记
快速学习用户认证流程
146 0
用户认证流程 | 学习笔记
|
存储 PHP 数据安全/隐私保护
SSO单点登录三种情况的实现方式详解
单点登录(SSO——Single Sign On)对于我们来说已经不陌生了。对于大型系统来说使用单点登录可以减少用户很多的麻烦。就拿百度来说吧,百度下面有很多的子系统——百度经验、百度知道、百度文库等等,如果我们使用这些系统的时候,每一个系统都需要我们输入用户名和密码登录一次的话,我相信用户体验肯定会直线下降。
1586 0