类QQ客户端打开空间,利用Yale CAS实现桌面客户端软件登录后跳转到网站自动登录

一 通常可能会在做项目的时候遇到此种需求: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

 

      第一步:获取用户名密码,验证有效性,生成相关票据并绑定注册,添加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;
    }

 

 

 

原文代码:

 /**
	 * user register process and automatic login.
	 * @param userForm the user information object.
	 * @param request  the HttpServletRequest object
	 * @param response the HttpServletResponse object
	 * @return get result view
	 */
	protected ModelAndView handleUserRegisterInternal(UserInfoVo userForm, HttpServletRequest request, HttpServletResponse response) {
		
		ModelAndView signinView = new ModelAndView(REGISTER_VIEW);;
		final boolean isUnique = userService.checkUserUnique(userForm.getLoginName());
		final boolean isRegistered = isUnique ? registerUser(userForm, request, response) : false;

		if (isRegistered) {
			bindTicketGrantingTicket(userForm.getLoginName(), userForm.getLoginPassword(), request, response);
			signinView.setViewName(getSignInView(request));
		}
		return signinView;
	}

 

 

 

 

 

 

    第二步:具体生成相关票据并绑定注册,添加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);
        }
    }

 

 

 

     第三步:获取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="registerController" class="com.xxxxx.sso.web.RegisterController"   
    p:userService-ref="userService"  
    p:validator-ref="registerValidator"  
    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.感谢denger原文作者的贡献,本文参考http://denger.iteye.com/blog/805743

 

 

3.另上传写好的jar包一份供参考下载,直接放到lib下,修改cas-servlet.xml,web.xml即可运行,各位可以反编译查看源码

 

 

本文转自:http://binghejinjun.iteye.com/blog/1701688, 有部分修改。

 

 

---------------------------------------无奈的分割线-----------------------------------------------------

其实实现这个功能,只要用cas的rest 接口验证,获取ticket,然后打开页面时带上参数ticket=XXX,就行了,之所以绕了这么一大圈,是因为之前验证时带的service参数url后面少了“/”号,导致验证时的domain和打开的domain不同,出现票根无效的错误。着实冤啦。害我浪费4天时间。

猜你喜欢

转载自chenhbc.iteye.com/blog/2124851
今日推荐