前言

经过上一JAVA CAS单点登录之一:搭建CAS服务器 这一章,CAS服务器已经搭建好了。当然这时候的CAS服务器仅仅是最初版本的。比如密码验证,页面美观度都需要进一步调整。但这都是无关紧要的。

最主要的是先把整个一套认证流程走下来,至于完善的工作,都是没个点的工作了,相对比较简单。

主要内容

   1. 新建一个web应用mywebapp1,测试与CAS服务器的认证效果

    2.如果上一步骤1认证成功的话,将mywebapp1复制一份,调整若干参数,继续测试。

    如果步骤1,步骤2都认证成功的话,则表示环境搭建成功

具体参数  

涉及的所有参数都在我的实体机(WIN7)完成的。分别按照了3个TOMCAT服务端。

  • Tomcat6.0.36

  • JDK7

  • CAS Server版本:cas-server-3.5.3

  • CAS Client版本:cas-client-3.1.1


域名映射(C:\Windows\System32\drivers\etc\hosts)

127.0.0.1 hellocas1.com
127.0.0.1 hellocas2.com

主机名

zhaoguoyu-pc


重要概念及认证流程介绍

我就不重复贴了,参考一下链接

http://www.coin163.com/java/cas/ticket.html

http://www.cnblogs.com/vhua/p/cas_6.html

http://steven-wiki.readthedocs.org/en/latest/security/

http://www.blogjava.net/security/archive/2006/10/02/sso_in_action.html


操作步骤

1.cas server端在CAS普通模式时,不需要特殊配置(记住端口是8888,443)

2.部署第一个Cas Client app 。应用命名为mywebapp1。

    我使用的是Maven方式部署的。

    2.1 使用archetype-webapp插件创建一个项目(略)

    2.2修改pom.xml文件,添加依赖

    
      org.jasig.cas
      3.1.1
      cas-client-core
    

    2.3配置web.xml

    




  mywebapp

  

    Simple sample, how to use CAS Java Client 3.x.
    In this sample exists a public area (/)
    and a private area (/protected/*).

  
  
  
  
  
  
    CAS Authentication Filter
    org.jasig.cas.client.authentication.AuthenticationFilter
    
      casServerLoginUrl
      https://zhaoguoyu-pc/cas/login
    
    
      serverName
      http://zhaoguoyu-pc:8080
    
    
      renew
      false
    
    
      gateway
      false
    
  
  
  
    CAS Validation Filter
    org.jasig.cas.client.validation.Cas20ProxyReceivingTicketValidationFilter
    
      casServerUrlPrefix
      https://zhaoguoyu-pc/cas/
    
    
      serverName
      http://zhaoguoyu-pc:8080
    

  
  
  
    CAS HttpServletRequest Wrapper Filter
    org.jasig.cas.client.util.HttpServletRequestWrapperFilter
  
  
  
    CAS Assertion Thread Local Filter
    org.jasig.cas.client.util.AssertionThreadLocalFilter
  

  

  
  

  
    CAS Authentication Filter
    /protected/*
  

  
    CAS Validation Filter
    /*
  

  
    CAS HttpServletRequest Wrapper Filter
    /*
  

  
    CAS Assertion Thread Local Filter
    /*
  

  

  
  

  

  
    index.jsp
  

需要注意的是serverName参数,不多解释。

3.3 修改HttpServletRequestWrapperFilter类,修复client3.1.1存在的BUG。

详情见https://issues.jasig.org/browse/CASC-50

public void doFilter(final ServletRequest servletRequest,
                     final ServletResponse servletResponse, final FilterChain filterChain)
        throws IOException, ServletException {
    final Principal principal = retrievePrincipalFromSessionOrRequest(servletRequest);

    //   filterChain.doFilter(new CasHttpServletRequestWrapper(
    //         (HttpServletRequest) servletRequest, principal), servletResponse);
    if (principal != null) {
        filterChain.doFilter(new CasHttpServletRequestWrapper((HttpServletRequest) servletRequest, principal), servletResponse);
    } else {
        filterChain.doFilter(servletRequest, servletResponse);
    }
}

 

 3.4 准备测试JSP,将他放到protected目录下, 因为要和web.xml中/protected/*匹配对应。

   
Your user name:
   
<%= request.getRemoteUser()== null ? "null" : request.getRemoteUser() %>

这时候,如果你把request对象打印出来,已经是被CAS包装的请求对象了。

或者这样测

<%@page import="org.jasig.cas.client.util.AbstractCasFilter"%>
<%@page import="org.jasig.cas.client.validation.Assertion"%>
<%@page import="org.jasig.cas.client.util.AssertionHolder"%>
<%@page import="java.util.Iterator"%>
<%@page import="java.util.Map"%>
<%
   Assertion assertion1 = (Assertion) session.getAttribute(AbstractCasFilter.CONST_CAS_ASSERTION);
%>
<%= assertion1.getPrincipal().getName() %>
 

3.5文件效果

JAVA CAS单点登录之二:CAS普通模式1演练_第1张图片

其中未提到的include_*.jsp,*.css,可以无视。

3.6验证mywebapp1

3.6验证mywebapp1

  3.6.1 浏览器访问http://zhaoguoyu-pc:8080/app01/protected/,直接跳转

到https://zhaoguoyu-pc/cas/login?service=http%3A%2F%2Fzhaoguoyu-pc%3A8080%2Fapp01%2Fprotected%2F.

发现后缀有了service

JAVA CAS单点登录之二:CAS普通模式1演练_第2张图片

3.6.2 输入用户名和密码(test/test),进行认证,跳转到

http://zhaoguoyu-pc:8080/app01/protected/?ticket=ST-7-x6Txage1j1plr45vhHeN-cas01.example.org

wKioL1buYtiydIScAAAcKf7bY58855.png

发现后缀有了ticket. 成功实现了跳转。mywebapp1验证通过


3.7复制mywebapp1 为mywebapp2

3.8编辑mywebapp2的web.xml文件, 仅仅修改下serviceName即可,注意端口和应用名,否则会出现找不到页面问题。

3.9.强最新编辑的mywebapp2,复制到另外一个tomcat的webapp目录下

3.10 重复3.6 的步骤验证mywebapp2

3.11 集成测试

  (0)清理浏览器缓存后

(1)先访问mywebapp01,进行身份认证。

(2)认证后,再访问mywebapp2,看是否需要再认证。如果不需要重复认证则表示演练完成。


最后,整体来说,配置模式1还是比较简单。但是很不幸,我上周自己演练时,碰巧遇到CAS的BUG(上面3.3步骤中修复的就是它),花费了我2个晚上。我不太清楚,为什么这个BUG就没人在文档中提到呢。


接下来的演练时CAS代理模式,我又遇到一个更坑爹的问题,同样在国内博客中也是没有遇到。WHY,为什么老天对我如此不公啊。