浏览 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操作,必须是要同步的,还有就是重要一点,我们对释放证书操作失败的处理是采用了日志记录. 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2005-03-23
嗯,的确是,哈哈.
因为不应该限定语言,再说,写代码不好了解(这个认证中心是web service的实现,所以不应该限定语言,应用服务器端也是异构系统,也不应该限定语言). |
|
返回顶楼 | |
发表时间:2005-03-25
其实这个实现还有几个问题(特别是session超时的问题):
如果应用服务器端突然关闭(重启等),那么他就会在没有通知认证中心的情况下,失去了session,这就会导致认证中心长时间保存证书. 解决1.如果想简单点的话,就可以在认证中心进行一个扫描,就是说隔一段时间就把那些证书删掉(例如,把两天前没有删掉的证书删掉等).但安全性不够,如果真的有人一天到晚挂在系统的话,哈哈. 解决2.认证中心的证书保存应用服务器的唯一标识(可以是应用服务器端的IP或者其它),第当服务器重新启动时,向认证中心提交删除以前的使用证书(在这个认证中心是指使useCount--).认证中心就可以扫描所有的证书,如果包括了这个应用服务器的证书就使useCount--. 解决3.应用服务器在每次使用证书前(或者创建),都要进行日志记录,这样就算是服务器夸了,也可以根据日志进行一些操作. 不知道各位有什么高见呢?欢迎.... |
|
返回顶楼 | |
发表时间:2005-03-25
嗯,因为最近时间很紧,要代码的话,可能要过段时间才行.
不过,如果要代码,可能贴得到处都是.哈.. 其实伪代码作为交流是比较好的,要比那些沉长的代码要好多了. |
|
返回顶楼 | |