使用spring sercurity+cas实现SSO单点登录

1、cas项目下载

Cas项目可以在GitHub上下载,地址:https://github.com/apereo/cas/releases

本文以cas V4.0.0为例,解压后得到的是cas server的源码,需要把目录下的cas-server-webapp项目加载到idea中。


2、配置cas项目的数据库连接和去掉https请求

配置cas-server

修改%tomcat_home%/webapps/cas/WEB_INF/deployerConfigContext.xml

配置数据库验证bean

 
    
        
        
        
        
        
    

修改authenticationManager


        
            
                
                
                
            
        

添加一个entry,primaryAuthenticationHandler。

创建自定义密码校验处理类

 
        
        
    

创建一个自定义的密码校验类MyAuthenticationHandler,继承AbstractJdbcUsernamePasswordAuthenticationHandler,
进行密码校验。

 @Override
    protected HandlerResult authenticateUsernamePasswordInternal(UsernamePasswordCredential usernamePasswordCredential) throws GeneralSecurityException, PreventedException {
        final String username = usernamePasswordCredential.getUsername();
        final String password = usernamePasswordCredential.getPassword();
        try {
            final Map values = getJdbcTemplate().queryForMap(this.sql, username);
            String dbPassword = (String) values.get("password");
            String salt = (String) values.get("salt");
            salt=username+salt;
            Integer status = (Integer) values.get("status");
            if(!status.equals(1)) { //判断帐号是否被冻结
                throw new AccountLockedException("This user is disabled.");
            }

            //密码加盐并迭代1024次
            String encryptedPassword = new Md5Hash(usernamePasswordCredential.getPassword(), salt, 2).toHex();
            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) {
            e.printStackTrace();
            throw new PreventedException("SQL exception while executing query for " + username, e);
        }
        return createHandlerResult(usernamePasswordCredential, new SimplePrincipal(username), null);
    }

去掉https验证

cas默认是采用https模式的,我们没有配置证书,所以去掉https验证取消https的过滤,让http协议也能访问
4.0.0 版本一共需要修改三个地方

修改deployerConfigContext.xml添加p:requireSecure=”false”

cas/WEB-INF/deployerConfigContext.xml

 
    

修改ticketGrantingTicketCookieGenerator.xml修改p:cookieSecure=”false”

cas/WEB-INF/spring-configuration/ticketGrantingTicketCookieGenerator.xml


修改warnCookieGenerator.xml修改p:cookieSecure=”false”

cas/WEB-INF/spring-configuration/warnCookieGenerator.xml


3、spring security 和cas的集成

修改spring-sercurity.xml
1、配置一个cas地址的properties文件。

#cas server login address
cas_server_login=http://localhost:8084/cas/login

#cas server login successful return localhost address
localhost_server=http://localhost:8080/nsycManager/j_spring_cas_security_check

#cas server ticket validator address
cas_server_address=http://localhost:8084/cas

#cas server logout successful return localhost address
cas_server_logout=http://localhost:8084/cas/logout?service=http://localhost:8080/nsycManager/login

2、设置spring sercurity的自动拦截设置为false,配置一个进入cas的认证入口casAuthEntryPoint。在拦截器里配置一个自定义的cas认证过滤器、一个注销客户端和一个注销session的服务器端的过滤器。


    
        
        
        
    


    
    

    
    


        
        

        
        
        
        
        
        
        
    

    
        
        
    

    
    
        
        
    

认证入口里配置一个cas的登录地址,和一个认证成功后当前项目的返回地址。
3、配置cas认证过滤器


    
        
        
        
        
    

    
    
        
    

    
    
        
        
        
        
    

    
    
        
    

    
        
    

    
    

    
    
        
    

    
    

    

配置一个拦截登录请求的URL地址、配置一个cas认证提供器、配置认证过滤器成功跳转方法和失败跳转方法。其中cas认证提供器里配置有cas的ticket的校验类casTicketValidator、ticket认证成功后返回的当前项目的地址、校验方式和UserDetailsService的实现类。
4、注销客户端过滤器

    
    

5、注销服务器端过滤器


    
        
        
        
            
        
        
         
        
    

注销服务器端的过滤器中,配置一个服务器的注销地址和当前项目退出操作的URL地址。

注意:服务器的注销地址中可以带一个注销成功后的回调地址。

cas_server_logout=http://localhost:8084/cas/logout?service=http://localhost:8080/nsycManager/login

需要配置cas项目
WEB-INF/cas.properties文件 改成true

##
# CAS Logout Behavior
# WEB-INF/cas-servlet.xml
#
# Specify whether CAS should redirect to the specified service parameter on /logout requests
 cas.logout.followServiceRedirects=true

注意:cas要和spring security集成,还需要添加spring-security-cas和cas-client-core这两个架包。
到此,spring sercurity和cas实现SSO单点登录完成。

你可能感兴趣的:(使用spring sercurity+cas实现SSO单点登录)