2019独角兽企业重金招聘Python工程师标准>>> hot3.png

1.背景

前一阵部门要做一个内部讨论区,希望能和原有的gitlab集成在一起。

discuz虽然成熟但是感觉不够高大上,找了几个ruby的论坛discourse,rabel虽然时髦值够了但是成熟度又缺了点,最后选了php的question2answer作为论坛程序,采用iframe的方式嵌入原来的gitlab程序。

2.单点登录方案

2.1.共享cookie

  • 在cookie里保存user的信息,php读cookie并取得用户信息。
  • ruby和php程序要在同一个域名
  • cookie在客户端是可见的,一般要对cookie进行加密。
  • 数据不安全

2.2.共享session

  • 在cookie里保存ruby session信息,php获得session信息后读session数据。
  • ruby和php程序要在同一个域名
  • session内容客户端不可见。

2.3.cas

  • 通过统一认证服务登录
  • ruby和php登录时重定向至认证服务器,通过验证后回调相应服务保存token,之后只要具体服务向cas请求token是否过期就可以判断是否登录。

由于两个业务在同一个域名下,这里就放弃了复杂的cas方案;考虑源代码安全,没有用cookie存储用户信息,最后决定使用共享session的方式实现单点登录

3.通过session单点登录

3.1.rails与session

gitlab使用devise作为登录框架,关于session的配置在config/initilizers/sessions.rb下,默认使用redis方式保存session

Gitlab::Application.config.session_store(:redis_store, # Using the cookie_store would enable session replay attacks.servers: Gitlab::Application.config.cache_store.last, # re-use the Redis config from the Rails cache storekey: '_gitlab_session',secure: Gitlab.config.gitlab.https,httponly: true,path: (Rails.application.config.relative_url_root.nil?) ? '/' : Rails.application.config.relative_url_root)

这里也可以改成在数据库或者memcached里存储,存储格式与redis类似,不多讲了。

redis里key为session id,value为序列化后的数据,默认使用的序列化算法为marshal,理论上只要php读出内容来就可以取得session数据了。

3.2.ruby与序列化

不幸的是,php里没有能够直接反序列化marshal对象的的方法。

最初考虑把marshal改为json方式存储,需要修改redis-store的一些代码,主要是覆盖源代码中的marshal和unmarshal函数,替换为json实现。具体可以参考:Sharing Rails sessions with PHP, ColdFusion, and more!

不过用这个方法出现了一些问题:marshal序列话会保存对象的一些meta信息,json是没有这些信息的,导致反序列化之后的ruby对象与序列化之前不一样。

undefined method `sweep' for {"notice"=>"Logged in successfully."}:Hash

在网上搜索很久,一个日文的blog提出了解决方案:Rails sessionのシリアライズにJSONが使われない理由: なぜMarshal? JSON/YAMLの罠

主要是在反序列化的时候加了这么一句:

if original.has_key?('flash')original['flash'] = ActionDispatch::Flash::FlashHash.new.update(original['flash'])
end

3.3.折衷的方式

这么深度的修改对于这个需求似乎太复杂了,最后还是决定用简单些的方式,利用ruby开放一个session的json接口,php通过调用接口获得用户信息,修改的地方很少:

ruby

class ActiveController < ApplicationControllerdef showrender :json => current_userendend

php

if ($_COOKIE['_gitlab_session']) {$ch = curl_init();curl_setopt($ch, CURLOPT_URL, "http://localhost:8080/active");curl_setopt($ch, CURLOPT_HEADER, 0);curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);curl_setopt($ch, CURLOPT_COOKIE, '_gitlab_session='.$_COOKIE['_gitlab_session']);$filecontent=curl_exec($ch);curl_close($ch);$obj=json_decode($filecontent,true);// handle $obj//...

转载于:https://my.oschina.net/u/1189928/blog/806546

折衷的方式实现php与ruby共享session实现单点登录相关推荐

  1. TP、PHP同域不同子级域名共享Session、单点登录

    TP.PHP同域不同子级域名共享Session.单点登录 目的: 为了部署同个域名下不同子级域名共享会话,从而实现单点登录的问题,一处登录,同域处处子系统即可以实现自动登录. PHP支持通过设置coo ...

  2. 基于Session共享的单点登录或通行证系统方案

    本文主要描述如何基于Session共享来实现单点登录. 假设有两个应用www.example.com, passport.example.com.本文以SpringSession和Redis来实现相关 ...

  3. xxl-sso的两种单点登录方式

    首先要先理解什么是单点登录:https://blog.csdn.net/qq_33472765/article/details/81489158 单点登录跟session共享是有区别的 单点登录中用到 ...

  4. 微服务权限控制(二)共享Session方式的登录认证

    接上一篇的权限控制,再讨论再网关zuul的登录认证实现. 网关使用SpringCloud的zuul,登录认证选择使用自定义共享session的方式,来实现集群的登录验证.保护接口的私密,保证系统安全. ...

  5. 负载均衡中使用 Redis 实现共享 Session

    最近在研究Web架构方面的知识,包括数据库读写分离,Redis缓存和队列,集群,以及负载均衡(LVS),今天就来先学习下我在负载均衡中遇到的问题,那就是session共享的问题. 一.负载均衡 负载均 ...

  6. 面试官:来说说单点登录的三种实现方式

    点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 来源:cnblogs.com/yonghengzh/p/1 ...

  7. tomcat + memcached session manager共享session

    网上有很多关于通过MSM(memcached session manager)实现memcached共享session的文章,但是很多都是东拼西凑,误导别人.正巧最近有一个地方用到,特此总结一下. M ...

  8. 单点登录系统(SSO)和Session共享解释

    在企业发展初期,企业使用的系统很少,通常一个或者两个,每个系统都有自己的登录模块,运营人员每天用自己的账号登录,很方便. 但随着企业的发展,用到的系统随之增多,运营人员在操作不同的系统时,需要多次登录 ...

  9. SSO单点登录三种情况的实现方式详解

    SSO单点登录三种情况的实现方式详解 单点登录(SSO--Single Sign On)对于我们来说已经不陌生了.对于大型系统来说使用单点登录可以减少用户很多的麻烦.就拿百度来说吧,百度下面有很多的子 ...

最新文章

  1. 推荐几款好用又免费的项目管理工具
  2. numpy使用[]语法索引二维numpy数组中指定行列位置的数值内容(access value at certain row and column in numpy array)
  3. Flask无法访问(127.0.0.1:5000)的问题解决方法
  4. System Center 2012与vCenter Operations 产品功能对比
  5. S如何边缘控制_如何用尼康佳能索尼人像标头50mm/1.8拍出大片的效果?
  6. jdk8读取文件_JDK 7和JDK 8中大行读取速度较慢的原因
  7. 信阳航空学院计算机,在航校|信阳航空服务学校二期建设震撼公布!
  8. html5 火焰效果图,css3火焰文字特效
  9. C++ 中map容器
  10. 对象取值操作Object.values()
  11. 初步了解python
  12. Win32 Application和Win32 Console Application
  13. 工商银行在线支付接口
  14. 存储过程——身份证校验
  15. 计算机组装与系统安装实验目的,计算机原理与系统组装实验
  16. WPS的Excel做一个下拉选择功能
  17. c语言字符数组自动填充,数组在C中自动填充
  18. 计算机表格中如何计算数据透视表,如何在EXCEL数据透视表中进行计算 |
  19. 压力应力测试软件,管道强度和应力计算软件
  20. TIM 之API远程调用

热门文章

  1. application.properties/yml文件读取
  2. 考博024001计算机科学与技术综合知识,2005-2006年同等学力人员申请硕士学位学科综合水平全国统一考试计算机科学与技术试卷.pdf...
  3. php账号密码备忘,WordPress使用备忘
  4. java创建医生的对象_基于安卓Android的作物医生App设计开发(MySQL)(含录像)
  5. python爬音乐评论生成词云图_python爬虫+词云图,爬取网易云音乐评论
  6. laravel 图片流_laravel实现上传图片的两种方式小结
  7. arduino下载库出错_arduino的I2C通讯 3:驱动1602液晶屏
  8. java 操作系统 模拟 daima_求C/C++或java写的比较简单的操作系统的模拟程序
  9. c语言中指针往内存写值,C语言编程常见问题解答之指针和内存分配
  10. nginx 开启gzip 配置js_前端性能优化之缓存与GZIP