CAS做单点登陆(SSO)——集成Java Web 项目

阅读更多

添加cas-client的jar包

下载cas-client,地址:http://www.ja-sig.org/downloads/cas-clients/当前最新版本是cas-client-3.2.1-release.zip然后解压cas-client-3.2.1-release.zip,在modules拷贝cas-client-core-3.2.1.jar应用的WEB-INF/lib目录中

撰写支持CAS集成的客户化包

除了在web.xml添加CAS内置的filter外(具体看配置web.xml),我们需要撰写自己支持CAS集成的客户化包。大致思路如下:

[java]  view plain  copy
 
  1. @Override  
  2. public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {  
  3.       
  4.     HttpServletRequest request = (HttpServletRequest)servletRequest;  
  5.     HttpServletResponse response = (HttpServletResponse)servletResponse;  
  6.       
  7.     HttpSession session = request.getSession();  
  8.     //在session中自定义一个参数,以它来校验是否完成过自动登陆  
  9.     Object user_login = session.getAttribute(AURORA_USER_LOGIN);  
  10.     if (user_login != null){  
  11.         //登陆过,就继续执行其他filter  
  12.         filterChain.doFilter(request, response);  
  13.         return;  
  14.     }  
  15.     //通过CAS的API获得登陆账号  
  16.     String loginName = AssertionHolder.getAssertion().getPrincipal().getName();  
  17.     try {  
  18.         //执行本系统的登陆。跟平常同时校验用户名和密码不同,这里只有用户名。  
  19.         executeLoginProc(request,response,loginName);  
  20.     } catch (Exception e) {  
  21.         logger.log(Level.SEVERE, "executeLoginProc error:", e);  
  22.         return;  
  23.     }  
  24.     //登陆成功  
  25.     session.setAttribute(AURORA_USER_LOGIN, Boolean.TRUE);  
  26.     //跳转到登陆成功后的页面  
  27.     response.sendRedirect(roleSelectPageUrl);  
  28. }  

把这个class打包成一个jar拷贝到应用的WEB-INF/lib目录中

如果有兴趣,还可以简单了解下org.jasig.cas.client.authentication.AuthenticationFilter这个CAS内置filter的功能

[java]  view plain  copy
 
  1. public final void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {  

  2.     HttpServletRequest request = (HttpServletRequest)servletRequest;  
  3.     HttpServletResponse response = (HttpServletResponse)servletResponse;  
  4.     HttpSession session = request.getSession(false);  
  5.  //检查自定义属性"_const_cas_assertion_"  
  6.     Assertion assertion = session != null ? (Assertion)session.getAttribute("_const_cas_assertion_") : null;

        if (assertion != null) {  

  7.       //已经成功登陆过CAS  
  8.       filterChain.doFilter(request, response);  
  9.       return;  
  10.     }  
  11.     //拿到url,并检查url参数中的ticket是否有效  
  12.     String serviceUrl = constructServiceUrl(request, response);  
  13.     String ticket = CommonUtils.safeGetParameter(request, getArtifactParameterName());  
  14.     boolean wasGatewayed = this.gatewayStorage.hasGatewayedAlready(request, serviceUrl);

        if ((CommonUtils.isNotBlank(ticket)) || (wasGatewayed)) {  

  15.       //ticket有效  
  16.       filterChain.doFilter(request, response);  
  17.       return;  
  18.     }

        this.log.debug("no ticket and no assertion found");  

  19.     String modifiedServiceUrl;  
  20.     String modifiedServiceUrl;  
  21.     if (this.gateway) {  
  22.       this.log.debug("setting gateway attribute in session");  
  23.       modifiedServiceUrl = this.gatewayStorage.storeGatewayInformation(request, serviceUrl);  
  24.     } else {  
  25.       modifiedServiceUrl = serviceUrl;  
  26.     }

        if (this.log.isDebugEnabled()) {  

  27.       this.log.debug("Constructed service url: " + modifiedServiceUrl);  
  28.     }

        String urlToRedirectTo = CommonUtils.constructRedirectUrl(this.casServerLoginUrl, getServiceParameterName(), modifiedServiceUrl, this.renew, this.gateway);

        if (this.log.isDebugEnabled()) {  

  29.       this.log.debug("redirecting to \"" + urlToRedirectTo + "\"");  
  30.     }  
  31.     //重定向到cas的登陆页面  
  32.     response.sendRedirect(urlToRedirectTo);  
  33.   }  
  34.   


 

修改web.xml

在应用WEB-INF/web.xml添加filter的内容,效果如下所示

[html]  view plain  copy
 
  1.   
  2.       
  3.     <listener>  
  4.         <listener-class>org.jasig.cas.client.session.SingleSignOutHttpSessionListenerlistener-class>  
  5.     listener>  
  6.   
  7.       
  8.     <filter>  
  9.         <filter-name>CAS Single Sign Out Filterfilter-name>  
  10.         <filter-class>org.jasig.cas.client.session.SingleSignOutFilterfilter-class>  
  11.     filter>  
  12.     <filter-mapping>  
  13.         <filter-name>CAS Single Sign Out Filterfilter-name>  
  14.         <url-pattern>/*url-pattern>  
  15.     filter-mapping>  
  16.   
  17.       
  18.     <filter>  
  19.         <filter-name>CASFilterfilter-name>  
  20.         <filter-class>org.jasig.cas.client.authentication.AuthenticationFilterfilter-class>  
  21.         <init-param>  
  22.             <param-name>casServerLoginUrlparam-name>  
  23.             <param-value>https://sso.aurora-framework.org:8080/cas/loginparam-value>  
  24.               
  25.         init-param>  
  26.         <init-param>  
  27.             <param-name>serverNameparam-name>  
  28.             <param-value>https://sso.aurora-framework.org:8080param-value>  
  29.         init-param>  
  30.     filter>  
  31.     <filter-mapping>  
  32.         <filter-name>CASFilterfilter-name>  
  33.         <url-pattern>/*url-pattern>  
  34.     filter-mapping>  
  35.   
  36.       
  37.     <filter>  
  38.         <filter-name>CAS Validation Filterfilter-name>  
  39.         <filter-class>  
  40.             org.jasig.cas.client.validation.Cas20ProxyReceivingTicketValidationFilterfilter-class>  
  41.         <init-param>  
  42.             <param-name>casServerUrlPrefixparam-name>  
  43.             <param-value>https://sso.aurora-framework.org:8080/casparam-value>  
  44.         init-param>  
  45.         <init-param>  
  46.             <param-name>serverNameparam-name>  
  47.             <param-value>https://sso.aurora-framework.org:8080param-value>  
  48.         init-param>  
  49.     filter>  
  50.     <filter-mapping>  
  51.         <filter-name>CAS Validation Filterfilter-name>  
  52.         <url-pattern>/*url-pattern>  
  53.     filter-mapping>  
  54.   
  55.       
  56.     <filter>  
  57.         <display-name>AutoSetUserAdapterFilterdisplay-name>  
  58.         <filter-name>AutoSetUserAdapterFilterfilter-name>  
  59.         <filter-class>aurora.plugin.sso.cas.AutoSetUserFilterfilter-class>  
  60.         <init-param>  
  61.             <param-name>roleSelectPageUrlparam-name>  
  62.             <param-value>https://sso.aurora-framework.org:8080/yourapp/role_select.screenparam-value>  
  63.         init-param>  
  64.     filter>  
  65.     <filter-mapping>  
  66.         <filter-name>AutoSetUserAdapterFilterfilter-name>  
  67.         <url-pattern>/*url-pattern>  
  68.     filter-mapping>  
  69.       

 

前面几个都是CAS标准配置,最后一个AutoSetUserAdapterFilter(自定义,可以取其他任意名字)才是我们支持cas的客户化程序。其中roleSelectPageUrl是指用户完成单点登录后跳转的页面

本文档撰写时Java web项目和CAS用同一个tomcat,所以都用的https。否则只需要配置CAS的链接为HTTPS,本项目连接用HTTP。

 

修改CAS的认证逻辑

CAS默认的逻辑是用户名和密码一致就可以登陆,现在需要把原web系统的用户名和密码校验挪到CAS中。这里假设原先web系统中有一张sys_user表存储了用户名和MD5散列后的密码。

 

打开cas/WEB-INF/deployerConfigContext.xml

  1. 注释掉SimpleTestUsernamePasswordAuthenticationHandler这个Handler,并添加

     

    [html]  view plain  copy
     
    1. <bean class="org.jasig.cas.adaptors.jdbc.QueryDatabaseAuthenticationHandler">  
    2.     <property ref="dataSource" name="dataSource">property>  
    3.     <property name="sql" value="select t.encrypted_user_password from sys_user t where t.user_name=?">property>                       
    4.     <property ref="MD5PasswordEncoder" name="passwordEncoder">property>  
    5. bean>  


     

  2.  在文件末尾之前加入数据库的链接:

    [html]  view plain  copy
     
    1. <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">  
    2.     <property name="driverClassName">  
    3.         <value>oracle.jdbc.driver.OracleDrivervalue>  
    4.     property>  
    5.     <property name="url">  
    6.         <value>jdbc:oracle:thin:@yourIP:1521:yourOracleInstanceIdvalue>  
    7.     property>  
    8.     <property name="username">  
    9.         <value>yourNamevalue>  
    10.     property>  
    11.     <property name="password">  
    12.         <value>yourPasswordvalue>  
    13.     property>  
    14. bean>  
    15. <bean id="MD5PasswordEncoder" class="org.jasig.cas.authentication.handler.DefaultPasswordEncoder">  
    16.     <constructor-arg index="0">  
    17.         <value>MD5value>  
    18.     constructor-arg>  
    19. bean>  

     

  3. cas加入jdbc支持
    复制cas-server-3.5.2\modules\cas-server-support-jdbc-3.5.2.jarOracle驱动(这里采用oracle数据)的ojdbc14.jar或者classes12.jar放到cas/WEB-INF/lib目录下。

  4. 重新登陆Web系统

    重启tomcat,在浏览器中输入https://sso.aurora-framework.org:8080/yourapp/,自动跳转到如下页面:

  5. 输入web系统预先定义的用户名和密码,并跳转到自定义(web.xml中定义的)登陆成功后的页面。

你可能感兴趣的:(CAS,SSO)