https://github.com/apereo/java-cas-client

一、springboot项目单点集成

1.1、新建Springboot项目

  1. <dependencies>
  2. <dependency>
  3. <groupId>org.springframework.boot</groupId>
  4. <artifactId>spring-boot-starter-web</artifactId>
  5. </dependency>
  6. <!--单点客户端包-->
  7. <dependency>
  8. <groupId>org.jasig.cas.client</groupId>
  9. <artifactId>cas-client-core</artifactId>
  10. <version>3.3.3</version>
  11. </dependency>
  12. </dependencies>
#项目启动端口8002;单点端口为8001
server.port=8002
#sso配置,拦截所有.do请求
sso.urlfilter=*.do
sso.login=http://localhost:8001/login
sso.check=http://localhost:8001/
#本项目的地址
sso.return=http://localhost:8002

1.2、代码实现

CasDemoApplication

package com.cas.test.casdemo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.ServletComponentScan;

@SpringBootApplication
@ServletComponentScan//增加此注解,用于注册Filter
public class CasDemoApplication {
    public static void main(String[] args) {
        SpringApplication.run(CasDemoApplication.class, args);
    }
}

MyWebMvcConfigurer

package com.cas.test.casdemo.filter;

import org.jasig.cas.client.authentication.AuthenticationFilter;
import org.jasig.cas.client.session.SingleSignOutFilter;
import org.jasig.cas.client.util.AssertionThreadLocalFilter;
import org.jasig.cas.client.util.HttpServletRequestWrapperFilter;
import org.jasig.cas.client.validation.Cas20ProxyReceivingTicketValidationFilter;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
 * Created by admin on 2019/6/10.
 * CAS单点基础配置实现
 */
@Configuration
@Component
public class MyWebMvcConfigurer implements WebMvcConfigurer {

    @Value("${sso.urlfilter}")
    private String urlFilter;

    @Value("${sso.return}")
    private String serverName;
    @Value("${sso.login}")
    private String casServerLoginUrl;
    @Value("${sso.check}")
    private String casServerUrlPrefix;

    @Bean
    public FilterRegistrationBean LogoutFilterRegistrationBean(){ //单点退出
        FilterRegistrationBean logoutFilter = new FilterRegistrationBean();
        logoutFilter.setFilter(new SingleSignOutFilter());
        logoutFilter.setOrder(1);//单点配置拦截顺序1
        List<String> urlPatterns = new ArrayList<String>();
        urlPatterns.add(urlFilter);// 设置匹配的url
        logoutFilter.setUrlPatterns(urlPatterns);
        return logoutFilter;
    }

    @Bean
    public FilterRegistrationBean ValidationFilterRegistrationBean(){
        FilterRegistrationBean authenticationFilter = new FilterRegistrationBean();
        authenticationFilter.setFilter(new Cas20ProxyReceivingTicketValidationFilter());
        Map<String, String> initParameters = new HashMap<String, String>();
        initParameters.put("casServerUrlPrefix", casServerUrlPrefix);
        initParameters.put("serverName", serverName);
        authenticationFilter.setInitParameters(initParameters);
        authenticationFilter.setOrder(2);//单点配置拦截顺序2
        List<String> urlPatterns = new ArrayList<String>();
        urlPatterns.add(urlFilter);// 设置匹配的url
        authenticationFilter.setUrlPatterns(urlPatterns);
        return authenticationFilter;
    }

    @Bean
    public FilterRegistrationBean authenticationFilterRegistrationBean() {
        FilterRegistrationBean authenticationFilter = new FilterRegistrationBean();
        authenticationFilter.setFilter(new AuthenticationFilter());
        Map<String, String> initParameters = new HashMap<String, String>();
        initParameters.put("casServerLoginUrl", casServerLoginUrl);
        initParameters.put("serverName", serverName);
        authenticationFilter.setInitParameters(initParameters);
        authenticationFilter.setOrder(3);//单点配置拦截顺序3
        List<String> urlPatterns = new ArrayList<String>();
        urlPatterns.add(urlFilter);// 设置匹配的url
        authenticationFilter.setUrlPatterns(urlPatterns);
        return authenticationFilter;
    }

    @Bean
    public FilterRegistrationBean casHttpServletRequestWrapperFilter(){
        FilterRegistrationBean authenticationFilter = new FilterRegistrationBean();
        authenticationFilter.setFilter(new HttpServletRequestWrapperFilter());
        authenticationFilter.setOrder(4);//单点配置拦截顺序4
        List<String> urlPatterns = new ArrayList<String>();
        urlPatterns.add(urlFilter);// 设置匹配的url
        authenticationFilter.setUrlPatterns(urlPatterns);
        return authenticationFilter;
    }

    @Bean
    public FilterRegistrationBean casAssertionThreadLocalFilter(){
        FilterRegistrationBean authenticationFilter = new FilterRegistrationBean();
        authenticationFilter.setFilter(new AssertionThreadLocalFilter());
        authenticationFilter.setOrder(5);//单点配置拦截顺序5
        List<String> urlPatterns = new ArrayList<String>();
        urlPatterns.add(urlFilter);// 设置匹配的url
        authenticationFilter.setUrlPatterns(urlPatterns);
        return authenticationFilter;
    }
}

CasFilter

package com.cas.test.casdemo.filter;

import com.cas.test.casdemo.bean.User;
import org.jasig.cas.client.authentication.AttributePrincipal;
import org.springframework.core.annotation.Order;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
/**
 * Created by admin on 2019/6/10.
 * 单点获取用户信息后自定义业务实现
 */
@Order(6)
//单点配置拦截顺序6
@WebFilter(filterName = "casFilter", urlPatterns = "*.do")
public class CasFilter implements  Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {}
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse,FilterChain filterChain) throws IOException, ServletException {
        HttpServletRequest request= (HttpServletRequest) servletRequest;
        HttpSession session = request.getSession();
        //User为项目用户封装
        User user = session.getAttribute("USER")==null?null:(User)session.getAttribute("USER") ;
        if(user==null){
            AttributePrincipal principal = (AttributePrincipal)request.getUserPrincipal();
            String username = principal.getName();
            user=new User();
            user.setLoginName(username);
            user.setRealName("测试用户");
            session.setAttribute("USER",user);
        }
        System.out.println("当前用户:"+user.toString());
        filterChain.doFilter(servletRequest,servletResponse);
    }
    @Override
    public void destroy() {
    }
}

IndexController

package com.cas.test.casdemo.controller;

import com.cas.test.casdemo.bean.User;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

@RestController
public class IndexController {
    @GetMapping("/index.do")
    public User index(HttpServletRequest request, ModelMap modelMap){
        HttpSession session = request.getSession();
        User user = (User) session.getAttribute("USER");
        modelMap.put("user",user);
        return user;
    }
}

1.3、演示

访问:http://localhost:8002/index.do 会自动跳转到:http://localhost:8001/login?service=http%3A%2F%2Flocalhost%3A8002%2Findex.do 登录成功后又跳转到:**http://localhost:8002/index.do**

image.pngimage.png

访问-单点退出地址:**http://localhost:8001/logout** 应用再次访问时,又会要求登录,这个就不截图了

二、SSH项目单点集成

暂时不写了,在线用的也不多;等整个教程写完了抽空再补上 网上的其他教程我也看过了,配的乱七八糟的,虽然也能用;