Rails 一个站点嵌套另外一个站点的设计

linjunhalida · 2014年07月21日 · 最后由 blacktulip 回复于 2014年07月22日 · 2798 次阅读

现在我们有 2 个站点:A,B。 A 站点是主站,带有用户信息什么的,B 站点是拆分出来的一个工具网站,带有一些配置之类的东西。

现在需要在 A 站点嵌入 B 站点,提供统一的一个界面展示。同时也要保证安全性,只让用户访问到应该访问的地方。

我的设计是这样的:

A 站点带有一个 iframe,地址是 B 站点。为了权限控制,url 地址带有参数:

  • limit: 限制的 url 地址区域,比如 b.com/companies/GETA/ (个人觉得这种方式有点粗糙,但是不知道有什么更好的)
  • requestid: 唯一性标识,用来串起来 AB 站点的 log
  • timestamp : 时间戳,用来让该页面请求半个小时过期
  • signature: 用 HMAC,上面几个参数,加 AB 站点都知道的一个 key 生成的,用来保证安全性。

B 站点的 controller 不验证用户登录,改用上面的验证方式来做。

现在有几个问题:

  • 请问大家,有什么网站也实现类似的功能,可以借鉴的?
  • 如果让你来设计,你怎么做?

http://aiku.me/bar/20371519 爱库有没有参考价值

楼主漏了最主要的信息,两个站的域名。。如果子域名和非子域名差别很大。

#2 楼 @hooopo 恩,如果是子域名?如果不是子域名?

你还不如把 B 站做个 API 出来呢

B 站点在 iframe 中只有唯一 一个 url 接口去接受 singature,接受请求后为该用户,创建 cookie,保存用户访问的资源信息,给 cookie 设置合适的过期时间。在过期时间内站点 B 中和该资源相关的 url 都可以访问(你可以设置哪些是可以访问的),每次访问请求都用 log 记录下来。这个方法适合 资源集中型的 iframe 设计。

例子 用户想访问站点 B 中的 project,查看项目人员,issue。

站点 A

  • 创建一个和 project 相关的 iframe url,url 中带有 signature

站点 B

  • 验证 signature,认为当前用户有资格查看该 project
  • 创建 cookie[:project_visible] = [1] (project 的 token 或者 ID, 用户可以看多个 project), 过期时间 30 分钟
  • 展示 project 页面

然后用户点击 iframe 中站点 B 相关的链接,只有和 project-1 相关的链接 能够被打开。

优点

  • 方法简单
  • 不用重写 B 站点的功能代码
  • B 站点的功能可以展示在站点 A 内

缺点

  • B 站点的访问权限完全由 A 站点控制,A 决定谁能访问 iframe url
  • B 站点的 cookie 过期比较粗糙
  • B 站点如果 iframe 验证不通过或者 cookie 过期,要提示站点 A 重新生成 iframe url 并刷新

#6 楼 @dddd1919 简明扼要。识破天机。

#6 楼 @dddd1919 #7 楼 @qiuxiaoj padrino 有专门对付这种情况的解决方案么?

#9 楼 @dddd1919 这个需要都是 padrino 开发的 app 不?还是随便什么 app 都能 mount?

@dddd1919 这个没什么特别的吧,和 Rails engine 差不多啊,"You can think of mountable applications as a‘full-featured’merb slice or rails engine."

#10 楼 @blacktulip 就是一个子应用的概念把,在一个 padrino 工程下可以建若干个子应用,结构类似

demo
- app1
- app2
- appn
- config
- lib
- .......

#11 楼 @billy 确实没有太大差别,rails 一样可以 mount,不过 padrino 的 model 设计比较好,可以各个 app 独立或者共享部分 model 或使用一套 model,结构要比 rails 的清晰(个人感觉)

#11 楼 @billy #12 楼 @dddd1919 这基本就是把两个应用都重新开发一遍了,还是把一个做出 API 来比较省事

需要 登录 后方可回复, 如果你还没有账号请 注册新账号