分属于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协议进行同步也可以在单点登录验证时,如果发现无此用户就立即创建一个用户。
更多内容请访问OECP社区