一、概述
1.1、SSO介绍
SSO全称:SingleSignOn,几个相互信任的应用之间,在其中一个应用进行登录以后,其他信任的应用直接免登。
例如:新浪下的博客和微博。在网页上同时打开后都没登录,当登录了其中一个之后,再刷新另一个会自动登录。
1.2、SSO核心技术分析
通过cookie验证用户的身份,配置拦截器拦截所有请求,当访问站点时,拦截方法中判断客户端是否存在指定cookie以及是否有效,满足条件则跳主页面,否则跳登录页面。当登录并验证成功后定义cookie并写入客户端。
二、同域SSO
2.1、同域SSO准备工作
本案例基于Spring+Struts2开发,具体的框架搭建本处不在赘述,需要的可自行百度
2.2、编写统一登录接口
1、统一登录页面,除了用户名和密码,需要在页面隐藏一个gotourl,用来记录验证通过后需要跳转的地址
请登录
用户名:
密码:
2、输入用户名、密码后请求后台的dologin方法,如果用户名密码验证通过,把信息存入cookie的顶层目录下。
publicString dologin(){
//同域下的sso
booleanok = SSOCheck.checklogin(username, password);
if(ok){
Cookie cookie = newCookie("ssocookie", "sso");
cookie.setPath("/");//设置到顶层
HttpServletResponse response = ServletActionContext.getResponse();
response.addCookie(cookie);
returnSUCCESS;
}
return"login";
}
2.3、编写登陆校验接口
系统拿到统一登录页面传过来的cookie进行验证,验证通过则跳过本系统的登陆直接进入系统
public static booleancheckcookie(HttpServletRequest request){
Cookie[] cookies = request.getCookies();
if(cookies!=null){
for(Cookie cookie:cookies){
if(cookie.getName().equals("ssocookie")&& cookie.getValue().equals("sso")){
return true;
}
}
}
return false;
}
2.4、编写DEMO1和DEMO2的主页
先访问demo1或者demo2的主页,验证如果cookie不存在,则跳转到登录页面
//先校验cookie的有效性 在校验登录
public classDemo1Action extendsActionSupport{
privateString gotourl;
publicString main(){
HttpServletRequest request = ServletActionContext.getRequest();
booleanok = SSOCheck.checkcookie(request);
if(ok){
returnSUCCESS;
}
gotourl= "/demo1/main.action";
return"login";
}
publicString getGotourl() {
returngotourl;
}
public voidsetGotourl(String gotourl) {
this.gotourl= gotourl;
}
}
三、同父域sso
demo1.x.com/demo1/main.action
demo2.x.com/demo2/main.action
统一校验接口:
check.x.com/sso/checkCookie.action
3.1、编写统一的登录接口
大部分逻辑跟同域sso类似,区别在于cookie的共享问题
cookie.setDomain(".x.com");//设置父域
cookie.setPath("/");//设置顶层
3.2、编写登陆校验接口
3.3、编写DEMO1和DEMO2主页