spring cloud 前后端分离集成CAS client

spring cloud 前后端分离集成CAS client

服务端搭建与简易配置

客户端集成遇到的问题

是否启用CAS (公网登录页一套、内网CAS一套)

jar包原始注解中直接引入,没有提供是否启用的属性

@EnableCasClient

通过自定义注解实现自由开关

@Configuration
@ConditionalOnProperty(name = "casqy.enabled", havingValue = "true")
@Import(CasClientConfiguration.class)
public class ConditionalCasClientConfiguration {
}
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@Import({ConditionalCasClientConfiguration.class})
public @interface CasClient {
}

cas认证过期固定重定向前端首页

CAS会转发自己系统认证失败的接口地址:
http://127.0.0.1:8080/cas/login?service=http://127.0.0.1:8087/api/auth/cn/dengl

service= 后面跟的就是在CAS认证完后会转发回来的地址,这样就会导致资源接口认证失败就成调用接口,而不是访问回应用系统,所以需要重写CAS redirect 重定向方法

@Configuration
public class CasClientConfig extends CasClientConfigurerAdapter {
	@Override
	public void configureAuthenticationFilter(FilterRegistrationBean authenticationFilter) {
		Map<String, String> initParameters = authenticationFilter.getInitParameters();
		initParameters.put("authenticationRedirectStrategyClass", "org.springblade.auth.redirect.CustomAuthRedirectStrategy");
	}

	@Override
	public void configureValidationFilter(FilterRegistrationBean filterRegistrationBean) {

	}

	@Override
	public void configureHttpServletRequestWrapperFilter(FilterRegistrationBean filterRegistrationBean) {

	}

	@Override
	public void configureAssertionThreadLocalFilter(FilterRegistrationBean filterRegistrationBean) {

	}
}
@Component
public class CustomAuthRedirectStrategy implements AuthenticationRedirectStrategy {
	@Override
	public void redirect(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, String s) throws IOException {
		StringBuilder stringBuilder = new StringBuilder();
		// 1.此处判断请求路径是否是cas/login认证接口请求,但请求报错不是(登录接口:dengl,获取token接口:skipLogin)
		// 在cas认证过期时,需要对其他资源调用接口进行限制,所以返回给前端401状态
		if(s.contains("/cas/login")&&!s.contains("dengl")&&!s.contains("skipLogin")){
			String loginUrl = s.substring(0, s.indexOf("?"));
			// 1.1 先找到第一个斜杠(通常位于 "http://" 后)
			int firstSlash = loginUrl.indexOf("/") + 2;
			// 1.2 再找到下一个斜杠,从刚才找到的斜杠后面开始
			int secondSlash = loginUrl.indexOf("/", firstSlash);
			// 1.3 如果secondSlash为-1(即之后没有其他斜杠),则截取到字符串末尾
			int thirdSlash = secondSlash != -1 ? loginUrl.indexOf("/", secondSlash + 1) : loginUrl.length();
			// 1.4 根据找到的斜杠位置截取子字符串
			String http = loginUrl.substring(0, secondSlash != -1 ? secondSlash : loginUrl.length());
			// 1.5 固定转发访问的接口地址,不固定service里会是转发的前端调用报错接口 (暂时没用)
			stringBuilder.append(loginUrl+"?service="+http+"/api/auth/cn/dengl");
			// 1.6 固定给401,让前端页面返回首页从获取token开始
			httpServletResponse.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
			httpServletResponse.setHeader("Location", stringBuilder.toString()); // 提供重定向 URL,但不自动重定向
			httpServletResponse.getWriter().write("Unauthorized - Please login at: " + stringBuilder.toString());
		}else if(s.contains("/cas/login")&&s.contains("skipLogin")) {
			stringBuilder.append(s);
			httpServletResponse.sendRedirect(stringBuilder.toString());
		}else{
			stringBuilder.append(s);
			httpServletResponse.sendRedirect(stringBuilder.toString());
		}
	}
}

博主这边应用系统前端只对登录、登出进行前端url转发。

所以在第一个if中只对应用系统资源访问接口进行判断(排除登录、登出、跳转),请求头返回 401 让前端直接去调用token的获取,这样就解决资源接口访问状态码 302 前端还要自行处理转发问题

CAS跳转前端首页,过期问题

cas过期处理

 skipLoginTwo().then(res => {
        let data = res.data.data;
        if (data===undefined) {
          window.location.href=res.request.responseURL;
        } else{
        //获取token
        }

后端处理了转发路径问题,前端直接调用就行
login、logout接口都只返回302状态码,res.data.data都是undefined,当然你也可以在请求头中加标识,前端判断

跨域问题

location /cas/ {
    add_header 'Access-Control-Allow-Origin' '*';
    add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
    add_header 'Access-Control-Allow-Headers' 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization';
    add_header 'Access-Control-Allow-Credentials' 'true';
    proxy_pass http://ip:port;
}

全是通过自己服务器的nginx去转发

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SpringCloud前后端分离架构中,前端和后端是独立部署的。前端使用Vue.js或Bootstrap等技术进行开发,通过调用后端提供的RESTful API接口来获取数据并展示。\[1\]在这种架构下,可以使用两种方式进行分页处理。 第一种方式是直接在MyBatis数据库层进行分页处理。这种方式通过在SQL语句中使用LIMIT关键字来限制查询结果的数量,从而实现分页效果。\[1\] 第二种方式是在后端使用Spring Boot来进行分页处理。在启动类中使用@SpringBootApplication注解来标识该类是Spring Boot的启动类,然后通过引入spring-boot-starter-web依赖来配置前端服务的端口。\[2\]\[3\] 总结起来,SpringCloud前后端分离架构中,可以通过直接在MyBatis数据库层或在后端使用Spring Boot来实现分页处理。具体选择哪种方式取决于项目的需求和开发团队的技术栈。 #### 引用[.reference_title] - *1* [SpringCloud+MyBatis分页处理(前后端分离)](https://blog.csdn.net/weixin_46161383/article/details/130082744)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [SpringCloud工程搭建之前后端分离搭建(可选)](https://blog.csdn.net/qq_32770097/article/details/120169712)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值