java 集成 cas系统 服务端和客户端配置

http://blog.csdn.net/yunye114105/article/details/7997041

参考:

http://blog.csdn.net/diyagea/article/details/50638737

(配置SSL协议)http://www.cnblogs.com/notDog/p/5264666.html

背景

有几个相对独立的java的web应用系统, 各自有自己的登陆验证功能,用户在使用不同的系统的时候,需要登陆不同的系统。现在需要提供一个统一的登陆/登出界面, 而不修改各个系统原来的登陆验证机制。于是采用单点登录系统CAS。

 

使用步骤

要使用单点登录,需要部署CAS系统, CAS服务端可以直接部署在tomcat下运行, 对于CAS服务端来说,所有要集成单点登录的web应用都是它的一个客户端, CAS有客户端jar包, 客户端web应用需要引入CAS客户端的jar包,这样CAS系统的服务端和客户端web应用程序端才能通信。

 

客户端web应用程序的通过配置web.xml,添加CAS需要的各种过滤器,来实现和CAS服务器通信, 用户信息验证工作在CAS服务端统一完成, 验证通过后,客户端web应用程序只需要补全自己的Session信息即可。

 

各个客户端web应用程序需要使用一个公用的用户表。

 

第一步 部署CAS系统服务端

1.从官网http://developer.jasig.org/cas/下载CAS Server, 将cas-server-webapp-3.4.12.war解压, 可以看到是一个标准的java的web应用, 可以直接部署到tomcat的webapps目录下的,我这里假设部署的路径是{tomcat_home}/webapps/cas。

2. CAS默认需要tomcat配置SSL协议,使用https协议通信的。 由于项目是企事业单位内部的系统,不需要这么高的安全级别, 可以简化操作,不走SSL协议。修改下配置文件\WEB-INF\spring-configuration\ticketGrantingTicketCookieGenerator.xml, 如下, 将默认的true改成false即可。

[html] view plain copy

 

  1.         p:cookieSecure="false"  
  2.         p:cookieMaxAge="-1"  
  3.         p:cookieName="CASTGC"  
  4.         p:cookiePath="/cas" />  

3.配置登录的验证逻辑, 修改配置文件cas\WEB-INF\deployerConfigContext.xml。在authenticationHandlers中配置验证方式,我这里配置数据库查询语句来实现用户名和密码的验证。

[html] view plain copy

 

  1.   
  2.               
  3.                   
  4.                 
  5.                     p:httpClient-ref="httpClient" />  
  6.                   
  7.                  
                    

                    
                    
                    
                    
  8.                   
  9.                   
  10.                       
  11.                       
  12.                       
  13.                   -->

         

 

  

  1.               
  2.           

密码加密方法我这里使用MD5, 配置passwordEncoder的bean

[html] view plain copy

 

  1.   
  2.           
  3.       

在配置一个名称为dataSource的数据源

[html] view plain copy

 

  1.   
  2.           
  3.           
  4.           
  5.           
  6.           
  7.           
  8.       

数据源的配置根据自己的实际情况来配置, 需要的jar如果lib下面没有,自己复制进去, 不然数据源连不上报错。

4. 现在服务端就配置好了, 如果需要定制登录/登出页面的话(实际项目基本上都需要修改), 修改cas\WEB-INF\view\jsp\default\ui\下面的casLoginView.jsp和casLogoutView.jsp就可以了

 

 

第二步 客户端web应用程序集成CAS

1. 从官网 http://developer.jasig.org/cas-clients/ 下载CAS Client, 将客户端的jar,如cas-client-core-3.2.1.jar引入到web应用程序的classpath中

2 .配置web.xml文件, 主要是添加过滤器拦截通信, 下面的实例代码, 假设web应用程序的端口是8080

[html] view plain copy

 

  1.   
  2.       
  3.       
  4.       
  5.         CAS Single Sign Out Filter  
  6.         org.jasig.cas.client.session.SingleSignOutFilter  
  7.       
  8.       
  9.         CAS Single Sign Out Filter  
  10.         /*  
  11.       
  12.       
  13.       
  14.         org.jasig.cas.client.session.SingleSignOutHttpSessionListener  
  15.       
  16.       
  17.       
  18.       
  19.         CASFilter  
  20.         org.jasig.cas.client.authentication.AuthenticationFilter  
  21.           
  22.             casServerLoginUrl  
  23.               
  24.             http://CAS服务端所在服务器IP:8080/cas/login  
  25.           
  26.           
  27.             serverName  
  28.               
  29.             http://具体web应用程序所在服务器IP:8080  
  30.           
  31.       
  32.       
  33.         CASFilter  
  34.         /*  
  35.       
  36.        
  37.       
  38.       
  39.         CAS Validation Filter  
  40.         org.jasig.cas.client.validation.Cas20ProxyReceivingTicketValidationFilter  
  41.           
  42.             casServerUrlPrefix  
  43.               
  44.             http://CAS服务端所在服务器IP:8080/cas  
  45.           
  46.           
  47.             serverName  
  48.               
  49.             http://具体web应用程序所在服务器IP:8080  
  50.           
  51.           
  52.           renew  
  53.           false  
  54.           
  55.           
  56.           gateway  
  57.           false  
  58.           
  59.       
  60.       
  61.         CAS Validation Filter  
  62.         /*  
  63.       
  64.        
  65.       
  66.       
  67.         CAS HttpServletRequest Wrapper Filter  
  68.         org.jasig.cas.client.util.HttpServletRequestWrapperFilter  
  69.       
  70.       
  71.         CAS HttpServletRequest Wrapper Filter  
  72.         /*  
  73.       
  74.        
  75.       
  76.       
  77.         CAS Assertion Thread Local Filter  
  78.         org.jasig.cas.client.util.AssertionThreadLocalFilter  
  79.       
  80.       
  81.         CAS Assertion Thread Local Filter  
  82.         /*  
  83.       
  84.        
  85.       
  86.       
  87.         CasForInvokeContextFilter  
  88.         com.cm.demo.filter.CasForInvokeContextFilter  
  89.           
  90.           appId  
  91.           a5ea611bbff7474a81753697a1714fb0  
  92.           
  93.       
  94.       
  95.         CasForInvokeContextFilter  
  96.         /*  
  97.       
  98.       

4. 注意上步配置文件中,过滤器CasForInvokeContextFilter的实现是需要在具体的应用中实现的,他的目的是, CAS服务端登录验证成功后,会将登录用户的用户名携带回来, 这时客户端web应用程序需要根据用户名从数据库用户表中查询到用户的Id等信息, 并填充到Session中, 这样,客户端应用程序原来的验证逻辑就不会出问题了, 因为我们一般都是通过验证session中是否含有当前登录的用户的ID来进行登录验证的。

下面是CasForInvokeContextFilter的一个简单实现。

[java] view plain copy

 

  1. /** 
  2.  * 该过滤器用户从CAS认证服务器中获取登录用户用户名,并填充必要的Session. 
  3.  * @author jiarong_cheng 
  4.  * @created 2012-7-12 
  5.  */  
  6. public class CasForInvokeContextFilter implements Filter {  
  7.   
  8.     @Override  
  9.     public void destroy() {  
  10.     }  
  11.   
  12.     @Override  
  13.     public void doFilter(ServletRequest request, ServletResponse response,  
  14.             FilterChain chain) throws IOException, ServletException {  
  15.         HttpSession session = ((HttpServletRequest) request).getSession();  
  16.         //如果session中没有用户信息,则填充用户信息  
  17.         if (session.getAttribute("j_userId") == null) {  
  18.             //从Cas服务器获取登录账户的用户名  
  19.             Assertion assertion = AssertionHolder.getAssertion();  
  20.             String userName = assertion.getPrincipal().getName();  
  21.   
  22.             try {  
  23.                 //根据单点登录的账户的用户名,从数据库用户表查找用户信息, 填充到session中  
  24.                 User user = UserDao.getUserByName(userName);  
  25.                 session.setAttribute("username", userName);  
  26.                 session.setAttribute("userId", user.getId());  
  27.             } catch (Exception e) {  
  28.                 e.printStackTrace();  
  29.             }  
  30.         }  
  31.         chain.doFilter(request, response);  
  32.     }  
  33.   
  34.     @Override  
  35.     public void init(FilterConfig config) throws ServletException {  
  36.     }  
  37. }  


到此,就完成了, 当你访问具体应用的网址, 如http://具体应用IP: 8080/ ,就会跳转到CAS服务器的登陆页面: http://CAS服务器IP: 8080/  进行登录验证, 验证通过后, 又会跳转回应用的网址。

 

第三步 单点登出

这个比较简单, 只要在系统的登出事件中, 将URL访问地址指向CAS服务登出的servlet, 就可以了。

http://CAS服务器IP:8080/cas/logout

你可能感兴趣的:(java 集成 cas系统 服务端和客户端配置)