SpringBoot整合CAS服务

环境:
电脑:win10
cas版本:5.3.14
后端:SpringBoot
数据库:MySQL
开发工具:IDEA
两个后端服务:一个端口8888,一个9999。

看下效果:
1.首先,我们分别访问两个系统的某个静态资源。
在这里插入图片描述
1是该服务端口,2是访问的资源。发现进入了cas的登录页面。
在这里插入图片描述
第二个服务同样如此。
2.
在第一个服务登录成功,进入到我一开始访问的页面,我们再来看下访问第二个服务的资源。
这时我们刷新下页面就直接进来了,就省去了登录操作。
接下来我们看如何配置实现该功能,前提是有两个客户端服务。(这里省去了搭建cas服务端的操作,可参考之前的博客搭建:https://blog.csdn.net/weixin_45732391/article/details/123462845?spm=1001.2014.3001.5502
在这里插入图片描述
在这里插入图片描述
一、修改pom文件
在pom文件里添加客户端依赖。

<dependency>
            <groupId>org.jasig.cas.client</groupId>
            <artifactId>cas-client-core</artifactId>
            <version>3.5.0</version>
</dependency>

二、添加url验证策略对象

package com.example.demo.config;

import org.jasig.cas.client.authentication.UrlPatternMatcherStrategy;

import java.util.regex.Pattern;

public class SimpleUrlPatternMatcher implements UrlPatternMatcherStrategy {
    private Pattern pattern;
    @Override
    public boolean matches(String s) {
        return this.pattern.matcher(s).find();
    }

    @Override
    public void setPattern(String s) {
        this.pattern = Pattern.compile(s);
    }
}

二、添加客户端配置对象

package com.example.demo.config;

import org.jasig.cas.client.authentication.AuthenticationFilter;
import org.jasig.cas.client.session.SingleSignOutFilter;
import org.jasig.cas.client.session.SingleSignOutHttpSessionListener;
import org.jasig.cas.client.util.HttpServletRequestWrapperFilter;
import org.jasig.cas.client.validation.Cas30ProxyReceivingTicketValidationFilter;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.boot.web.servlet.ServletListenerRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.HashMap;
import java.util.Map;


@Configuration
public class CasClientConfig {
    //cas服务前缀
    private static final String CAS_SERVER_URL_PREFIX="http://localhost:8443/cas/";
    //cas服务登录地址
    private static final String CAS_SERVER_LOGIN_URL="http://localhost:8443/cas/login";
    //本机服务的名称
    private static final String SERVER_NAME="http://localhost:9999";
    
    //登出过滤器
    @Bean
    public FilterRegistrationBean filterSingleRegistrationBean(){
        System.out.println("----filterSingleRegistrationBean-----");
        FilterRegistrationBean registrationBean = new FilterRegistrationBean();
        registrationBean.setFilter(new SingleSignOutFilter());
        //拦截所有的url
        registrationBean.addUrlPatterns("/*");
        Map<String,String> init = new HashMap<String,String>();
        init.put("casServerUrlPrefix",CAS_SERVER_URL_PREFIX);
        registrationBean.setInitParameters(init);
        //设置调用顺序
        registrationBean.setOrder(1);
        return registrationBean;
    }
    
    //验证过滤器
    @Bean
    public FilterRegistrationBean filterValidRegistrationBean(){
        System.out.println("----filterValidRegistrationBean-----");
        FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();
        filterRegistrationBean.setFilter(new Cas30ProxyReceivingTicketValidationFilter());
        filterRegistrationBean.addUrlPatterns("/*");
        Map<String,String> init = new HashMap<String,String>();
        init.put("casServerUrlPrefix",CAS_SERVER_URL_PREFIX);
        init.put("serverName",SERVER_NAME);
        //将登录用户信息放入session,默认为true
        init.put("useSession","true");
        filterRegistrationBean.setInitParameters(init);
        filterRegistrationBean.setOrder(1);
        return filterRegistrationBean;
    }

	//认证过滤器
    @Bean
    public FilterRegistrationBean filterAuthenticationRegistrationBean(){
        System.out.println("----filterAuthenticationRegistrationBean-----");
        FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();
        filterRegistrationBean.setFilter(new AuthenticationFilter());
        filterRegistrationBean.addUrlPatterns("/*");
        Map<String,String> init = new HashMap<String,String>();
        init.put("casServerLoginUrl",CAS_SERVER_LOGIN_URL);
        init.put("serverName",SERVER_NAME);
        //当前服务退出的方法路径,我这里没写,先注释掉
//        init.put("ignorePattern","");
        //路径匹配策略
        init.put("ignoreUrlPatternType","com.example.demo.config.SimpleUrlPatternMatcher");
        filterRegistrationBean.setInitParameters(init);
        filterRegistrationBean.setOrder(1);
        return filterRegistrationBean;
    }
	
	//包装过滤器
    @Bean
    public FilterRegistrationBean filterWrapperRegistrationBean(){
        System.out.println("----filterWrapperRegistrationBean-----");
        FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();
        filterRegistrationBean.setFilter(new HttpServletRequestWrapperFilter());
        filterRegistrationBean.addUrlPatterns("/*");
        filterRegistrationBean.setOrder(1);
        return filterRegistrationBean;
    }
    @Bean
    public ServletListenerRegistrationBean servletListenerRegistrationBean(){
        System.out.println("----servletListenerRegistrationBean-----");
        ServletListenerRegistrationBean servletListenerRegistrationBean = new ServletListenerRegistrationBean();
        servletListenerRegistrationBean.setListener(new SingleSignOutHttpSessionListener());
        servletListenerRegistrationBean.setOrder(1);
        return servletListenerRegistrationBean;
    }


}

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐