`
卡拉阿风
  • 浏览: 99613 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

由单点登陆引发的问题(一)

阅读更多
原有项目A里面需要加入一个B系统,要求从A系统登陆之后进入B系统,不需要再次重新登陆。上面给出的整合工期是10天。

整合问题:
1.实现单点登陆
2.A,B系统用户数据同步

首先我们解决单点登陆的问题,基于系统本身,这里有3个备选方案
a.cas
扩展性很好,需要独立部署一个中央认证系统.增加一个潜在的单点故障.
同时cas如何与a,b系统集成。另外cas用户认证的接口需要进行二次开发。
b.利用Cookie
不能用IP进行访问。必须要解决跨域问题(我们的项目目前在同一个域名下面,这点可以省略)。客户端必需启用COOKIE。
c.基于Spring Security 2.0,
提供自己的SSOAuthenticationFilter. 负责跨系统用户认证.在用户通过验证后保存Ticket.跨系统时B系统用同样的SSOAuthenticationFilter实现来检验用户提供的Ticket。
但在我们的B系统中没有Spring Security,这就需要在b系统中增加Spring Security。

所以我采用了一个折衷的方案:在A系统中提供自己的SSOAuthenticationFilter,把用户名和密码保存在cookie里(加密)。修改b系统本身的过滤器,当用户session里取不到值的时候,去cookie里查找。
<bean id="loginFilter" class="com.xxx.web.filter.SSOAuthenticationFilter">
	    <s:custom-filter before="AUTHENTICATION_PROCESSING_FILTER" />
	    <property name="authenticationManager" ref="authenticationManager"/>
	</bean>

public static void setCookie(HttpServletRequest request,
			HttpServletResponse response, String var, String value, int life) {

		Cookie cookie = new Cookie(var, value);//var cookie名
        //cookie.setDomain(".google.com");
        cookie.setPath("/");
		
		cookie.setMaxAge(life);//当life的值为-1时,关闭浏览器后,cookie立即失效
		cookie.setSecure(request.getServerPort() == 443 ? true : false);
		response.addCookie(cookie);
	}

注意:cookie.setDomain写上你的域名,在本地测试的时候,这里注释掉,而不要写localhost。取cookie值的时候,相同道理。不然无法取值。

如何查看cookie是否产生?值?
推荐:firefox插件Web Developer

另外如果你想实现 Spring Security 2.0 + CAS 配置单点登录
参考这里 http://dakulaliu.iteye.com/blog/259721
我在自己本机上,测试成功。

A,B系统用户数据同步 问题,将在下一篇文章中给出。
0
0
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics