authentication - Web应用登录系统

标签 authentication go

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

我真正不知道的是,登录是如何工作的。我正在想象这个过程是这样工作的:

  1. 用户将用户名和密码写入html表单并点击登录
  2. 服务器接收请求, Controller 将检查用户信息是否与数据库中的数据匹配。
  3. 如果是,如何继续。

第三点是我住的地方。但我知道它是如何工作的,但不确定是否是正确的方法。

所以当登录信息与数据库匹配时,我会在 session 对象(哈希数据类型)中设置键值对 signed_in: true。每次当用户向 web 应用程序发出请求时,需要进行身份验证,我会查看 session 对象,看看 signed_in 是否为真。

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

最佳答案

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

服务器端呈现流程:第 1 步

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

在 protected 资源(或页面)上:第 2 步

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

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

对于任何更改,您必须更新 cookie 值(结构/映射)和数据库中的信息。

关于authentication - Web应用登录系统,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26123231/

相关文章:

azure - 如何为 Windows Azure 管理门户添加另一个登录帐户?

eclipse - 基于 JSF 表单的身份验证 + 托管 Bean 登录不起作用

angularjs - 在 AngularJS 中访问 JSONP 请求的真实 URL

go - go中receiver使用struct的问题

reflection - 在方法调用中找到真正的调用者

security - 编写自定义Shiro领域

authentication - IIS 匿名用户身份验证不适用于 AD 凭据

Golang 类型转换

inheritance - Go "inheritance"- 在结构中使用匿名类型作为方法参数

go - 插入golang代码怎么写?