SpringBoot前后端分离整合cas(客户端)

SpringBoot前后端分离整合cas(客户端)

cas认证详细流程:
在这里插入图片描述
前后端分离:项目前端使用nginx启动,后端是springBoot服务;
nginx可以统一管理Cookie,避免出现跨域问题。

添加依赖

  <dependency>
            <groupId>org.jasig.cas.client</groupId>
            <artifactId>cas-client-support-springboot</artifactId>
            <version>3.6.2</version>
  </dependency>

配置文件添加

cas:
  # cas服务端地址,nginx代理
  server-url-prefix: http://127.0.0.1:9010/cas
  # cas服务端登录地址,nginx代理
  server-login-url: http://127.0.0.1:9010/cas/login
  # 当前服务程序地址,nginx代理
  client-host-url: http://127.0.0.1:9010
  validation-type: cas3
  
# 不校验权限路径(正则表达式)
ignorePattern: ".*\\/api\\/rest\\/test\\/.*|.*\\/test\\/hello"

启动类添加注解@EnableCasClient

@EnableCasClient
@SpringBootApplication
public class TestApplication extends SpringBootServletInitializer {

    public static void main(String[] args) {
        SpringApplication.run(TobApplication.class, args);
    }
    
    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application.sources(TobApplication.class);
    }
}

重写cas客户端配置

@Configuration
public class SmsCasClientConfigurer implements CasClientConfigurer {
    @Value("${host-url}")
    private String serverName;
    @Value("${ignorePattern}")
    private String ignorePattern;
    @Value("${cas.server-login-url}")
    private String serverLoginUrl;
    @Value("${casLogin-url}")
    private String casLoginUrl;

    @Override
    public void configureAuthenticationFilter(FilterRegistrationBean authenticationFilter) {
        Map initParameters = authenticationFilter.getInitParameters();
        // 设置不校验权限路径  
        initParameters.put("ignorePattern", ignorePattern);  
    } 
}

默认Get接口

@RestController
@RequestMapping("/api/common")
public class CommonController {
    @GetMapping("/getUserName")
    public String getUserName(HttpServletRequest request) {
        if(request.getUserPrincipal()!=null){
        	return request.getUserPrincipal().getName();
        }else{
			return "";
		}
    }

前端添加拦截

我的前端使用的vue,若不是可以参考文章底部博客。

前端登陆之后cas服务端会默认添加"TGC"的cookie到浏览器,然后会跳转到前端页面,前端首次去访问后端程序时需要验证票据,所以默认第一个请求接口尽量是get请求,若是post可能会被cas重定向成get。下面的2,3步你也可以不做,直接在路由守卫permission.js中直接调用接口,根据自己的实际情况使用此博客即可。

1,get请求接口src\api\commonAPI.js

import { httpServer } from 'axios'

export function getUserNameAPI (data) {
  return httpServer.get(`api/common/getUserName`);
}

2,设置缓存src\store\modules\user.js

import { getUserNameAPI } from "@/api/commonAPI.js";

const state = {
  username: ""
}

/*从session获取username,vue页面中可调用:如下示例
...
{{getUserName}}
...
computed: {
    ...mapGetters(["getUserName"]),
}
...
*/
const getters = {
  getUserName: state => {
    var name;
    if (sessionStorage.getItem('username')) {
      name= sessionStorage.getItem('username');
    } else {
      name= state.username;
    }
    return name;
  }
}

const mutations = {
  ["SET_USER_NAME"](state, data) {
    state.username = data === null ? "" : data;
    sessionStorage.setItem('username',data)
  }
}

//调用接口并添加username到session中
const actions = {
  getUserName({commit}) {
    return new Promise(resolve => {
      getUserNameAPI().then(res => {
        commit("SET_USER_NAME", res);
        resolve()
      });
    })
  }
}

export default {
  state,
  getters,
  mutations,
  actions
};

3,添加user.js到src\store\index.js

import Vue from "vue";
import Vuex from "vuex";
import createPersistedState from "vuex-persistedstate";
import user from "./modules/user";

Vue.use(Vuex);

export default new Vuex.Store({
  modules: {
    user
  },
  plugins: [createPersistedState({ storage: window.sessionStorage })]
});

4,修改路由守卫src\permission.js

//路由拦截
import  {Spin} from "view-design";
import "view-design/dist/styles/iview.css";
import router from "./router";
import store from "./store";
import Cookies from "js-cookie";

Spin.show({
  render: (h) => {
    return h('div', [
      h('div', '登录中...')
    ])
  }
})

router.beforeEach((to, from, next) => {
  //走cas校验
  if(true){
    let CUR_URL = window.location.href;
    //判断是否存在TGC的Cookies,不存在则跳转到cas登录页面登录,登陆成功之后cas服务端会添加TGC的Cookies到浏览器中
    let CASTGC_COOKIE = Cookies.get("TGC")?true:false;
    if (CASTGC_COOKIE) {
      // 登录
      if (CUR_URL.indexOf("?ticket") > -1) {
        window.location.href = CUR_URL.split("?ticket")[0];
      }
      Promise.all([store.dispatch('getUserName')]).then(opts => {
        Spin.hide();
        next();
      })
    } else {
      window.location.href = `http://127.0.0.1:9010/cas/login?service=${window.location}`;
    }
  } else {
    //不走cas校验
    Promise.all([store.dispatch('getUserName')]).then(opts => {
      Spin.hide();
      next();
    })
  }
});

nginx代理

worker_processes  1;
events {
    worker_connections  1024;
}
http {
	include /etc/nginx/mime.types;
    default_type application/octet-stream;
    		
    sendfile on;
    keepalive_timeout 65;
    
	server {
        	listen       9010;
        	server_name  127.0.0.1;
        	
        	#nginx代理前端
			location / {
            	autoindex on;
            	add_header Access-Control-Allow-Origin *;
            	add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS';
            	# 静态资源位置
            	alias /usr/share/nginx/html;
            	index  index.html;
            	try_files $uri $uri/ /index.html last;
        	}
			
			#我的后端服务,my_server为我的服务前缀
			location ^~  /my_server/ {
            	proxy_pass http://127.0.0.1:8091/my_server/;
            	add_header Access-Control-Allow-Origin *;
            	proxy_cookie_path /my_server/ /;  #解决nginx转发丢失cookie的问题

            	# 支持 OPTIONS 请求,并设置预检请求结果的缓存时间
            	if ($request_method = 'OPTIONS') {
                	add_header 'Access-Control-Max-Age' 1728000;
                	add_header 'Content-Type' 'text/plain charset=UTF-8';
                	add_header 'Content-Length' 0;
                	return 204;
            	}
         	}

			#cas服务端
			location ^~  /cas/ {
            	proxy_pass http://127.0.0.1:8092/cas/;
            	add_header Access-Control-Allow-Origin *;
            	proxy_cookie_path /cas/ /;  #解决nginx转发丢失cookie的问题

            	# 支持 OPTIONS 请求,并设置预检请求结果的缓存时间
            	if ($request_method = 'OPTIONS') {
                	add_header 'Access-Control-Max-Age' 1728000;
                	add_header 'Content-Type' 'text/plain charset=UTF-8';
                	add_header 'Content-Length' 0;
                	return 204;
            	}
         	}
     }
}

参考博客:
https://blog.csdn.net/weixin_41358538/article/details/130880319

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/121590.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C语言常见面经详细总结

1、递归函数定义没有问题&#xff0c;递归深层次后易引发什么问题&#xff1f; &#xff08;1&#xff09;影响执行效率 &#xff08;2&#xff09;栈溢出。 因为每一次调用函数是&#xff0c;栈区都要给函数分配空间&#xff0c;而且上一次调用并没有结束&#xff0c;调用的…

挑战100天 AI In LeetCode Day07(热题+面试经典150题)

挑战100天 AI In LeetCode Day07&#xff08;热题面试经典150题&#xff09; 一、LeetCode介绍二、LeetCode 热题 HOT 100-92.1 题目2.2 题解 三、面试经典 150 题-93.1 题目3.2 题解 一、LeetCode介绍 LeetCode是一个在线编程网站&#xff0c;提供各种算法和数据结构的题目&am…

2023年下半年架构案例真题及答案

案例的考点&#xff1a; 大数据架构 Lambda架构和Kappa架构 jwt特点 数据持久层&#xff0c;Redis数据丢失&#xff0c;数据库读写分离方案 Hibernat架构 SysML七个关系&#xff0c;填需求图 大数据的必选题&#xff1a; 某网作为某电视台在互联网上的大型门户入口&#…

Python高级语法----深入理解Python协程

文章目录 什么是协程?Python中的协程基本示例协程和事件循环总结Python协程是一种非常强大的并发编程概念,让你能够高效地处理多任务。协程在Python中的使用已经变得越来越流行,特别是在异步编程中。本文将用通俗易懂的语言来介绍协程的概念,并提供实际的代码示例和执行结果…

‘vite‘ is not recognized as an internal or external command

标题翻译后就是&#xff1a;‘vite‘ 不是内部或外部命令&#xff0c;也不是可运行的程序 或批处理文 运行一个由 Vite 构建的 Vue3 项目&#xff0c;之前还好好的能正常跑&#xff0c; 但拉取新代码之后再次执行 npm run dev 就提示 ‘vite’ 不是内部或外部命令&#xff0…

粤嵌实训医疗项目(小组开发)--day05

目录 一、医生功能模块 ------------前端实现------------ ------------后端接口------------ 功能一&#xff1a;分页查询医生基础信息&#xff08;介绍MybatisPlus如何使用分页&#xff09; 功能二&#xff1a;根据搜索栏名称查找对应医生&#xff08;讲解自定义查询集&…

UE5 新特性 Nanite 开启

啥也不说&#xff0c;只能说&#xff0c;真的牛&#xff0c;在自己的项目上&#xff0c;从10几20的帧数&#xff0c;直接彪到了70 适用场景&#xff1a; 大场景&#xff0c;三角面足够多 在Project Setting里面 将这几个勾未true 勾上这个&#xff0c;放入场景即可

2023年【A特种设备相关管理(锅炉压力容器压力管道)】考试内容及A特种设备相关管理(锅炉压力容器压力管道)考试技巧

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 A特种设备相关管理&#xff08;锅炉压力容器压力管道&#xff09;考试内容根据新A特种设备相关管理&#xff08;锅炉压力容器压力管道&#xff09;考试大纲要求&#xff0c;安全生产模拟考试一点通将A特种设备相关管理…

arthas常用命令

arthas常用命令 IDEA插件 arthas idea退出arthasjad 反编译watch 方法执行数据观测tracemonitor https://arthas.aliyun.com/doc/ IDEA插件 arthas idea 退出arthas # quit或者exit命令,只是退出当前的连接, Attach到目标进程上的arthas还会继续运行&#xff0c;端口会保持开…

Win10专业版安装wsl-ubuntu子系统

文章目录 一、查看是否满足安装要求二、管理员权限启动 Windows PowerShell三、启用Windows10子系统功能四、启用虚拟机平台功能五、重启电脑六、下载 Linux 内核更新包&#xff08;适用于 x64 计算机的 WSL2 Linux 内核更新包&#xff09;七、将 WSL 2 设置为默认版本八、打开…

Linux--vim

文章目录 Vim的介绍Vim的几种模式命令模式下的基本操作批量化注释Vim的简单配置使用插件 Vim的介绍 Vim是一个强大的文本编辑器&#xff0c;是从vi编辑器发展而来的&#xff0c;在vi编辑器的基础上进行了改进和拓展&#xff0c;具有强大的特性和功能。 Vim是一个自由开源软件&…

C# OpenCvSharp 环形文字处理 直角坐标与极坐标转换

效果1 效果2 项目 代码 using OpenCvSharp; using System; using System.Drawing; using System.Text; using System.Windows.Forms;namespace OpenCvSharp_Demo {public partial class frmMain : Form{public frmMain(){InitializeComponent();}string fileFilter "*.*…

基于SSM的电脑公司财务管理系统

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;Vue 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#xff1a;是 目录…

高防CDN与高防服务器:为什么高防服务器不能完全代替高防CDN

在当今的数字化时代&#xff0c;网络安全已经成为企业不容忽视的关键问题。面对不断增长的网络威胁和攻击&#xff0c;许多企业采取了高防措施以保护其网络和在线资产。然而&#xff0c;高防服务器和高防CDN是两种不同的安全解决方案&#xff0c;各自有其优势和局限性。在本文中…

概念解析 | 雷达协同认知成像:原理、研究现状与挑战

注1:本文系“概念解析”系列之一,致力于简洁清晰地解释、辨析复杂而专业的概念。本次辨析的概念是:雷达协同认知成像。 概念解析 | 雷达协同认知成像:原理、研究现状与挑战 摘要: 雷达协同认知成像,作为一种先进的感知技术,在军事侦察、民用航空、无人驾驶等领域具有广…

绝缘监测及故障定位产品在IT系统中的应用

绝缘监测及故障定位产品在IT系统中的应用--安科瑞 崔丽洁 医疗2类场所应用场景 功能 1.将TN-S系统转接成IT配电系统&#xff0c;并通过IT系统向医疗2类场所供电&#xff1b; 2.实时IT系统对地绝缘电阻、隔离变压器负荷及其温度状态&#xff0c;并在故障时发出声光报警信号&…

案例-注册页面(css)

html页面用css控制样式&#xff0c;画一个注册页面。 页面最终效果如下&#xff1a; 页面代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>注册页面</title> <style>*{…

【分布式事务】初步探索分布式事务的概率和理论,初识分布式事的解决方案 Seata,TC 服务的部署以及微服务集成 Seata

文章目录 一、分布式服务案例1.1 分布式服务 demo1.2 演示分布式事务问题 二、分布式事务的概念和理论2.1 什么是分布式事务2.2 CAP 定理2.3 BASE 理论2.4 分布式事务模型 三、分布式事务解决方案 —— Seata3.1 什么是 Seata3.2 Seata 的架构3.3 Seata 的四种分布式事务解决方…

JavaEE-博客系统3(功能设计)

本部分内容为&#xff1a;实现登录功能&#xff1b;强制要求用户登录&#xff1b;实现显示用户信息&#xff1b;退出登录&#xff1b;发布博客 该部分的后端代码如下&#xff1a; Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws Ser…

信息系统项目管理师第四版:第5章 信息系统工程

请点击↑关注、收藏&#xff0c;本博客免费为你获取精彩知识分享&#xff01;有惊喜哟&#xff01;&#xff01; 信息系统工程是用系统工程的原理、方法来指导信息系统建设与管理的一门工程技术学科&#xff0c;它是信息科学、管理科学、系统科学、计算机科学与通信技术相结合…