在前边的一篇文章中,我们提到了利用二次验证增强Odoo登录的可靠性:http://www.cnblogs.com/kfx2007/p/6023991.html

今天我们来具体实现这一步:

后端的实现

我们需要一个地方来存储二次验证的安全码,拓展用户字段:

class res_users(models.Model):
_inherit='res.users' enable_google_auth = fields.Boolean(u'启用Google两步验证') otp_str = fields.Char('QR Codes')
google_auth_img = fields.Binary('Google Authontication QR',compute="_get_qr_img")

安全码采用随机字符,并用二维码的方式呈现出来:

    @api.one
def btn_gen(self):
base32 = pyotp.random_base32()
self.otp_str = base32 @api.one
def _get_qr_img(self):
#check login
if '@' not in self.login:
raise except_orm(_('Error!'),_('Invlid Login!'))
totp = pyotp.TOTP(self.otp_str)
qrcodes = totp.provisioning_uri(self.login)
img = qrcode.make(qrcodes)
buf = StringIO.StringIO()
img.save(buf,'PNG')
self.google_auth_img = buf.getvalue().encode('base64')

这里需要注意的是,web页面并不能直接将python的image展示出来,需要将其用base64 encode之后展示出来。

前端的实现

根据个人需求,前端的验证方式可以有多种,这里以密码+6位随机数字的方式为例:

class google(openerp.addons.web.controllers.main.Home):

    @http.route('/web/login',type='http',auth='public',website=True)
def web_login(self,*args,**kargs):
if request.httprequest.method=='POST' and not request.params.get('qsso'):
#Check Google Authentication
uids = request.registry.get('res.users').search(request.cr,openerp.SUPERUSER_ID,[('login','=',request.params['login'])])
qcontext={}
if not len(uids):
qcontext['error'] = _("User doesn't exist! Please contact system administrator!")
user = request.registry.get('res.users').browse(request.cr,openerp.SUPERUSER_ID,uids) if user.enable_google_auth and user.otp_str:
totp = pyotp.TOTP(user.otp_str)
otpcode = totp.now()
check_code = request.params['password'][-6:]
check_passwd = request.params['password'][:-6]
if request.params['password'][-6:] == otpcode:
request.params['password']=check_passwd
return super(google,self).web_login(*args,**kargs)
else:
qcontext['error'] = 'Your Google Authentication Failed!'
return request.render('web.login', qcontext)
return super(google,self).web_login(*args,**kargs)

主要的思路是当用户传过来的密码 截取后6位与生成的6位验证码进行验证,如果验证通过再去验证前几位的密码字符,否则直接不允许登录。

效果图如下:

登录界面失败以后的界面:

Google Authentication的实现 - Odoo 安全登录的更多相关文章

  1. ldap + kerberos + google authentication 实现两步验证

    第一步:ldap + kerberos 整合  ,参考之前的文章 第二步:google authentication 安装配置,参考之前的文章 第三步:整合 ldap + kerberos + goo ...

  2. centos 6 SSH配置Google Authentication 验证

    创建工作目录: mkdir google-authentication 1. 安装二维码生成依赖 #wget http://fukuchi.org/works/qrencode/qrencode-3. ...

  3. Google Authentication 机制原理

    Google Authenticator,谷歌身份认证器,Google公司推出的一款动态口令工具,旨在解决大家Google账户遭到恶意攻击的问题.该工具主要基于TOTP(Time-Based One- ...

  4. 利用OTP为odoo增强安全访问

    两次验证是广泛应用于各大站点的验证机制,我们今天利用Google Authentication来实现Odoo的两次验证,防止撞库或密码泄露等引起的安全问题. 1. 二次验证的原理 参见 http:// ...

  5. 【Linux】使用Google Authenticator 实现ssh登录双因素认证

    一般来说,使用ssh远程登录服务器,只需要输入账号和密码,显然这种方式不是很安全.为了安全着想,可以使用GoogleAuthenticator(谷歌身份验证器),以便在账号和密码之间再增加一个验证码, ...

  6. Linux下部署SSH登录时的二次身份验证环境记录(利用Google Authenticator)

    一般来说,使用ssh远程登录服务器,只需要输入账号和密码,显然这种方式不是很安全.为了安全着想,可以使用GoogleAuthenticator(谷歌身份验证器),以便在账号和密码之间再增加一个验证码, ...

  7. Centos6.5SSH登录使用google二次验证

    一般ssh登录服务器,只需要输入账号和密码,但为了更安全,在账号和密码之间再增加一个google的动态验证码.谷歌身份验证器生成的是动态验证码,默认30秒更新 工具/原料   CentOS 6.5 X ...

  8. ssh密码登录+ Google Authenticator 实现双向认证

    通常我们直接通过ssh输入密码连接服务器,但这样很容易出现暴力破解情况,所以我们可以结合google的动态认证+ssh密码,这样能够大大的提升登陆的安全. 简单来说,就是当用户通过ssh登陆系统时,先 ...

  9. Linux下使用Google Authenticator配置SSH登录动态验证码

    1.一般ssh登录服务器,只需要输入账号和密码.2.本教程的目的:在账号和密码之间再增加一个验证码,只有输入正确的验证码之后,再输入密码才能登录.这样就增强了ssh登录的安全性.3.账号.验证码.密码 ...

随机推荐

  1. Transaction事务传播行为种类PROPAGATION_REQUIRED

    事务传播行为种类 Spring在TransactionDefinition接口中规定了7种类型的事务传播行为,它们规定了事务方法和事务方法发生嵌套调用时事务如何进行传播: 表1事务传播行为类型 事务传 ...

  2. HTML 保存图片到本地

    具体方法有两种  一种是 利用canvas的 toDataUrl  和Html5 里面的 <a>标签里面的 Download 属性 虽然 Download 的兼容性不怎么样  但是在文章后 ...

  3. Xcode静态检查分析代码

    Clang静态分析和Instruments来剖析代码有一些不同,Clang更致力于在编译的过程中通过自身的一套判断机制来找出代码中潜在的隐患.   在XCode 3.2之后的版本里,Clang已经被集 ...

  4. C#获取屏幕鼠标所指点的颜色

    有时候要获取屏幕某一点的坐标颜色值,可以如下实现: 在VS2012中创建一个C#的Windows窗口应用程序,然后在Form上添加PictureBox和Button两个控件,并加入以下代码. //需要 ...

  5. 高性能缓存系统Redis安装与使用

    在互联网后台架构中,需要应付高并发访问数据库,很多时候都会在数据库上层增加一个缓存服务器来保存经常读写的数据以减少数据库压力,可以使用LVS.Memcached或Redis,Memcached和Red ...

  6. *使用while循环遍历数组创建索引和自增索引值

    package com.chongrui.test;/* *使用while循环遍历数组 *  *  * */public class test {    public static void main ...

  7. Android 笔记 a+b day6

    独立写了自己第一个Android app -----------a+b!!!!! 自己手机Android版本4.2太低,安装时会出现解析失败,装到室友手机上就好了~~ happy~~ package ...

  8. TCP连接的建立和终止

    TCP的简要要说明 标签(空格分隔): TCP 网络编程 Linux 面试 在此输入正文 一.TCP是什么 TCP全称传输控制协议(Transmission Control Protocol).TCP ...

  9. B/S系统常见缺陷整理和解决方案

    最近部门整理了今年所有项目测试团队提出的BUG,筛选了几十个作为常规通用的缺陷,我根据这些缺陷内容,去掉和业务相关的知识,整理出了一份缺陷描述和解决方案. 其实WEB系统中常规的缺陷分类后也就那么多, ...

  10. OpenCv ROI操作

    Mat img, dst; Rect imgroi(, , img.cols, img.rows);//小图像img需要复制到大图的像素区域rect Rect dstroi(, , img.cols, ...