CAS单点登录用户注册后自动登录
2014-08-01 09:58
232 查看
一 通常可能会在做项目的时候遇到此种需求:CAS客户端应用完成用户注册功能后直接跳转至CAS服务器登录并显示自定义的客户端某个页面;而不是用户完成注册后再次登录CAS服务器登录页面进行登录.这就是完成用户注册后自动登录功能.此文中cas服务端版本为3.4.6,客户端为3.2.0.
二 实现流程:
注册成功后(客户端完成) -> 调用CAS端处理模块 -> 验证用户名密码 -> 生成TGT -> 生成TG -> Add ST&TGT至相关Register类 -> Add TGT至Cookie -> 重定向至 cas/login URL -> 完成
三 CAS登录处理主要模块(类):
a. Credentials 用于存储用户登录认证信息接口。
其默认实现类:org.jasig.cas.authentication.principal.UsernamePasswordCredentials
b. CentralAuthenticationService 用于生成 ST(Service Ticket) 和 TGT(TicketGrantingTicket)的认证服务类。
其默认实现类: org.jasig.cas.CentralAuthenticationServiceImpl
c. CookieRetrievingCookieGenerator 用于将TGT添加至Cookie及对Cookie进行管理。
四 具体步骤
1. 新建工程,新建登录后自动登录处理类RegisterAfterLoginController
java代码 说明一(获取用户名密码,验证有效性,生成相关票据并绑定注册,添加cookie)
protected ModelAndView handleRequestInternal(HttpServletRequest request,
HttpServletResponse response) throws Exception
{
ModelAndView signinView=new ModelAndView();
String username=request.getParameter("username");
String password=request.getParameter("password");
//此处应根据用户名密码去数据库校验,证实传递的注册用户信息的有效性,代码略
bindTicketGrantingTicket(username, password, request, response);
String viewName=getSignInView(request);
signinView.setViewName(getSignInView(request));
return signinView;
}
java代码 说明二(具体生成相关票据并绑定注册,添加cookie实现方法)
protected void bindTicketGrantingTicket(String loginName, String loginPassword, HttpServletRequest request, HttpServletResponse response){
try {
UsernamePasswordCredentials credentials = new UsernamePasswordCredentials();
credentials.setUsername(loginName);
credentials.setPassword(loginPassword);
String ticketGrantingTicket = centralAuthenticationService.createTicketGrantingTicket(credentials);
ticketGrantingTicketCookieGenerator.addCookie(request, response, ticketGrantingTicket);
} catch (TicketException te) {
logger.error("Validate the login name " + loginName + " failure, can't bind the TGT!", te);
} catch (Exception e){
logger.error("bindTicketGrantingTicket has exception.", e);
}
}
java代码 说明三(获取service参数并跳转页面)
protected String getSignInView(HttpServletRequest request) {
String service = ServletRequestUtils.getStringParameter(request, "service", "");
return ("redirect:login" + (service.length() > 0 ? "?service=" + service : ""));
}
2.在工程中导入CAS相关类,声明centralAuthenticationService和ticketGrantingTicketCookieGenerator及setter,确认无错后,导出jar包至CAS/lib中.
3.打开CAS的cas-servlet.xml文件,在<bean id="handlerMappingC"
class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">mapping属性中添加:
<prop
key="/registerLogin">
registerLoginController
</prop>
并在后面添加此类注册:
<bean id="registerLoginController" class="com.sgcc.spicss.cas.web.RegisterAfterLoginController"
p:centralAuthenticationService-ref="centralAuthenticationService"
p:ticketGrantingTicketCookieGenerator-ref="ticketGrantingTicketCookieGenerator"/>
最后一步,打开web.xml,添加:
<servlet-mapping>
<servlet-name>cas</servlet-name>
<url-pattern>/registerLogin</url-pattern>
</servlet-mapping>
备注:
1.关于centralAuthenticationService及ticketGrantingTicketCookieGenerator已声明在 spring-configuration/applicationContext.xml 和 ticketGrantingTicketCookieGenerator.xml中
至此,此功能搭建过程已全部完成,在CAS客户端完成注册功能后,直接调用CAS对外接口cas/registerLogin?username=admin&password=admin(密码可经过特殊加密后传递,但要可解密)&service=http://localhost:8080/test(这里是示例,采用了get方式传递,实际应用中可采用post方式传递).
2.用于我的注册(在cyd2.0项目上)未在cas client任意一端,当访问单点服务器时cas server会根据服务器(指单点服务器)的域名生成一个cookie存储在浏览器中,由于cyd2.0访问任意一个cas client时没有与单点服务器发生交互,所以被访问的cas client不能取到cas
server根据访问域名生成的cookie中的值。我的解决方案是:在注册成功后service写成cas client的一个url,当访问单点的注册servlet后,跳到cas client(这样cas client就与cas server有了一个交互),再有cas client跳到cyd2.0的注册成功界面
3.本文转载于http://binghejinjun.iteye.com/blog/1701688
二 实现流程:
注册成功后(客户端完成) -> 调用CAS端处理模块 -> 验证用户名密码 -> 生成TGT -> 生成TG -> Add ST&TGT至相关Register类 -> Add TGT至Cookie -> 重定向至 cas/login URL -> 完成
三 CAS登录处理主要模块(类):
a. Credentials 用于存储用户登录认证信息接口。
其默认实现类:org.jasig.cas.authentication.principal.UsernamePasswordCredentials
b. CentralAuthenticationService 用于生成 ST(Service Ticket) 和 TGT(TicketGrantingTicket)的认证服务类。
其默认实现类: org.jasig.cas.CentralAuthenticationServiceImpl
c. CookieRetrievingCookieGenerator 用于将TGT添加至Cookie及对Cookie进行管理。
四 具体步骤
1. 新建工程,新建登录后自动登录处理类RegisterAfterLoginController
java代码 说明一(获取用户名密码,验证有效性,生成相关票据并绑定注册,添加cookie)
protected ModelAndView handleRequestInternal(HttpServletRequest request,
HttpServletResponse response) throws Exception
{
ModelAndView signinView=new ModelAndView();
String username=request.getParameter("username");
String password=request.getParameter("password");
//此处应根据用户名密码去数据库校验,证实传递的注册用户信息的有效性,代码略
bindTicketGrantingTicket(username, password, request, response);
String viewName=getSignInView(request);
signinView.setViewName(getSignInView(request));
return signinView;
}
java代码 说明二(具体生成相关票据并绑定注册,添加cookie实现方法)
protected void bindTicketGrantingTicket(String loginName, String loginPassword, HttpServletRequest request, HttpServletResponse response){
try {
UsernamePasswordCredentials credentials = new UsernamePasswordCredentials();
credentials.setUsername(loginName);
credentials.setPassword(loginPassword);
String ticketGrantingTicket = centralAuthenticationService.createTicketGrantingTicket(credentials);
ticketGrantingTicketCookieGenerator.addCookie(request, response, ticketGrantingTicket);
} catch (TicketException te) {
logger.error("Validate the login name " + loginName + " failure, can't bind the TGT!", te);
} catch (Exception e){
logger.error("bindTicketGrantingTicket has exception.", e);
}
}
java代码 说明三(获取service参数并跳转页面)
protected String getSignInView(HttpServletRequest request) {
String service = ServletRequestUtils.getStringParameter(request, "service", "");
return ("redirect:login" + (service.length() > 0 ? "?service=" + service : ""));
}
2.在工程中导入CAS相关类,声明centralAuthenticationService和ticketGrantingTicketCookieGenerator及setter,确认无错后,导出jar包至CAS/lib中.
3.打开CAS的cas-servlet.xml文件,在<bean id="handlerMappingC"
class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">mapping属性中添加:
<prop
key="/registerLogin">
registerLoginController
</prop>
并在后面添加此类注册:
<bean id="registerLoginController" class="com.sgcc.spicss.cas.web.RegisterAfterLoginController"
p:centralAuthenticationService-ref="centralAuthenticationService"
p:ticketGrantingTicketCookieGenerator-ref="ticketGrantingTicketCookieGenerator"/>
最后一步,打开web.xml,添加:
<servlet-mapping>
<servlet-name>cas</servlet-name>
<url-pattern>/registerLogin</url-pattern>
</servlet-mapping>
备注:
1.关于centralAuthenticationService及ticketGrantingTicketCookieGenerator已声明在 spring-configuration/applicationContext.xml 和 ticketGrantingTicketCookieGenerator.xml中
至此,此功能搭建过程已全部完成,在CAS客户端完成注册功能后,直接调用CAS对外接口cas/registerLogin?username=admin&password=admin(密码可经过特殊加密后传递,但要可解密)&service=http://localhost:8080/test(这里是示例,采用了get方式传递,实际应用中可采用post方式传递).
2.用于我的注册(在cyd2.0项目上)未在cas client任意一端,当访问单点服务器时cas server会根据服务器(指单点服务器)的域名生成一个cookie存储在浏览器中,由于cyd2.0访问任意一个cas client时没有与单点服务器发生交互,所以被访问的cas client不能取到cas
server根据访问域名生成的cookie中的值。我的解决方案是:在注册成功后service写成cas client的一个url,当访问单点的注册servlet后,跳到cas client(这样cas client就与cas server有了一个交互),再有cas client跳到cyd2.0的注册成功界面
3.本文转载于http://binghejinjun.iteye.com/blog/1701688
相关文章推荐
- CAS单点登录用户注册后自动登录
- WordPress用户注册成功后自动登录
- JSP之保存Cookie实现用户注册并自动登录
- CAS 之 实现用户注册后自动登录
- ajax注册用户无刷新自动验证代码及调用代码 推荐
- 一步一步SharePoint 2007之二十一:解决实现注册用户后,自动具备访问网站的权限的问题(3)——创建用户
- 【转载】xp用户自动登录
- 如何在用户注册或登录时使用验证码图片
- 一步一步SharePoint 2007之二十:解决实现注册用户后,自动具备访问网站的权限的问题(2)——配置Role
- 一步一步SharePoint 2007之二十:解决实现注册用户后,自动具备访问网站的权限的问题(2)——配置Role
- 自动快速注册sohu club用户的htm (reg.htm)
- 一步一步SharePoint 2007之十九:解决实现注册用户后,自动具备访问网站的权限的问题(1)——配置Provider
- 如何在用户注册或登录时使用验证码图片
- 一步一步SharePoint 2007之二十:解决实现注册用户后,自动具备访问网站的权限的问题(2)——配置Role
- 一步一步SharePoint 2007之二十一:解决实现注册用户后,自动具备访问网站的权限的问题(3)——创建用户
- 一步一步SharePoint 2007之二十:解决实现注册用户后,自动具备访问网站的权限的问题(2)——配置Role
- Asp.net2.0身份验证技术学习入门---新用户注册,登录,显示用户信息
- Asp.net2.0身份验证技术学习入门---新用户注册,登录,显示用户信息
- 我现在做了个web系统,要求允许windows域用户自动注册,有什么建议
- 在jsp中用bean和servlet联合实现用户注册、登录