前后端分离集成CAS单点登录

修改nginx

复制代码
worker_processes  1;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    server {
        listen       80;
        server_name  localhost;
        location /api/ {
            proxy_pass http://127.0.0.1:9001/; # 后端
        }
        location / {
            proxy_pass http://127.0.0.1:3000/; # 前端
        }
    }
}

改写redirect返回401

java 复制代码
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ObjectNode;
import org.jasig.cas.client.authentication.AuthenticationRedirectStrategy;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Component;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

/**
 * <p>Title: </p>
 * <p>Description: CAS统一身份认证集成配置,session过期或未认证时返回结果处理</p>
 * <p>Copyright: Copyright  (c) 2023</p>
 * <p>Company: </p>
 *
 * @author yanfh
 * @version 1.0
 * @date 2023/4/14  10:11
 */
@Component
public class CustomAuthRedirectStrategy implements AuthenticationRedirectStrategy {

    /**
     * 重定向策略,由原来自动跳转url,改为返回json
     *
     * @param httpServletRequest request请求
     * @param httpServletResponse response请求
     * @param potentialRedirectUrl 重定向URL
     * @throws IOException IO异常
     */
    @Override
    public void redirect(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, String potentialRedirectUrl) throws IOException {
        httpServletResponse.setStatus(HttpStatus.UNAUTHORIZED.value());
        httpServletResponse.setHeader("content-type", "text/html;charset=UTF-8");
        httpServletResponse.setCharacterEncoding("UTF-8");
        PrintWriter out = httpServletResponse.getWriter();
        ObjectMapper om = new ObjectMapper();
        ObjectNode node = om.createObjectNode();
        node.put("code", HttpStatus.UNAUTHORIZED.value());
        node.put("message", "Unauthorized");
        out.write(om.writeValueAsString(node));
    }
}

cas 配置忽略拦截

java 复制代码
@Bean
    public FilterRegistrationBean filterAuthenticationRegistration() {
        final FilterRegistrationBean registration = new FilterRegistrationBean();
        registration.setFilter(new AuthenticationFilter());
        // 设定匹配的路径
        registration.addUrlPatterns("/*");
        Map<String, String> initParameters = new HashMap<String, String>();
        initParameters.put("casServerLoginUrl", serverLoginUrl);
        initParameters.put("serverName", clientHostUrl);

        if (ignorePattern != null && !"".equals(ignorePattern)) {
            initParameters.put("ignorePattern", ignorePattern);
        }

        //自定义UrlPatternMatcherStrategy 验证规则
        if (ignoreUrlPatternType != null && !"".equals(ignoreUrlPatternType)) {
            initParameters.put("ignoreUrlPatternType", ignoreUrlPatternType);
        }
        initParameters.put("authenticationRedirectStrategyClass", CustomAuthRedirectStrategy.class.getName());
        registration.setInitParameters(initParameters);
        // 设定加载的顺序
        registration.setOrder(2);
        return registration;
    }

前端请求后端接口判断是否返回401,若返回401,手动拼接认证地址跳转window.location.href='http://CAS服务端/cas/login?service='+encodeURIComponent('http://后端/api/login'),由后端 response.sendRedirect("http://前端页面")

java 复制代码
@GetMapping("/login")
    public void casRedirect(HttpServletRequest request, HttpServletResponse response) {
        try {
            response.sendRedirect(clientUrl);
        } catch (java.io.IOException e) {
            throw new RuntimeException(e);
        }
    }
相关推荐
菜鸟小九10 分钟前
JVM垃圾回收
java·jvm·算法
曹牧14 分钟前
JDK 1.6 ,无法通过安全套接字层(SSL/TLS)加密建立数据库安全连接
java·开发语言·ssl
book123_0_9921 分钟前
Redis四种模式在Spring Boot框架下的配置
java
IT成长史27 分钟前
Windows D盘安装Docker Desktop全流程(避坑+ECR镜像推送实战)
java·docker
一定要AK34 分钟前
java基础
java·开发语言·笔记
splage41 分钟前
Java进阶之泛型
java·开发语言
Meepo_haha43 分钟前
python爬虫——爬取全年天气数据并做可视化分析
java
xiaohe0743 分钟前
JAVA系统中Spring Boot 应用程序的配置文件:application.yml
java·开发语言·spring boot
Eternity_GQM44 分钟前
【CMake入门】
java·开发语言
糖猫猫cc1 小时前
Kite 实现逻辑删除
java·kotlin·orm·kite