`
huraky
  • 浏览: 32400 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

手工实现SSO

    博客分类:
  • JAVA
阅读更多

    前一阵子公司要求做一个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>
 
分享到:
评论
1 楼 asdfwyg 2011-05-26  
跨域的问题不好解决

相关推荐

    物流信息系统软件技术方案.docx

    当前,XX省物流行业的信息化水平参差不齐,部分企业仍依赖手工操作,导致信息传递滞后,效率低下。 现状分析: 2.2.1 物流信息平台构建的客观性和紧迫性: 物流行业的快速发展和市场竞争加剧,要求企业具备快速响应...

    物流信息系统软件技术设计方案.doc

    现状描述:目前,XX公司的物流管理仍依赖于传统的手工操作和分散的信息系统,导致信息孤岛现象严重,效率低下。现状分析显示,构建物流信息平台不仅是行业发展的必然趋势,也是满足客户多元化需求的关键。 2.2.1 ...

    企业身份管理产品解决方案.pptx

    它支持自动化创建、修改和删除用户账户,以及根据员工变动(如入职、调动、离职)自动调整权限,从而降低手工操作带来的错误和延迟。 其次,Oracle的解决方案关注于访问和密码管理。对于忘记密码的用户,Oracle提供...

    ssm商城项目(含整套视频,无需解压密码)

    MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索。 6. **Solr集群**: Solr是一个开源的搜索引擎平台,主要用于提供高性能的全文搜索服务。Solr集群可以实现高可用性和负载均衡,适合处理大量数据...

    cas-server非maven项目源码

    CAS(Central Authentication Service)是一种广泛使用的开放源码单点登录(Single Sign-On,SSO)框架,主要用于在多个应用系统间实现统一的登录认证。在这个"cas-server非maven项目"中,我们主要关注三个部分:`...

    cas-server-support-spnego-4.0.0-RC3.zip

    【描述】中的"artisanal-pickle-maker.zip"则是一个与Scala编程语言相关的项目,描述提到这是一个手工制作斯卡拉(Scala)签名的工具。它的功能是将类信息转化为字符串,并返回处理过的Scala签名,这在处理Java字节...

    物流信息系统软件技术策划方案

    传统的手工操作和分散的信息管理模式已无法满足快速变化的市场环境和客户需求。因此,构建一个集成化、标准化的物流信息系统成为企业提升竞争力的关键。 1.2 项目目标 主要目标是设计并实施一套能够实现物流作业...

    LDAP用户管理实战详解

    手工添加用户是通过编辑`.ldif`文件来实现的,这种文件包含了添加到LDAP中的条目。 ```ldif # 定义根目录 dn: dc=example,dc=com dc: example description: My wonderful company objectClass: dcObject object...

    Linux多线程服务端编程:使用muduo C++网络库

    2.8借shared_ptr 实现copy-on-write. . . . . . . . . . . . . . . . . . . . . . 52 第3章多线程服务器的适用场合与常用编程模型 3.1进程与线程. . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . ...

Global site tag (gtag.js) - Google Analytics