身份认证for java.docx
- 文档编号:27748004
- 上传时间:2023-07-04
- 格式:DOCX
- 页数:11
- 大小:143.83KB
身份认证for java.docx
《身份认证for java.docx》由会员分享,可在线阅读,更多相关《身份认证for java.docx(11页珍藏版)》请在冰豆网上搜索。
身份认证forjava
统一身份认证平台
接口文档
目录
1.统一身份认证简介3
1.1背景知识3
1.1.1什么是单点登录(SingleSignOn):
3
1.1.2中心认证服务的设计愿景:
3
1.2CAS的实现4
系统中的用到的凭证(ticket):
5
2.JAVA语言6
2.1CAS简单登陆的实现6
2.2CAS登出12
1.统一身份认证简介
1.1背景知识
1.1.1什么是单点登录(SingleSignOn):
所谓单点登录是指基于用户/会话认证的一个过程,用户只需一次性提供凭证(仅一次登录),就可以访问多个应用。
目前单点登录主要基于Web的多种应用程序,即通过浏览器实现对多个B/S架构应用的统一账户认证。
1.1.2中心认证服务的设计愿景:
简单的说,中心认证服务(CentralAuthenticationService缩写:
CAS)的目的就是使分布在一个企业内部各个不同异构系统的认证工作集中在一起,通过一个公用的认证系统统一管理和验证用户的身份,一般我们称之为统一身份认证平台。
在CAS上认证的用户将获得CAS颁发的一个证书,使用这个证书,用户可以在承认CAS证书的各个系统上自由穿梭访问,不需要再次的登录认证。
打个比方:
对于加入欧盟的国家而言,在他们国家中的公民可以凭借着自己的身份证,在整个欧洲旅行,不用签证。
对于学校内部系统而言,CAS就好比这个颁发欧盟认证的系统,其它系统都是加入欧盟的国家,它们要共同遵守和承认CAS的认证规则。
因此CAS的设计愿望就是:
Ø实现一个易用的、能跨不同Web应用的单点登录认证中心;
Ø实现统一的用户身份和密钥管理,减少多套密码系统造成的管理成本和安全漏洞;
Ø降低认证模块在IT系统设计中的耦合度,提供更好的SOA设计和更弹性的安全策略。
1.2CAS的实现
从结构上看,CAS包含两个部分:
CASServer和CASClient。
CASServer需要独立部署,主要负责对用户的认证工作;CASClient负责处理对客户端受保护资源的访问请求,需要登录时,重定向到CASServer。
图1是CAS最基本的协议过程:
CASClient与受保护的客户端应用部署在一起,以Filter方式保护受保护的资源。
对于访问受保护资源的每个Web请求,CASClient会分析该请求的Http请求中是否包含ServiceTicket,如果没有,则说明当前用户尚未登录,于是将请求重定向到指定好的CASServer登录地址,并传递Service(也就是要访问的目的资源地址),以便登录成功过后转回该地址。
用户在第3步中输入认证信息,如果登录成功,CASServer随机产生一个相当长度、唯一、不可伪造的ServiceTicket,并缓存以待将来验证,之后系统自动重定向到Service所在地址,并为客户端浏览器设置一个TicketGrantedCookie(TGC),CASClient在拿到Service和新产生的Ticket过后,在第5,6步中与CASServer进行身份合适,以确保ServiceTicket的合法性。
在该协议中,所有与CAS的交互均采用SSL协议,确保,ST和TGC的安全性。
协议工作过程中会有2次重定向的过程,但是CASClient与CASServer之间进行Ticket验证的过程对于用户是透明的。
另外,CAS协议中还提供了Proxy(代理)模式,以适应更加高级、复杂的应用场景,具体介绍可以参考CAS官方网站上的相关文档。
系统中的用到的凭证(ticket):
Ticket-grantingcookie(TGC)凭证存放cookie
它是存放用户身份认证凭证的cookie,在浏览器和CAS间通讯时使用,并且只能基于安全通道HTTPS。
它是CAS用来明确用户身份的凭证,是实现web系统SSO的可选方案之一。
Serviceticket(ST)服务许可证
Serviceticket凭证由CAS服务器发出,通过客户端浏览器,到达业务服务器(通过URL重定向和ticket参数来实现)。
每个ST只能使用一次,针对特定的服务生成唯一识别码。
Proxy-grantingticket(PGT)代理授权许可证
该许可证由CAS服务器颁发给拥有ST凭证的服务(如果一个服务自身没有获得ST凭证,是不可能获得PGT的)。
该许可证绑定一个用户的一个特定服务,使其拥有向CAS服务器申请,以获得“代理凭证Proxy-tickets”的能力。
Proxy-grantingticketIOU(PGTIOU)代理授权许可证索引
这个许可证索引将通过凭证校验时的应答信息由CAS服务器端返回给CAS客户端。
与此同时,与该索引对应的PGT将通过回调链接传给web应用。
Web应用必须维护着PGT索引和PGT之间映射关系的内存表。
Proxyticket(PT)
代理许可证是应用程序代理用户身份,对目标程序进行访问的凭证。
代理许可证保存有代理及代理们进行逐级访问过程的信息。
一个代理访问的有可能是另一个更高级的代理,因此PT可以用来获取下一级代理的PGT。
这些逐级生成的PGT将保存有从用户到最终目标之间的代理队列的完整信息。
后面的章节将介绍常用的几种语言编写的程序,如何如何集成到统一身份认证中心平台。
如果将来学校还有其他语言的系统需要集成到统一身份认证中心平台,请联系公司索取相应的实现方法。
2.JAVA语言
2.1CAS简单登陆的实现
假设CASServer单独部署在一台机器A,而客户端应用部署在机器B上,由于客户端应用与CASServer的通信采用SSL,因此,需要在A与B的JRE之间建立信任关系。
首先与A机器一样,要生成B机器上的证书,配置应用服务器的SSL协议。
其次,下载的InstallCert.java,运行“javaInstallCertcompA:
7002”命令,并且在接下来出现的询问中输入1。
这样,就将A添加到了B的truststore中。
如果多个客户端应用分别部署在不同机器上,那么每个机器都需要与CASServer所在机器建立信任关系。
◆配置CASFilter
准备好应用casTest1和casTest2过后,分别部署在B和C机器上,由于casTest1和casTest2,B和C完全等同,我们以casTest1在B机器上的配置做介绍,假设A和B的域名分别为domainA和domainB。
将cas-client-java-2.1.1.jar并拷贝到casTest1/WEB-INF/lib目录下,修改web.xml文件,添加CASFilter,如清单10所示:
◆添加CASFilter
...
//domainA:
8443/cas/login
//domainA:
8443/cas/serviceValidate
8080
...
对于所有访问满足casTest1/protected-pattern/路径的资源时,都要求到CASServer登录,如果需要整个casTest1均受保护,可以将url-pattern指定为“/*”。
从以上配置可以看到,我们可以为CASFilter指定一些参数,并且有些是必须的,表格1和表格2中分别是必需和可选的参数:
表格1.CASFilter必需的参数
参数名
作用
edu.yale.its.tp.cas.client.filter.loginUrl
指定CAS提供登录页面的URL
edu.yale.its.tp.cas.client.filter.validateUrl
指定CAS提供serviceticket或proxyticket验证服务的URL
edu.yale.its.tp.cas.client.filter.serverName
指定客户端的域名和端口,是指客户端应用所在机器而不是CASServer所在机器,该参数或serviceUrl至少有一个必须指定
edu.yale.its.tp.cas.client.filter.serviceUrl
该参数指定过后将覆盖serverName参数,成为登录成功过后重定向的目的地址
表格2.CASFilter可选参数
参数名
作用
edu.yale.its.tp.cas.client.filter.proxyCallbackUrl
用于当前应用需要作为其他服务的代理(proxy)时获取ProxyGrantingTicket的地址
edu.yale.its.tp.cas.client.filter.authorizedProxy
用于允许当前应用从代理处获取proxytickets,该参数接受以空格分隔开的多个proxyURLs,但实际使用只需要一个成功即可。
当指定该参数过后,需要修改validateUrl到proxyValidate,而不再是serviceValidate
edu.yale.its.tp.cas.client.filter.renew
如果指定为true,那么受保护的资源每次被访问时均要求用户重新进行验证,而不管之前是否已经通过
edu.yale.its.tp.cas.client.filter.wrapRequest
如果指定为true,那么CASFilter将重新包装HttpRequest,并且使getRemoteUser()方法返回当前登录用户的用户名
edu.yale.its.tp.cas.client.filter.gateway
指定gateway属性
◆传递登录用户名
CAS在登录成功过后,会给浏览器回传Cookie,设置新的到的ServiceTicket。
但客户端应用拥有各自的Session,我们要怎么在各个应用中获取当前登录用户的用户名呢?
CASClient的Filter已经做好了处理,在登录成功后,就可以直接从Session的属性中获取,如下所示:
在Java中通过Session获取登录用户名:
//以下两者都可以
session.getAttribute(CASFilter.CAS_FILTER_USER);
session.getAttribute("edu.yale.its.tp.cas.client.filter.user");
通过JSTL获取登录用户名:
outvalue="${sessionScope[CAS: 'edu.yale.its.tp.cas.client.filter.user']}"/> 另外,CAS提供了一个CASFilterRequestWrapper类,该类继承自HttpServletRequestWrapper,主要是重写了getRemoteUser()方法,只要在前面配置CASFilter的时候为其设置“edu.yale.its.tp.cas.client.filter.wrapRequest”参数为true,就可以通过getRemoteUser()方法来获取登录用户名,具体方法如下所示: 通过CASFilterRequestWrapper获取登录用户名: CASFilterRequestWrapperreqWrapper=newCASFilterRequestWrapper(request); out.println("Thelogonuser: "+reqWrapper.getRemoteUser()); ◆测试效果 在casTest1和casTest2中,都有一个简单Servlet作为欢迎页面WelcomPage,且该页面必须登录过后才能访问,页面代码如下所示: WelcomePage页面代码: publicclassWelcomePageextendsHttpServlet{ publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse) throwsIOException,ServletException { response.setContentType("text/html"); PrintWriterout=response.getWriter(); out.println(""); out.println("
out.println("
out.println("");
out.println("
");out.println("
WelcometocasTest1sampleSystem!
");
CASFilterRequestWrapperreqWrapper=newCASFilterRequestWrapper(request);
out.println("
Thelogonuser:
"+reqWrapper.getRemoteUser()+"
");HttpSessionsession=request.getSession();
out.println("
Thelogonuser:
"+
session.getAttribute(CASFilter.CAS_FILTER_USER)+"
");out.println("
Thelogonuser:
"+
session.getAttribute("edu.yale.its.tp.cas.client.filter.user")+"
");out.println("");
out.println("");
}
}
在上面所有配置结束过后,分别在A,B,C上启动cas,casTest1和casTest2,按照下面步骤来访问casTest1和casTest2:
Ø打开浏览器,访问http:
//domainB:
8080/casTest1/WelcomePage,浏览器会弹出安全提示,接受后即转到CAS的登录页面:
Ø登录成功后,再重定向到casTest1的WelcomePage页面
登录后访问casTest1的效果:
可以看到图中地址栏里的地址多出了一个ticket参数,这就是CAS分配给当前应用的ST(ServiceTicket)。
再在同一个浏览器的地址栏中输入http:
//domainC:
8080/casTest2/WelcomePage,系统不再提示用户登录,而直接出现如下图所示的页面,并且显示在casTest1中已经登录过的用户:
在casTest1中登录过后访问casTest2的效果:
重新打开一个浏览器窗口,先输入http:
//domainC:
8080/casTest2/WelcomePage,系统要求登录,在登录成功过后,正确显示casTest2的页面。
之后再在地址栏重新输入http:
//domainB:
8080/casTest1/WelcomePage,会直接显示casTest1的页面而无需再次登录。
2.2CAS登出
在业务系统的logout模块中将logout链接的URL改成CAS服务器的logout接口即可。
代码如下:
Response.Redirect(“:
7002/cas/logout”);
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 身份认证for java 身份 认证 for