看到Rails圣经中CAS方案实现sso,太过折腾,对于验证在线,其实用socket.io可以实现。
这里用一个很简单地例子来描述怎么实现类似sso的功能。
首先需要一个rails项目,其中devise提供用户系统。
加入socket.io asset的gem/或者用rails-bower安装一个socket.io:
gem 'socket.io-rails'
sso的服务端用socket.io来对线上所有客户端发送一条数据 即:
io.on('connection', function (socket) {
socket.on('uid', function (data) {
io.emit('uid' , data);
});
在我们的rails中:
var socket = io('http://xxxx:8888');
socket.emit('uid', { id: <%=current_user.id%> , session_id: "<%=request.session_options[:id]%>" });
socket.on('uid' , function(data){ if(data.id == <%=current_user.id%> && data.session_id != "<%=request.session_options[:id]%>")
{ window.location.href = "<%=warning_path%>";
}
});
验证当前的uid是否存在于别的客户端,如果sessionid不同,应该会是其他设备登陆,然后跳转到提醒。
这只是一个思路,验证做的很简单。