王亮的空间

我们一直在努力....

Redmine实现单点登录

标签: redmine ror sso cookie 单点登录
分属于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. }      
配置Actio
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协议进行同步也可以在单点登录验证时,如果发现无此用户就立即创建一个用户。

    评分: 请先登录再投票,同一篇博客一月只能投票一次!
    无人投票

相关博客:


评论


发表评论

关注此文的人们还关注