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:9010validation-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);}@Overrideprotected 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;@Overridepublic 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

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++中的函数重载:多功能而强大的特性

引言 函数重载是C编程语言中的一项强大特性&#xff0c;它允许在同一个作用域内定义多个同名函数&#xff0c;但这些函数在参数类型、个数或顺序上有所不同。本文将深入探讨函数重载的用法&#xff0c;以及它的优势和应用场景。 正文 在C中&#xff0c;函数重载是一项非常有…

【 Docker: 数据卷挂载】

背景 Docker只提供了容器运行的必备依赖&#xff0c;但是一些编辑等操作的依赖是不支持的&#xff0c;如vi操作容器内部文件、将静态资源拷贝到容器内来等。 docker pull nginx docker run -d -p 81:80 --namemynginx -v D:/docker/nginx/www:/usr/share/nginx/www -v D:/dock…

C# OpenCvSharp 去除文字中的线条

效果 中间过程效果 项目 代码 using OpenCvSharp; using System; using System.Drawing; using System.Windows.Forms; using static System.Net.Mime.MediaTypeNames;namespace OpenCvSharp_Demo {public partial class frmMain : Form{public frmMain(){InitializeComponent…

Jmeter_逻辑控制器

逻辑控制器 控制取样器执行顺序的组件实现(分支 循环) 分类 1、如果(if) 控制器 分支实现 2、forEach控制器 循环往复实现 3、循环控制器 循环往复实现 如果(if) 控制器 需求1:测试计划中定义一个 http 请求访问百度&#xff0c;但是该请求不是无条件执行的&#xff0c;…

亚马逊云科技Zero ETL集成全面可用,可运行近乎实时的分析和机器学习

亚马逊云科技数据库、数据分析和机器学习全球副总裁Swami Sivasubramanian曾指出&#xff1a;“数据是应用、流程和商业决策的核心。”如今&#xff0c;客户常用的数据传输模式是建立从Amazon Aurora到Amazon Redshift的数据管道。这些解决方案能够帮助客户获得新的见解&#x…

kubernetes集群编排(9)

目录 helm 部署helm 封装chart包 上传chart到OCI仓库 部署wordpress博客系统 helm部署storageclass helm部署ingress-nginx helm部署metrics-server kubeapps 更新 helm 部署helm 官网&#xff1a; Helm | 快速入门指南 https://github.com/helm/helm/releases [rootk8s2 ~]# t…

97 只出现一次的数字

只出现一次的数字 题解1 异或的应用&#xff08;判断出现次数是奇偶&#xff09; 给你一个 非空 整数数组 nums &#xff0c;除了某个元素只出现一次以外&#xff0c;其余每个元素均出现两次。找出那个只出现了一次的元素。 你必须设计并实现线性时间复杂度的算法来解决此问题…

Antv/G2 图表背景实线改为虚线

坐标轴 - Axis 文档 绘图属性 - ShapeAttrs 文档 图表背景实线改为虚线代码示例&#xff1a; chart.axis("value", {grid: {// 背景网格刻度线样式line: {style: {lineWidth: 0.5,lineDash: [5, 2], //虚线},},}, });未设置前页面效果&#xff1a; 添加代码配置&…

第十八章总结

一.Swing概述 二.Swing常用窗体 1.JFrame窗体 创建一个不可见、具有标题的窗体&#xff0c;关键代码&#xff1a; JFrame jfnew JFrame("登陆系统"); Container containerjf.getContentPane(); 在创建窗体后&#xff0c;先调用getContentPane()方法将窗体转…

工业镜头接口类型

现有产品主要有以下接口 1、C:最常见的工业相机接口&#xff0c;受限于接口物理尺寸大小&#xff0c;最大靶面目前是4/3” 2、M42:M421.0,2k和4k线阵相机使用 3、M58S:M580.75,大靶面相机使用&#xff0c;可以转C(限于CH080相机&#xff0c;靶面4/3”)&#xff0c;可以转F,可以…

如何在Linux上部署1Panel运维管理面板并远程访问内网进行操作

文章目录 前言1. Linux 安装1Panel2. 安装cpolar内网穿透3. 配置1Panel公网访问地址4. 公网远程访问1Panel管理界面5. 固定1Panel公网地址 前言 1Panel 是一个现代化、开源的 Linux 服务器运维管理面板。高效管理,通过 Web 端轻松管理 Linux 服务器&#xff0c;包括主机监控、…

Leetcode—102.二叉树的层序遍历【中等】

2023每日刷题&#xff08;二十四&#xff09; Leetcode—102.二叉树的层序遍历 C语言BFS实现代码 /*** Definition for a binary tree node.* struct TreeNode {* int val;* struct TreeNode *left;* struct TreeNode *right;* };*/ /*** Return an array of arr…