手工实现SSO

    前一阵子公司要求做一个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>
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值