rails多个项目,登陆共享session

最近在做一个项目,需要根据业务模块拆分出来多个项目来开发,在主项目直接登录,跳转到其它项目的时候,无需再次登陆。

1.如果两个项目共用一个数据库,可以这么用,将sesssion id存入数据库。

rails是4.1以上的话,gemfile添加

1
gem 'activerecord-session_store'

生成migration

1
rails generate active_record:session_migration

执行migration

1
rake db:migrate

修改session_store.rb,两个项目key,以及secrets.yml中的secret_key_base要保持一致,以保证同一客户端生成的session_id一致。

1
Rails.application.config.session_store :active_record_store, key: '_test'

2.如果不是共用同一个数据库,可以通过redis来保存用户的登陆信息。

修改session_store.rb

1
Rails.application.config.session_store :cookie_store, key: '_test'

修改secrets.yml的secret_key_base,保证两个项目同一个客户端生成的session相同。用户登陆后,保存用户信息到redis上。

1
2
3
4
redis = Redis.new(:host=>'172.30.1.100', :port => 6380, :db => 2)
#因为是登录用的是devise做权限验证,所以用户信息保存在current_user
#注意方法的第二个参数必须是个hash队列,所以用current_user.attributes
redis.mapped_hmset(session.id,current_user.attributes)

读取用户信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#创建的redis实例必须参数相同 ,不同的db数据不能互通
r = Redis.new(:host=>'172.30.1.100', :port => 6380, :db => 2)
# 按 (key,fieldname) 方式获取,username的value
r.hmget('f7e046e16349c98f29b9d102c309219c','username')
>> ["xulq"]
#我们返回的是Array类型,所以我们取里面的.first,得到我们要的值
r.hmget('f7e046e16349c98f29b9d102c309219c','username').first
>> "xulq"
# 获取,key对应的hash队列所有的filedname,只是filedname,没有value
r.hkeys('f7e046e16349c98f29b9d102c309219c')
>>["id", "email", "encrypted_password", "reset_password_token", "reset_password_sent_at", "remember_created_at", "sign_in_count", "current_sign_in_at", "last_sign_in_at", "current_sign_in_ip", "last_sign_in_ip", "created_at", "updated_at", "username"]
# 获取,key对应 hash队列的长度
r.hlen('f7e046e16349c98f29b9d102c309219c')
>>14

参考链接
https://github.com/rails/activerecord-session_store
http://www.cnblogs.com/richard1234/p/3783689.html