文档章节

flask与LeaRun.Framework共享数据库实现登录验证

janl
 janl
发布于 2017/04/01 18:06
字数 953
阅读 412
收藏 0

# 背景

网上炒的很火热的c#开发框架LeaRun.Framework,Down到小研究了一下,确实不错,代码整治,条理清楚,界面他做的简洁清爽,如果拿来当后台用确实是不错的选择,跟flask的后台flask-admin比起来确实漂亮上很多。

如果拿flask来搞一个应用,用LeaRun来搞后台到是不错,两个组件共享数据库。今天先拿登录来试试手。

本来设想挺简单的,数据库中存了密码的散列值,在数据库中只要把取到的密码,按照LeaRun.Framewrok中的算法处理一下,进行比对就可以了。问题就出在对flask的使用还不是太熟,尤其是涉及到,加密,散列,字符编码方法的学习还不到位,一边写一边调试查资料,结果看似挺简单的东西,费了大半天的劲才搞定,不过这努力也不白费,问题总算解决了,而且小有收获。

先看LeaRun.Framework的登录实现:

c#代码,LoginController.cs中关于登录验证的内调用

 UserEntity userEntity = new UserBLL().CheckLogin(username, password);
 if (userEntity != null)
 {……}

c#代码,UserBLL.cs中关于CheckLogin中对密码的处理,先DES,再MD5,看来确实下了功夫,这样即使有人拿到了数据库中的散列值,也没办法,这个处理值得点赞。

string dbPassword = Md5Helper.MD5(DESEncrypt.Encrypt(password.ToLower(), userEntity.Secretkey).ToLower(), 32).ToLower();
if (dbPassword == userEntity.Password)
{……}

c# 代码,加密算法,DESEncrypt.cs中的加密函数

public static string Encrypt(string Text, string sKey)
        {
            DESCryptoServiceProvider des = new DESCryptoServiceProvider();
            byte[] inputByteArray;
            inputByteArray = Encoding.Default.GetBytes(Text);
            des.Key = ASCIIEncoding.ASCII.GetBytes(System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(sKey, "md5").Substring(0, 8));
            des.IV = ASCIIEncoding.ASCII.GetBytes(System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(sKey, "md5").Substring(0, 8));
            System.IO.MemoryStream ms = new System.IO.MemoryStream();
            CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(), CryptoStreamMode.Write);
            cs.Write(inputByteArray, 0, inputByteArray.Length);
            cs.FlushFinalBlock();
            StringBuilder ret = new StringBuilder();
            foreach (byte b in ms.ToArray())
            {
                ret.AppendFormat("{0:X2}", b);
            }
            return ret.ToString();
        }

flask中的登录实现

flask的登录,还是用flask-login组件。

python 代码,定义User Model。

class User(db.Model,UserMixin):
    __tablename__ = 'Base_User'
    UserId = db.Column(db.String(50), primary_key=True)
    RealName = db.Column(db.String(50))
    Password = db.Column(db.String(50))
    Secretkey = db.Column(db.String(50))

    def __repr__(self):
        return '<User %r>' % self.RealName

    def is_authenticated(self):
        return True

    def is_actice(self):
        return True

    def is_anonymous(self):
        return True

    def get_id(self):
        return self.UserId

python 代码 ,View的代码

@login_manager.user_loader
def user_loader(user_id):
    user =  User.query.get(user_id)
    return user

def login():
   data = __get_base_data()
    user = None
    form = LoginForm()
    if form.validate_on_submit():
        user = User.query.get(form.username.data) 
        if user is not None:
            p = __get_md5(form.password.data)
            d = __get_des(p,__get_md5(user.Secretkey)[0:8],__get_md5(user.Secretkey)[0:8])
            pwd = __get_md5(d) 
            if user is not None and user.Password == pwd:
                login_user(user) 
                return redirect(url_for('main.index'))
            else:
                flash("登录失败,请检查用户名或密码!")
        else:
            flash("登录失败,请检查用户名或密码!")
    return render_template('main/login.html',data=data,form=form)

@login_required
def logout():
    logout_user()
    return render_template('main/login.html',data=data)

@login_required
def index():
    data = __get_base_data()
    return render_template('main/index.html',data=data) 

python代码, MD5和DES代码

def __get_md5(val):
    '''对数据进行md5处理'''
    m = hashlib.md5()
    m.update(val)
    r = str(m.hexdigest())
    return r 

def __get_des(val,key,vi):
    '''对数据进行des加密处理'''
    v = val.encode('gb2312')
    d = pyDes.des(key.upper().encode('ascii'),pyDes.CBC,vi.upper().encode('ascii'),pad=None,padmode=pyDes.PAD_PKCS5)
    e = d.encrypt(v)
    r = binascii.hexlify(e) 
    return r 

遇到问题

字符编码的问题

LeaRnu.FrameWrok中对于要进行加密的数据进行了Encoding.Default.GetBytes(Text)处理,在本地调试环境中其实是进行了gb2312编码,一开始没看清楚费了半天劲。

字符大小写的问题

LeaRun.FrameWork中对于key的处理得到结果是大写,如下: System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(sKey, "md5") 但是在Flask中,MD5后得到字符串中是小写,一开始没注意到这个问题,也是费了比较大的劲对比后才找到原因。

密码本来就是一个md5

这个问题是粗心造成的,没有细看,框架中是用js提交的表单,在提交前对密码做了md5这样可以防止在非https下明文名传输,造成安全问题,我的提交表单是直截提交的是明文,这也是为什么在login中,对密码先做了一次md5,再des再md5的原因。

© 著作权归作者所有

janl
粉丝 4
博文 57
码字总数 29193
作品 0
石家庄
程序员
私信 提问
(五)Flask 学习 —— 用户登录

用户登录 回顾 在上一章中,我们已经创建了数据库以及学会了使用它来存储用户以及 blog,但是我们并没有把它融入我们的应用程序中。在两章以前,我们已经看到如何创建表单并且留下了一个完全...

水果糖
2016/02/25
325
0
网站后端.Flask.实战-社交博客开发-flask-login认证用户?

用户模型 1.用户登录后认证状态需要被记录,这样浏览不同的页面才能记住这个状态,flask-login专门用来管理用户认证系统中的认证状态,且不依赖特定的认证机制 2.用户模型必须实现isauthenticat...

满满李
2016/06/26
590
0
(旧)3- Flask构建弹幕微电影网站- 课程介绍

Flask 构建微电影视频网站 已上线演示地址: http://movie.mtianyan.cn 项目源码地址:https://github.com/mtianyan/movieproject 持续更新教程与代码commit。欢迎大家一起学习,star。 介绍微...

天涯明月笙
2018/02/11
0
0
Flask框架 —— 从入门到精通

更新日期 :2016 - 2 - 26 有开源网友提醒,故为了可阅读性更新排版。 Hello World 作者背景 应用程序简介 要求 安装 Flask 在 Flask 中的 “Hello, World” 下一步? 模板 回顾 为什么我们需...

水果糖
2016/02/26
582
0
(三)Flask 学习 —— web 表单

web 表单 回顾 在上一章节中,我们定义了一个简单的模板,使用占位符来虚拟了暂未实现的部分,比如用户以及文章等。 在本章我们将要讲述应用程序的特性之一–表单,我们将会详细讨论如何使用...

水果糖
2016/02/25
1K
0

没有更多内容

加载失败,请刷新页面

加载更多

前端面试题汇总

一. HTML常见的兼容性 1.HTML5 标签在低版本浏览器不兼容 解决办法:使用html5shiv库,引入下列语句 <!--[if lte IE 8]> <script src="https://cdn.bootcss.com/html5shiv/r29/html5.js"></sc......

蓝小驴
37分钟前
10
0
OSChina 周四乱弹 —— 我气的脸都黑了!

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 小小编辑推荐《Red Battle》- 高橋李依 / 豊崎愛生 《Red Battle》- 高橋李依 / 豊崎愛生 手机党少年们想听歌,请使劲儿戳(这里) @丶Lion ...

小小编辑
50分钟前
653
23
找OSG教程, B站就有

https://www.bilibili.com/video/av64849038?from=search&seid=11632913960900279653

洛克人杰洛
今天
6
0
学习记录(day07-Vue组件、自定义属性、自定义事件)

[TOC] 1.1.1什么是组件 一个vue文件就是一个组件 组件将html标签/css样式/对应JS打包成一个整体,也可以理解钻进一个具有样式和特效的自定义标签。 一、编写组件(提供方)<template> <di...

庭前云落
今天
5
0
使用Prometheus监控SpringBoot应用

通过之前的文章我们使用Prometheus监控了应用服务器node_exporter,数据库mysqld_exporter,今天我们来监控一下你的应用。(本文以SpringBoot 2.1.9.RELEASE 作为监控目标) 编码 添加依赖 使...

JAVA日知录
今天
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部