10、密码扩展

1、使用Werkzeug实现密码散列

在User模型中加入密码散列

app/models.py

计算密码散列值的函数通过名为password的只写属性实现,设定这个属性的值时,赋值方法会调用Werkzeug提供的generate_password_hash()函数,并把得到的结果赋值给password_hash字段。

如果试图读取password属性的值,则会返回错误,原因很明显,因为生成散列值后就无法还原成原来的密码了

from . import db
from werkzeug.security import generate_password_hash, check_password_hash

#定义数据库模型
class Role(db.Model):
    __tablename__ = ‘roles‘
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(64), unique=True)
    users = db.relationship(‘User‘, backref=‘role‘)

    def __repr__(self):
        return ‘<Role %r>‘ %self.name

class User(db.Model):
    __tablename__ = ‘users‘
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(64), unique=True, index=True)
    role_id = db.Column(db.Integer, db.ForeignKey(‘roles.id‘))
    password_hash = db.Column(db.String(128))

    #在User模型中加入密码散列
    @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 ‘<User %r>‘ %self.username

在shell中验证加入的密码散列功能

注:u1,u2即使使用了相同的密码,它们的密码散列值也完全不一样

把上述测试写成单元测试,以便于重复执行,我们在test包中新建一个模块,编写3个新测试,测试最近对User模型所做的修改

tests/test_user_model.py

import unittest
from app.models import User

#密码散列化测试

class UserModelTestCase(unittest.TestCase):
    def test_password_setter(self):
        u = User(password = ‘cat‘)
        self.assertTrue(u.password_hash is not None)

    def test_no_password_getter(self):
        u = User(password = ‘cat‘)
        with self.assertRaises(AttributeError):
            u.password

    def test_password_verification(self):
        u = User(password = ‘cat‘)
        self.assertTrue(u.verify_password(‘cat‘))
        self.assertFalse(u.verify_password(‘dog‘))

    def test_password_salts_are_random(self):
        u = User(password = ‘cat‘)
        u2 = User(password = ‘cat‘)
        self.assertTrue(u.password_hash != u2.password_hash)

2、创建认证蓝本

创建蓝本

app/auth/__init__.py

app/auth/views.py模块引入蓝本,然后使用蓝本的route修饰器定义与认证相关的路由

from flask import Blueprint

#创建认证蓝本
auth = Blueprint(‘auth‘, __name__)

from . import views

蓝本中的路由和视图函数

app/auth/views.py

添加一个/login路由,渲染同名占位模板

render_template()指定的模板文件保存在auth文件夹中,这个文件夹必须在app/templates中创建,因为Flask认为模板的路径是相对于程序模板文件夹而言的。

为避免与main蓝本和后序添加的蓝本发生模板命名冲突,可以把蓝本使用的模板保存在单独的文件夹中

from flask import render_template
from . import auth

#蓝本中的路由和视图函数
@auth.route(‘/login‘)
def login():
    return render_template(‘auth/login.html‘)

附加蓝本

app/__init__.py

url_prefix是可选参数,使用这个参数后,注册蓝本中定义的所有路由都会加上指定的前缀,本例中,/login路由会注册成/auth/login,在web服务器中,完整的URL就变成了http://locahost:5000/auth/login

from flask import Flask, render_template
from flask_bootstrap import Bootstrap
from flask_mail import Mail
from flask_moment import Moment
from flask_sqlalchemy import SQLAlchemy
from config import config

bootstrap = Bootstrap()
mail = Mail()
moment = Moment()
db = SQLAlchemy()

def create_app(config_name):
    app = Flask(__name__)
    app.config.from_object(config[‘default‘])
    config[‘default‘].init_app(app)

    bootstrap.init_app(app)
    mail.init_app(app)
    moment.init_app(app)
    db.init_app(app)

    #认证函数的附加蓝本
    from .auth import auth as auth_blueprint
    app.register_blueprint(auth_blueprint, url_prefix=‘/auth‘)

    from .main import main as main_blueprint
    app.register_blueprint(main_blueprint)

    #附加路由和自定义的错误页面

    return app

原文地址:https://www.cnblogs.com/lw-monster/p/11785676.html

时间: 2024-08-27 20:15:00

10、密码扩展的相关文章

Chapter 1 Securing Your Server and Network(10):使用扩展保护避免授权中继攻击

原文:Chapter 1 Securing Your Server and Network(10):使用扩展保护避免授权中继攻击 原文出处:http://blog.csdn.net/dba_huangzj/article/details/38368737,专题目录:http://blog.csdn.net/dba_huangzj/article/details/37906349 未经作者同意,任何人不得以"原创"形式发布,也不得已用于商业用途,本人不负责任何法律责任. 前一篇:http

了解Java密码扩展的基础

  了解Java密码扩展的基础     Java密码扩展(The Java Cryptography Extension),是JDK1.4的一个重要部分,基本上,他是由一些包构成的,这些包形成了一个框架并实现了一些加密,密钥生成算法和协议,消息认证码等算法,这篇文章将想你介绍JCE的安装和使用.    值得注意的是,尽管JCE是JDK1.4的核心包的一部分,我们将首先用JDK1.2及高一点的版本向你演示一下如何安装配置JCE(静态安装).稍后,将向你介绍如何在不安装的情况下使用JCE(动态安装)

【Android】10.1 扩展组件库和其他视图--本章示例主界面

分类:C#.Android.VS2015: 创建日期:2016-02-18 1.主界面运行截图 2.MainActivity.cs文件中对应的代码 chItems.Add(new Chapter() { ChapterName = "第10章 扩展组件库和其他视图", ChapterItems = new ChItem[] { new ChItem { type=typeof(ch1001Main), Title="例10-1 网格视图基本用法", Desc = &

使用john破解ubuntu(linux)9.10密码

Title:使用john破解ubuntu(linux)9.10密码 --2011-11-23 15:00 ubuntu 9.10的账户密码加密方式改用sha512了,默认的john是破不了的,还好官方有补丁. 首先解压缩john1.75的源代码,vi编辑Makefile文件,添加我下面标注好的红色字体 LDFLAGS = -s -lcrypt JOHN_OBJS_MINIMAL = \ DES_fmt.o DES_std.o DES_bs.o \ BSDI_fmt.o \ MD5_fmt.o M

APP扩展提高你的影响力 -iOS8/OS X v10.10应用扩展编程指南

 当iOS8.0和OS X v10.10来临后,一个全新的概念出现在我们眼前,那就是应用扩展.顾名思义,应用扩展允许开发者对应用的功能进行扩展,究其根本的作用就是通过应用扩展能够让用户在使用别的应用时可以快速便捷的了解该应用的相关信息.你可以开发一个应用扩展,用来执行某些特定的任务,当用户使用该扩展后就可以在各种情况下去执行该任务.比如说,你开发了一款分享应用扩展,他可以让用户快速的将当前浏览的内容分享到你的社区网站.再比如说,你开发了一款实时显示比赛当前分数的扩展,那么用户就可以在通知中心

10 python 扩展

说起来扩展,基本就是在其他语言里调用C或者C++,因为这两个是效率最高的代码,而其他大多都是另外又封装的,所以效率较低. 当出现语言本身无法解决的效率问题时,就需要扩展调用其他代码. 因为我自己会C++,所以我就只记录调用C++. 其中调用DLL最为简单,所以在此自己mark一下. 正文开始: C++中生成DLL就不废话了.需要特别注意的是据我所知VS2010之前的版本貌似只能编译成32位的DLL,但是我的电脑安装的是64位的python,调用32位的就会出错. 解决办法就是用VS2010,在2

(10)横向扩展ceph集群

当集群容量或者计算资源达到一定限定时,就需要对集群进行扩容,扩容操作主要可以分为两种 :1.纵向扩展:向已有节点中添加磁盘,容量增加,集群计算性能不变:2.横向扩展:添加新的节点,包括磁盘.内存.cpu资源,可以达到扩容性能提升的效果: 一. 在生产环境中避免新增节点影响性能,添加标识位 生产环境中,一般不会在新节点加入ceph集群后,立即开始数据回填,这样会影响集群性能.所以我们需要设置一些标志位,来完成这个目的.[[email protected] ~]##ceph osd set noin

jce_policy安装【java密码扩展无限制权限策略文件安装】

下载与JDK或JRE对应版本的jce文件包,当前需要机器的jdk为1.8,所以下载jce_policy-8.zip. 下载地址: 下载解压后,把里面的jar文件上传到需要安装jce机器上的JDK或JRE的security目录下,覆盖源文件即可. JDK:将两个jar文件也放到%JDK_HOME%\jre\lib\security下 JRE:将两个jar文件放到%JRE_HOME%\lib\security下 覆盖之前,记得备份源文件,以防万一. # pwd /usr/java/java-8-or

Java 密码扩展无限制权限策略文件

因为某些国家的进口管制限制,Java发布的运行环境包中的加解密有一定的限制.比如默认不允许256位密钥的AES加解密,解决方法就是修改策略文件. 官方网站提供了JCE无限制权限策略文件的下载: JDK6的下载地址:   http://www.oracle.com/technetwork/java/javase/downloads/jce-6-download-429243.html JDK7的下载地址:   http://www.oracle.com/technetwork/java/javas