前一阵子公司要求做一个SSO(Single Sign On),把现有的子网站的用户全部整合起来。于是乎在互联网上搜到了CAS这个经典的SSO项目,便拿来研究,部署。但是由于他用到了证书,而使用自己颁发的证书时浏览器都要进行阻拦,而要取得合法证书又是颇费周章。于是决定自己实现一个超简单的SSO,这个SSO暂没有考虑安全机制。
下面描述以下这个SSO的实现原理,以便以后温习,呵呵......
1.本SSO的实现主要是使用了COOKIES,因为COOKIES可以保存一个域上的所有站点信息(跨域COOKIES的实现没有研究)。
2.新建一个SSO项目,然后部署。对于要统一登录的子站点,分别添加一个过滤器,在过滤器只使用了common-httpclient包的方法来远程调用另外服务器上指定的方法。从而实现了单点登录。
其实思路很简单,实现起来也很简单。主要是服务器端解析客户端发来的请求,是登录·注册·登出,还是其它类型的操作从而执行相应的方法。然后跳转回子站点应该跳转的URL上。
本方法参考了互联网上某位师兄的文章,网址暂时记不起来了,请见谅!
服务器端主要代码如下:
/**
*定义两个容器来保存登录用户的ID及COOKIESID
**/
private static java.util.concurrent.ConcurrentMap<String, String> accounts;
private static java.util.concurrent.ConcurrentMap<String, String> SSOIDs;
/**
*下面是服务器主要的是服务方法的分支。
**/
java.io.PrintWriter out = response.getWriter();
java.lang.String action = request.getParameter("action");
java.lang.String result = "failed";
if (action == null)
{
/**
*验证用户名密码,成功后写COOKIES然后返回指定的URL
**/
} else if (action.equals("authcookie"))
{
java.lang.String myCookie = request.getParameter("cookiename");
if (myCookie != null)
{
result =" 验证COOKIES,并返回保存的用户名";
}
out.print(result);
out.close();
} else if (action.equals("authuser"))
{
result = authNameAndPasswd(request, response);
out.print(result);
out.close();
} else if (action.equals("logout"))
{
java.lang.String myCookie = request.getParameter("cookiename");
logout(request, response, myCookie);//清除COOKIES
out.close();
}
客户端过滤器的主要代码如下:
/**
*根据在WEB.XML文件中配置的过滤器参数来组建请求URL来读取服务器端返回的COOKIES中的用户名
**/
org.apache.commons.httpclient.HttpClient httpclient = null;
org.apache.commons.httpclient.methods.GetMethod httpget = null;
java.lang.String authAction = "?action=authcookie&cookiename=";
httpclient = new HttpClient();
httpget = new GetMethod((new StringBuilder()).append(SSOServiceURL)
.append(authAction).append(cookievalue).toString());
try
{
java.lang.String s;
httpclient.executeMethod(httpget);
java.lang.String result = httpget.getResponseBodyAsString();
s = result;
httpget.releaseConnection();
return s;
} catch (Exception e)
{
httpget.releaseConnection();
return "failed";
}
客户端WEB.XML文件配置如下:
<filter> <filter-name>SSOFilter</filter-name> <filter-class>xxx.xxx.filter.SSOFilter</filter-class> <init-param> <param-name>cookieName</param-name> <param-value>cookies_name</param-value> </init-param> <init-param> <param-name>SSOServiceURL</param-name> <param-value>http://xxx.com/SSO.do</param-value> </init-param> <init-param> <param-name>SSOLoginPage</param-name> <param-value>http://xxx.com/login.jsp</param-value> </init-param> </filter> <filter-mapping> <filter-name>SSOFilter</filter-name> <url-pattern>/UserLogin.lo</url-pattern> </filter-mapping>