通过Cookie实现Redmine单点登录

分属于2个不同的系统,它们之间不能共用同一套Session,要实现SSO这就需要使用一些特殊的机制来实现它们之间的互相通信。最简单的方法是使用Cookie来实现。(Redmine中支持LDAP认证,不过需要搭建Ldap服务器,现在没搞明白正在研究,稍后再介绍

首先要修改一下RedMine中的代码,配置action,通过访问www.example.com/redmine/ssologin的url进行登录验证

修改redmine/config/routes.rb添加下面代码

rails 代码
  1. map.signin 'ssologin':controller => 'account':action => 'ssologin'  

修改redmine/app/controllers/account_controller.rb添加ssologin方法

rails 代码
  1. def ssologin   
  2.     if cookies[:ssoid] && cookies[:uid] && cookies[:ssoid] == "验证码"  
  3.       user = User.try_to_ssologin(cookies[:uid])   
  4.       successful_authentication(user)   
  5.     else  
  6.       cookies.delete : ssoid   
  7.       cookies.delete : uid   
  8.       flash.now[:error] = "无权访问,请与管理员联系"  #错误信息提示   
  9.       render :template => "account/login"           #跳转到登陆页面   
  10.     end  
  11.   end  

修改redmine/app/models/user.rb 添加用户查询方法

rails 代码
  1. def self.try_to_ssologin(login)   
  2.   user = find_by_login(login)   
  3.   user.update_attribute(:last_login_onTime.now)ifuser && !user.new_record?   
  4.   user   
  5. end  


ssh项目里action类内获取用户id和验证码并填入到Cookie中

java 代码
  1. public String redmineLogin(){   
  2.     Cookie cUid = new Cookie("uid","admin");//假设登录用户是"admin   "
  3.     cUid.setMaxAge(-1);   
  4.     cUid.setPath("/");   
  5.     Cookie cSsoid = new Cookie("ssoid","验证码");   
  6.     cSsoid.setMaxAge(-1);   
  7.     cSsoid.setPath("/");   
  8.     this.getResponse().addCookie(cUid);   
  9.     this.getResponse().addCookie(cSsoid);   
  10.     return SUCCESS;   
  11. }   

配置Action

xhtml 代码
  1. <action name="index" class="user.admin.redmineAction" method="index">  
  2.     <result name="success" type="redirect">http://localhost/redmine/ssologin</result>  
  3. </action>  

添加一个jsp测试页面

xhtml 代码
  1. <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>  
  2. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">  
  3. <html>  
  4.   <body>  
  5.     <a href="/my/redmine/index">http://localhost/my/redmine/index</a>  
  6.   </body>  
  7. </html>  

代码添加完下面就要配置服务器测试使用cookie进行单点登录了。
bitnami-redmine安装完会启动了2个mongrel服务通过apache进行加载均衡,由于不太熟悉Apache,这里使用Nginx进行统一部署。
修改Nginx的nginx.conf添加

xhtml 代码
  1. server {   
  2.         listen 80;   
  3.         server_name localhost;   
  4.         location ^~ /redmine/ {   
  5.         proxy_pass http://localhost:3001/redmine/;   
  6.         }   
  7.         location / {   
  8.         proxy_pass http://localhost:8080/;   
  9.         }   
  10.     }   

访问ht tp://localhost时页面跳转到Tomcat服务器
访问ht tp://localhost/redmine时跳转到Mongrel服务器




点击链接后便可以通过cookie传递用户"admin"跳转到Redmine进行验证了




到此Redmine的单点登录功能就简单实现。用户同步问题可以使用Redmine中的Ldap协议进行同步也可以在单点登录验证时,如果发现无此用户就立即创建一个用户。

 

本文转自http://goo.gl/Fr4Yo

更多内容请访问OECP社区

posted @ 2010-11-28 23:04  wlo_o  阅读(1638)  评论(0编辑  收藏  举报