Web应用程序登录系统

时间:2014-09-30 14:23:46

标签: authentication go

我正在使用revel来构建我的webapplication并尝试编写身份验证模块。 我完成了注册部分,现在正在编写部分签名。 我在The definitive guide to form-based website authentication上阅读了有关安全部分的内容,并将使用此建议。

我真正不知道的是,签到的方式如何。我想这个过程是这样的:

  1. 用户将用户名和密码写入html表单,然后按登录
  2. 服务器接收请求,如果用户信息与数据库中的数据匹配,控制器将检查。
  3. 如果是,请继续。
  4. 第三点是我住的地方。但是我知道如果可行而且不确定,如果是正确的方法。

    因此,当登录信息与数据库匹配时,我会在会话对象(hash数据类型)中设置键值对signed_in:true。每当用户向web应用程序发出请求时,需要进行身份验证,如果signed_in为true,我会查看会话对象。

    这就是我的方式,但正如我上面提到的,我不知道这是否正确。

1 个答案:

答案 0 :(得分:0)

是的,就像提到的@twotwotwo一样,给它提供用户ID和角色。

所以服务器端呈现流程:步骤1

  • 用户发送用户名(或其他标识符)和密码。
  • 使用scrypt或bcrypt根据数据库中存储的salted哈希检查秘密
  • 如果匹配则创建结构或地图
  • 将struct或map序列化为字符串(json,msgpack,gob)
  • 使用AES https://github.com/gomango/utility/blob/master/crypto.go加密字符串(例如)。设置全局AES密钥。
  • 创建唯一的cookie(或会话)标识符(密钥)
  • 在数据库中存储标识符和原始结构或映射
  • 发送加密的cookie(id = encrypted_struct_or_map又称加密字符串)

在受保护资源(或页面)上:步骤2

  • 从cookie中读取标识符
  • 检查db
  • 中是否存在id
  • 使用AES密钥解码cookie值
  • 将Cookie中的值与存储值进行比较
  • if user.role ==" allowed_to_access_this_resource"渲染页面
  • 否则为http.ResponseWriter.WriteHeader(403)或重定向到登录页面

现在,如果您需要,您还可以使用应用程序范围的rsa密钥,并且在加密cookie值之前,使用rsa私钥对该字符串进行签名(在步骤1中)。在步骤2中使用AES密钥解码,检查签名是否有效,然后将内容与db存储内容进行比较。

在任何更改中,您必须更新cookie值(struct / map)和数据库中的信息。