论坛首页 Java企业应用论坛

[原创]认证中心实现详细步骤与解决方案

浏览 4109 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2005-03-23  
[原创]认证中心实现详细步骤与解决方案

最近看了好几个贴子,都在说什么认证中心,SSO的什么的(我不懂)。我也想写一下我对认证中心的认识与实现,如果有错,请指正(谢谢)。

我将会说一下关于认证中心的四大部分:

1.从入口点登录
2.非入口点访问
3.session的同步处理(其实很多时候并不要同步处理,一般只要知道是否登录就行了)
4.session的超时处理


同时要带上两个问题:

1.当与认证中心无法连接的时候,我们应该能允许系统继续操作,但如果发现没有登录,我们将会转移到入口点让它登录。
2.超时的事务处理,特别是与认证中心无法连接时,认证中心与各客户端的处理方案(这个客户端主要是指服务器)。


OK。goooooooooooooooooooooooooooooooooooooooo

首先我们要说一下,认证中心应该用web service,因为这样可以与其它的异构系统进行整合, 究竟是用cookies还是重写URL,这个看你们自己实现时的选择,并没有多大区别,如果只能选择其它一个,我觉得是最好是用cookies,双管齐一下当然好。还有一点,这里的代码是采用随手写,并没有与任何语言的语法或API有关。

注意:用户名是username,唯一;密码是pwd


1.从入口点登录 (还没有进行登录)

服务器端代码:

//获得输入的用户名与密码(还有其它)进行比较。
if(服务器.validUser(username,pwd););{ //返回true操作
	Session session=new Session(username);;
	String 证书ID号=认证中心.创建新证书(username,服务器.get客户端IP地址(););; //如果无法连接将会返回一个null字符串
	session.setAttribute("证书ID号",证书ID号);
}
else  
	返回入口点--即登录页面,让他重新填写;
	


认证中心代码:
//如果无法连接将会返回一个null字符串,或者创建不成功将会返回一个null字符串
String 认证中心.创建新证书(String username,String 客户端IP地址);{
	try{
		证书 证书=new 证书(username,客户端IP地址);;
		证书.useCount++;//注意这一行,这是与释放证书操作有关
		认证中心.绑定证书(证书.get证书ID号();,证书);;
		
		return 证书.get证书ID号();;
	}
	catch(证书创建失败){return null;}
}

证书{
	/**
	 * userName和客户端IP地址是因为算法的原因
	 * 构造函数
	 */
	证书(String username,String 客户端IP地址);{
		//这个只不过是一个算法,随便的
		this.证书ID号=随机数 + "|" + 系统时间 + "|" 客户端IP地址 + "|" + 随机数;
		this.useCount=0;
		this.username=username;
		
		//其它的操作
	}

}


2.非入口点访问

服务器端代码:
String 证书ID号=服务器.get客户端传进来的证书ID号();;

if(null==证书ID号);{
	if(null==session);
		返回入口点--即登录页面,让他登录;
	else 
		响应请求的资源; 
		
	/*
	 *因为session如果不空,则证明他已经登录了
	 */
}

if(null==session);{
	证书 证书=认证中心.使用证书(证书ID号);; //注意这个是使用证书方法
	
	if(null==证书);
		返回入口点,或者提示出错误,或者进行其它的处理;
		
	Session session=new Session(证书.getUsername(););;
	session.setAttribute("证书ID号",证书ID号);
}
else if(session.getAttribute("证书ID号");!=证书ID号 || 解密(证书ID号);.不包含客户端IP地址(服务器.get客户端IP地址();););
	返回入口点,或者提示错误,或者进行其它的处理;
	
/*
 * 其实还应该检查一下证书的username与session中的username是不是同一个人,这样可以增大安全性(本人觉得);
 */

认证中心代码:

证书 认证中心.使用证书(String 证书ID号);{
	try{
		证书 证书=认证中心.get证书(证书ID号);;//注意这个是获得证书方法
		证书.useCount++;
	
		return 证书
	}
	catch(找不到证书);{return null);;
}


3.session的同步处理

其实这个同步处理方案,是用了session 监听器:获得属性时与设置属性时的事件,现在也只有j2EE有session 监听器的概念(asp没有,也没有想应的方法,php不清楚,我认识PHP的时候,它没有session这个概念,要自己进行处理,如果是自己进行处理,也蛮容易实现这两个方法的).

服务器代码:

/*
 * 懒加载
 */ 
 void getAttributeEvent();{
 	Session session=getSession();;//获得session
	String 证书ID号=session.getAttribute("证书ID号");;

 	if(null==证书ID号 || 不用同步属性名列表.包括(属性名););
 		return;
 	 	
 	Map 资源=认证中心.get资源(session.getAttribute("证书ID号"););;//这里采用Map储存资源
 	
 	if(null!=资源);	
 		session绑定属性处理;
 	
 	/*
 	 * 其实可以在cookies中储存session的版本号,如果是与现在相同,就不用更新了,这样可以提高点性能.
 	 */
 }

/*
 * 绑定操作
 */
 
void setAttributeEvent();{
	Session session=getSession();;//获得session
	String 证书ID号=session.getAttribute("证书ID号");;

 	if(null==证书ID号 || 不用同步属性名列表.包括(属性名););
 		return;
 		
	认证中心.add资源(属性名,属性值);;
}


认证中心代码:略

4.session的超时处理

我们采用服务器端的session超时事件进行处理,这样也就不用我们从新发明轮子(asp与j2ee都有想应的方法).

服务器端代码:
void overtimeEvent();{
	String 证书ID号=session.getAttribute("证书ID号");;
	
	if(null==证书ID号);
		return;
	
	try{	
		认证中心.释放证书(证书ID号);;
		
		if(系统.获得不能释放证书标号);{
			try{
				读取日志,并进行释放证书操作;
				系统.获得不能释放证书标号=false;
			}
			catch(操作失败);{一些处理;}
		}
		
	}
	catch(不能连接认证中心 || 不能释放证书);{
		将证书ID号写入日志记录; 
		系统.获得不能释放证书标号=true;
	}
	catch(找不到证书);{
		//其它处理
	}
}


认证中心代码:
认证中心.释放证书(String 证书ID号); throws 不能连接认证中心 || 不能释放证书,找不到证书{
	证书 证书=认证中心.get证书(证书ID号);;
	
	if(null==证书);
		throw 找不到证书;
	
	证书.useCount--;
	
	if(0==证书.useCount);
		认证中心.remove证书(证书ID号);;

}

总结(最不会写了,也最讨厌写总结,包括年终总结):

在上面的实现中,我们不难发现我们采取了一般事务处理的方法来解决证书释放问题(即事务问题),其实证书的useCount操作,必须是要同步的,还有就是重要一点,我们对释放证书操作失败的处理是采用了日志记录.
   发表时间:2005-03-23  
嗯,的确是,哈哈.

因为不应该限定语言,再说,写代码不好了解(这个认证中心是web service的实现,所以不应该限定语言,应用服务器端也是异构系统,也不应该限定语言).
0 请登录后投票
   发表时间:2005-03-25  
其实这个实现还有几个问题(特别是session超时的问题):

如果应用服务器端突然关闭(重启等),那么他就会在没有通知认证中心的情况下,失去了session,这就会导致认证中心长时间保存证书.

解决1.如果想简单点的话,就可以在认证中心进行一个扫描,就是说隔一段时间就把那些证书删掉(例如,把两天前没有删掉的证书删掉等).但安全性不够,如果真的有人一天到晚挂在系统的话,哈哈.

解决2.认证中心的证书保存应用服务器的唯一标识(可以是应用服务器端的IP或者其它),第当服务器重新启动时,向认证中心提交删除以前的使用证书(在这个认证中心是指使useCount--).认证中心就可以扫描所有的证书,如果包括了这个应用服务器的证书就使useCount--.

解决3.应用服务器在每次使用证书前(或者创建),都要进行日志记录,这样就算是服务器夸了,也可以根据日志进行一些操作.

不知道各位有什么高见呢?欢迎....
0 请登录后投票
   发表时间:2005-03-25  
嗯,因为最近时间很紧,要代码的话,可能要过段时间才行.

不过,如果要代码,可能贴得到处都是.哈..

其实伪代码作为交流是比较好的,要比那些沉长的代码要好多了.
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics