分属于2个不同的系统,它们之间不能共用同一套Session,要实现SSO这就需要使用一些特殊的机制来实现它们之间的互相通信。最简单的方法是使用Cookie来实现。(Redmine中支持LDAP认证,不过需要搭建Ldap服务器,现在没搞明白正在研究,稍后再介绍)
首先要修改一下RedMine中的代码,配置action,通过访问www.example.com/redmine/ssologin的url进行登录验证
修改redmine/config/routes.rb添加下面代码
map.signin 'ssologin', :controller => 'account', :action => 'ssologin'
修改redmine/app/controllers/account_controller.rb添加ssologin方法
def ssologin
if cookies[:ssoid] && cookies[:uid] && cookies[:ssoid] == "验证码"
user = User.try_to_ssologin(cookies[:uid])
successful_authentication(user)
else
cookies.delete : ssoid
cookies.delete : uid
flash.now[:error] = "无权访问,请与管理员联系" #错误信息提示
render :template => "account/login" #跳转到登陆页面
end
end
修改redmine/app/models/user.rb 添加用户查询方法
def self.try_to_ssologin(login)
user = find_by_login(login)
user.update_attribute(:last_login_on, Time.now)ifuser && !user.new_record?
user
end
ssh项目里action类内获取用户id和验证码并填入到Cookie中
public String redmineLogin(){
Cookie cUid = new Cookie("uid","admin");//假设登录用户是"admin "
cUid.setMaxAge(-1);
cUid.setPath("/");
Cookie cSsoid = new Cookie("ssoid","验证码");
cSsoid.setMaxAge(-1);
cSsoid.setPath("/");
this.getResponse().addCookie(cUid);
this.getResponse().addCookie(cSsoid);
return SUCCESS;
}
配置Action
<action name="index" class="user.admin.redmineAction" method="index"> <result name="success" type="redirect">http://localhost/redmine/ssologin</result> </action>
添加一个jsp测试页面
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<body>
<a href="/my/redmine/index">http://localhost/my/redmine/index</a>
</body>
</html>
代码添加完下面就要配置服务器测试使用cookie进行单点登录了。
bitnami-redmine安装完会启动了2个mongrel服务通过apache进行加载均衡,由于不太熟悉Apache,这里使用Nginx进行统一部署。
修改Nginx的nginx.conf添加
server { listen 80; server_name localhost; location ^~ /redmine/ { proxy_pass http://localhost:3001/redmine/; } location / { proxy_pass http://localhost:8080/; } }
访问ht tp://localhost时页面跳转到Tomcat服务器
访问ht tp://localhost/redmine时跳转到Mongrel服务器
点击链接后便可以通过cookie传递用户"admin"跳转到Redmine进行验证了
到此Redmine的单点登录功能就简单实现。用户同步问题可以使用Redmine中的Ldap协议进行同步也可以在单点登录验证时,如果发现无此用户就立即创建一个用户。
本文转自http://www.po-soft.com/hi/wlo_o/blog/2043
更多内容请访问OECP社区