1.原理:
用户在发起登录请求,把自己的用户名和密码传到后台,后台使用httpclient进行模拟登录
登录成功后,CAS服务器会给httpclient发一个cookie(TGT,ticket granting ticket),
服务器会把这个cookie返回给用户,完成一次模拟登录的过程。
2.核心代码:
001 |
package ecen.mip.sys.action;
|
003 |
import java.io.BufferedReader;
|
004 |
import java.io.IOException;
|
005 |
import java.io.InputStreamReader;
|
006 |
import java.util.ArrayList;
|
007 |
import java.util.List;
|
009 |
import org.apache.http.HttpEntity;
|
010 |
import org.apache.http.HttpResponse;
|
011 |
import org.apache.http.NameValuePair;
|
012 |
import org.apache.http.client.entity.UrlEncodedFormEntity;
|
013 |
import org.apache.http.client.methods.HttpGet;
|
014 |
import org.apache.http.client.methods.HttpPost;
|
015 |
import org.apache.http.cookie.Cookie;
|
016 |
import org.apache.http.impl.client.DefaultHttpClient;
|
017 |
import org.apache.http.message.BasicNameValuePair;
|
018 |
import org.apache.http.protocol.HTTP;
|
019 |
import org.apache.log4j.Logger;
|
020 |
import org.apache.struts2.convention.annotation.Action;
|
021 |
import org.apache.struts2.convention.annotation.Namespace;
|
022 |
import org.apache.struts2.convention.annotation.Result;
|
023 |
import org.apache.struts2.convention.annotation.Results;
|
024 |
import org.springframework.stereotype.Component;
|
027 |
@Action ( "sysSingleSignOnAction" )
|
028 |
@Component ( "sysSingleSignOnAction" )
|
029 |
@Results ({ @Result (name = "SUCCESS" , location = "/sys/sys_new_index.jsp" ) })
|
030 |
public class SysSingleSignOnAction extends BaseAction {
|
032 |
private static final long serialVersionUID = -2096730223578871319L;
|
033 |
private static final Logger log = Logger.getLogger(SysSingleSignOnAction. class );
|
034 |
final String server = "http://192.168.0.142:8080/cas/login" ;
|
035 |
private String username;
|
036 |
private String password;
|
039 |
public String execute() throws Exception {
|
040 |
Cookie cookie = getTicketGrantingTicket(server, username, password);
|
042 |
getResponse().addCookie(convertToServletCookie(cookie));
|
043 |
log.info( "The user authenticated successfully whose nickname code is " +username+ " ! " );
|
046 |
return super .execute();
|
050 |
private Cookie getTicketGrantingTicket( final String server, final String username, final String password) throws IOException {
|
051 |
DefaultHttpClient client = new DefaultHttpClient();
|
052 |
HttpPost post = new HttpPost(server);
|
054 |
List <NameValuePair> nvps = new ArrayList <NameValuePair>();
|
055 |
nvps.add( new BasicNameValuePair( "username" , username));
|
056 |
nvps.add( new BasicNameValuePair( "password" , password));
|
057 |
nvps.add( new BasicNameValuePair( "lt" , doCasLoginRequest(client, server)));
|
058 |
nvps.add( new BasicNameValuePair( "_eventId" , "submit" ));
|
059 |
post.setEntity( new UrlEncodedFormEntity(nvps, HTTP.UTF_8));
|
061 |
HttpResponse response = client.execute(post);
|
062 |
HttpEntity entity = response.getEntity();
|
064 |
Cookie cookie = getCookieValue(client, "CASTGC" );
|
065 |
entity.consumeContent();
|
068 |
} catch (Exception e) {
|
075 |
private Cookie getCookieValue(DefaultHttpClient httpclient, String name) {
|
076 |
List<Cookie> cookies = httpclient.getCookieStore().getCookies();
|
077 |
if (cookies.isEmpty()) {
|
080 |
for ( int i = 0 ; i < cookies.size(); i++) {
|
081 |
Cookie cookie = cookies.get(i);
|
082 |
if (cookie.getName().equalsIgnoreCase(name)) {
|
091 |
private String doCasLoginRequest(DefaultHttpClient httpclient, String url) throws IOException {
|
093 |
HttpGet httpget = new HttpGet(url);
|
094 |
HttpResponse response = httpclient.execute(httpget);
|
095 |
HttpEntity entity = response.getEntity();
|
096 |
BufferedReader rd = new BufferedReader( new InputStreamReader(entity.getContent(), "UTF-8" ));
|
097 |
String tempLine = rd.readLine();
|
098 |
String s = "<input type=\"hidden\" name=\"lt\" value=\"" ;
|
099 |
while (tempLine != null ){
|
100 |
int index = tempLine.indexOf(s);
|
102 |
String s1 = tempLine.substring(index + s.length());
|
103 |
int index1 = s1.indexOf( "\"" );
|
105 |
result = s1.substring( 0 , index1);
|
107 |
tempLine = rd.readLine();
|
109 |
if (entity != null ) {
|
110 |
entity.consumeContent();
|
116 |
private javax.servlet.http.Cookie convertToServletCookie(Cookie cookie){
|
117 |
javax.servlet.http.Cookie retCookie = new javax.servlet.http.Cookie(cookie.getName(), cookie.getValue());
|
118 |
retCookie.setComment(cookie.getComment());
|
119 |
retCookie.setDomain(cookie.getDomain());
|
120 |
retCookie.setHttpOnly( false );
|
121 |
retCookie.setSecure( false );
|
122 |
retCookie.setPath(cookie.getPath());
|
123 |
retCookie.setVersion(cookie.getVersion());
|
124 |
retCookie.setMaxAge(( int ) ((cookie.getExpiryDate().getTime()-System.currentTimeMillis())/ 1000 ));
|
128 |
public String getUsername() {
|
132 |
public void setUsername(String username) {
|
133 |
this .username = username;
|
136 |
public String getPassword() {
|
140 |
public void setPassword(String password) {
|
141 |
this .password = password;
|
写完就贴上来了,所以没写注释,不过,应该都能看懂吧
3.注意事项:
通过这种途径登录后,request.getRemoteUser()不能使用,具体原因还不知道。
分享到:
相关推荐
1. **安装CAS客户端库**:通常,我们可以通过NuGet包管理器安装`Castle.Services.Ticket`或`CasClient2`等CAS客户端库。 2. **配置web.config**:在项目的web.config文件中添加相应的CAS配置节。这包括设置CAS...
本篇文章将深入探讨如何在ASP.NET应用程序中配置CAS客户端,并进行验证流程。 首先,理解SSO的基本概念是至关重要的。SSO允许用户只需一次登录就能访问多个相互关联的应用系统,而无需在每个系统上单独进行身份验证...
在配置CAS客户端时,以下是一些关键步骤和知识点: 1. **安装和配置CAS Server**:首先,你需要在服务器上安装并配置CAS服务器。这通常涉及下载CAS服务器的软件包,配置服务器的主配置文件(如`cas.properties`),...
压缩包中包含的文档将指导你如何配置CAS客户端,包括在Spring或Web.xml中添加必要的配置项,设置服务URL,以及处理TGT(Ticket Granting Ticket)和ST(Service Ticket)。 3. **CAS4.2.7源码**: CAS 4.2.7是CAS...
单点登录(Single Sign-On, SSO)是一...此源码提供了一个基础的.NET CAS客户端实现,可以帮助开发者快速集成SSO功能,减少重复的身份验证过程,提升用户体验。不过,具体实现可能需要根据实际项目需求进行调整和优化。
CAS客户端则负责与CAS服务器进行交互,验证用户的身份。 整合Spring、Spring Web MVC和CAS客户端的步骤如下: 1. **配置Spring**:创建Spring配置文件(如`applicationContext.xml`),声明必要的bean,包括数据源...
在Java环境中,CAS客户端库使得应用程序能够与CAS服务器进行交互,实现用户的身份验证。 标题“cas客户端java版”指的是在Java环境下使用的CAS客户端库,它允许Java应用与CAS服务器进行集成,从而实现用户认证过程...
CAS客户端是实现与CAS服务器交互的关键部分,它允许用户通过CAS服务器进行身份验证,而无需在每个应用中单独登录。 在深入探讨CAS客户端之前,我们先理解一下SSO的概念。SSO允许用户通过一次登录就能访问多个相互...
开发者应遵循最佳实践,比如使用HTTPS进行通信,定期更新Cas客户端版本以获取安全补丁。 9. **SSO的优缺点**: 单一登录提供了一致的用户体验,简化了用户管理和密码管理。然而,它也增加了集中式认证的风险,如果...
2. **CAS客户端war包(casClientApp1.war和casClientApp2.war)** 这两个war包代表了使用CAS服务进行身份验证的应用程序。每个客户端应用在用户尝试访问受保护的资源时,会重定向到CAS服务器进行身份验证。完成认证...
在本案例中,"CAS客户端php版"是一个用于PHP开发的CAS客户端库,它实现了CAS服务器的交互,使PHP应用程序能够利用CAS进行身份验证。 首先,我们需要了解CAS的工作流程: 1. 用户尝试访问受保护的资源。 2. 如果用户...
在这个场景中,"cas客户端jar包"是指用于与CAS服务器通信的Java库,方便开发者集成到他们的Java应用程序中,实现单点登录功能。 首先,我们需要了解CAS客户端的主要组件和工作原理。当用户尝试访问一个受CAS保护的...
CAS(Central Authentication Service)是...通过这个实例,你可以深入了解SSO的工作原理,学习如何配置和部署CAS服务,以及如何在自己的应用中实现CAS客户端,这对于提升企业级应用的安全性和用户体验有着重要的作用。
通过以上步骤,你可以使CAS客户端应用支持自定义登录页面,从而提供更个性化的用户体验。记住,每个CAS服务器的实现和配置可能会有所不同,因此在实际操作中需要根据具体情况进行调整。同时,为了确保安全性,务必...
CAS服务器作为一个中心认证服务,用户只需在该服务器上进行一次身份验证,之后便可以在所有已集成的CAS客户端应用中自由切换,而无需再次登录。这种机制极大地提升了用户体验和安全性。 集成CAS客户端的步骤通常...
当用户通过CAS服务器验证后,服务器会返回一个Ticket Granting Ticket (TGT),之后每次访问其他受保护的应用时,CAS客户端会使用TGT换取特定服务的Service Ticket,然后将Service Ticket提交给服务端验证。...
Java CAS客户端库允许Java应用与CAS服务器进行通信,处理登录验证、票证验证等功能。这个客户端库包含了Servlet过滤器、Spring安全支持和其他相关组件,便于开发者快速集成到自己的应用程序中。 三、集成步骤 1. ...
总结起来,这个"单点登录cas服务器demo及springboot客户端demo"项目提供了一个实践单点登录概念的实例,涵盖了CAS服务器的搭建、Spring Boot应用的CAS客户端集成,以及Shiro或Pac4j的使用。对于想要学习和理解SSO...