最近在研究sso单点登录的问题,研究了网上许多案例以及代码,发现总是有很大的差别,最后通过官网下载,才发现cas3 与 cas 4 的配置存在区别,这就是差别很大的原因了。

官网地址如下: https://www.apereo.org/search/node/cas


下面只针对cas4进行整理吧,因为cas4 相对于cas3 来说,是有增无减了。

1.下载

地址http://downloads.jasig.org/

cas-server-4.0.0-release.tar.gz

cas-client-3.3.3-release.tar.gz


2.配置Sever端

解压cas-server-4.0.0,将其中module/cas-server-webapp-4.0.0.war复制到Tomcat的webapps目录下,重命名为cas.war,启动Tomcat解开压缩

启动tomcat


http://localhost:8080/cas,进入登录页面。

默认用户为casuser/Mellon,登录成功即启动正常,cas3的无默认用户,只需用户名密码一直即可。


2.1设置利用数据库来验证用户


需依赖:c3p0-0.9.1.2.jar,mysql-connector-java-5.1.21.jar,cas-server-support-jdbc-4.0.0.jar,cas-server-support-ldap-4.0.0.jar

修改 deployerConfigContext.xml



1)更换验证方式 
  
   
    
    
    
      
      
     
     
2)更换handler验证方式

	
		
			
			 
			 
			
		
	

注释了原来的默认用户,使用数据库替代,新建数据库test,暂时没有使用md5加密,数据库test的users表直接设置passwd和name即可

3)使用md5加密,密码校验类自定义实现
 
	  
	
4)密码校验类自定义实现

public class MyQueryDatabaseAuthenticationHandler extends AbstractJdbcUsernamePasswordAuthenticationHandler{
	@NotNull
    private String sql;
	
	@Override
	protected HandlerResult authenticateUsernamePasswordInternal(UsernamePasswordCredential credential)throws GeneralSecurityException, PreventedException {
		 final String username = credential.getUsername();
		   
		  final String encryptedPassword = this.getPasswordEncoder().encode(credential.getPassword()+"{"+username+"}");
	        try {
	            final String dbPassword = getJdbcTemplate().queryForObject(this.sql, String.class, username);
	            if (!dbPassword.equals(encryptedPassword)) {
	                throw new FailedLoginException("Password does not match value on record.");
	            }
	        } catch (final IncorrectResultSizeDataAccessException e) {
	            if (e.getActualSize() == 0) {
	                throw new AccountNotFoundException(username + " not found with SQL query");
	            } else {
	                throw new FailedLoginException("Multiple records found for " + username);
	            }
	        } catch (final DataAccessException e) {
	            throw new PreventedException("SQL exception while executing query for " + username, e);
	        }
	        return createHandlerResult(credential, new SimplePrincipal(username), null);
	}
	
    public void setSql(final String sql) {
        this.sql = sql;
    }
}


因为这里的密码采用了   密码{用户名}  加密的方式,所以使用了自定义的密码校验,重启,测试通过


3.配置Client端

3.1 普通方式

新建testweb项目,在Client工程WEB-INF/lib下添加cas-client-core-3.2.1.jar包

修改web.xml如下:


  testWeb1
  
    index.html
    index.htm
    index.jsp
    default.html
    default.htm
    default.jsp
  


 
 
    
        serverName
        http://localhost:8080
    
    
     


   CAS Single Sign Out Filter
   org.jasig.cas.client.session.SingleSignOutFilter




  CAS Authentication Filter
  org.jasig.cas.client.authentication.AuthenticationFilter
  
    casServerLoginUrl
    https://localhost:8080/cas/login
  




    CAS Validation Filter
    org.jasig.cas.client.validation.Cas10TicketValidationFilter
    
        casServerUrlPrefix
        https://localhost:8080/cas
    
    
        redirectAfterValidation
        true
    




  CAS HttpServletRequest Wrapper Filter
  org.jasig.cas.client.util.HttpServletRequestWrapperFilter




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




   CAS Single Sign Out Filter
   /*


    CAS Authentication Filter
    /*


    CAS Validation Filter
    /*


    CAS HttpServletRequest Wrapper Filter
    /*


    CAS Assertion Thread Local Filter
    /*



    org.jasig.cas.client.session.SingleSignOutHttpSessionListener



     
        HelloWorldExample
        servlets.HelloWorld
    
    
        HelloWorldExample
        HelloWorldExample
      


这里配置了HelloWorld servlet 来配合测试

public class HelloWorld extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)
    throws IOException, ServletException
    {
        AttributePrincipal principal = (AttributePrincipal) request.getUserPrincipal();
        String username = principal.getName(); 
        response.setContentType("text/html");
        PrintWriter out = response.getWriter();
        out.println("");
        out.println("");
        out.println("Hello World");
        out.println("");
        out.println("");
        out.println("

Hello World!"+username+"

");         out.println("");         out.println("");     } }

访问localhost:8080/testWeb1/HelloWorldExample  ,首次访问任一页面就会跳转到

https://localhost:8080/cas/login进行认证


3.2 spring 方式

这里采用spring security 与cas结合的方式



	
	
	
	
	

	



	
	
	




	
	




	
	
	
	
	
	
		
		
			
		
	
	


	
	
	

	
		
	
	
	  
      
        
      
      
      
        
    
    
    
		
		
        
        
	



具体spring security 与cas 的配置结合,可参考 http://5148737.blog.51cto.com/5138737/1827795