Java解决Jira单点登录、登出思路介绍

news2024/11/25 16:03:00

说明:
当前环境的Jira是容器部署的,所以方案中的整个流程是在docker环境下进行分析。且方案为解决思路或者说解决方式的一种,仅供参考,不喜勿喷。当然依然存在个别问题,没能完全优化完,想了解的可以直接看最后。
如果有其它优化方案或者问题欢迎评论区讨论学习。

前置知识: docker、docker-compose

镜像环境说明:
我的Jira镜像版本:atlassian/jira-software:9.4.2-ubuntu-jdk11
如果是其他版本,思路应该大同小异(可以仿照当前文档,从其他版本的容器中拷贝对应的jra包以及配置文件即可,可能有差别,可能都一样)
我会提供所有的代码以及环境依赖和镜像,方便道友们模拟测试

其他:
如果想先看效果,到资料栏中获取资料,将jira-sso-linux.tar解压后,执行:docker-compose up -d创建容器。浏览器访问:ip:8088等待jira启动完毕。创建账号密码时,账号必须是root、密码必须是dev@msi。jira启动完毕以后,可以先登录root用户看看是否能成功登录,保证jira正常启动。接着退出root用户,浏览器输入地址:ip:8088/login.html。会发现登录的是张三的用户。

流程图:

在这里插入图片描述

思路:

  1. 为业务系统提供一个login.html页面作为单点登录的地址。业务系统通过访问该地址达到免登录功能。在html中,通过js自动提交请求到Jira本身的login.jsp(没有使用原本的login.jsp页面主要是因为没去研究(也不会 = =)jsp文件反编译以及编译,用html相对简单,并且用html不会影响原本的loign.jsp页面的访问,不排除单独访问Jira应用正常访问)
  2. 使用在本地编写符合自身业务的的login方法,而不使用原本默认登陆的login方法(核心登录使用原本的逻辑,实现来源于DefaultAuthenticator类,在此基础上进行修改)
/** 
* html中form表单提交的action路径(login.jsp)会到Jira以下类中的login方法
* 原本默认请求会到JiraSeraphAuthenticator类中的login方法
* 这里的SSOSeraphAuthenticator是在原本的类中进行修改,名称可自定义,但是要与jira配置文件的名称一致
*/
public class SSOSeraphAuthenticator extends DefaultAuthenticator {
		public boolean login(){}
}
  1. 修改配置文件:配置SSOSeraphAuthenticator类,不然会到默认的JiraSeraphAuthenticator类
  2. 通过docker-compose更新容器中的配置(曾经不使用编排文件的形式修改时,发现配置文件会在重启时,会恢复成原本默认的配置,导致配置不生效,当然本文提供的这种方式确保有效(手动部署的jira没了解过))。让程序运行时使用本地编译好的SSOSeraphAuthenticator类的class文件,使得登录时执行自己的方法进行认证(走我们SSOSeraphAuthenticator类中的login,而不走默认JiraSeraphAuthenticator类中的login

版本

这里是我的运行环境版本,且docker及docker-compose是必要的

  1. Jira镜像版本:atlassian/jira-software:9.4.2-ubuntu-jdk11
  2. jdk:17.0.8
  3. maven:3.8.3
  4. docker
  5. docker-compose

其他说明:

  1. jdk和maven的版本应该没有过多要求,本地可以正常编译代码即可
  2. 如果jira版本不同,配置文件、jar包需要自己从对应版本的容器中拷贝到本地(怎么拷贝见倒数第三个菜单栏目)

资料

阿里云盘:jira-sso-资料
文件为exe可执行文件,下载到本地以后双击运行解压获取资料
其中包含:java代码、linux中的镜像资料等

准备

说明:当前目录会说明如何构建好java环境以及docker-compose执行环境

下载提供的资料:含java编译程序、docker-compose编排文件以及镜像文件

java环境准备

  1. 打开工程,配置好maven、jdk
  2. 打开SSOSeraphAuthenticator类,会提示找不到包。所需的包都放在了工程extlib目录下(对于不同版本的依赖及配置文件怎么拿看这里)
    在这里插入图片描述
  3. 引入依赖
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    这样编译环境就搭建好了
    在这里插入图片描述

docker-compose环境准备

将提供的资料jira-sso-linux.tar解压得到以下文件
在这里插入图片描述

lib 映射的目录
image 含jira镜像包
docker-compose.yaml 编排文件

然后将image目录下的jira.tar导入到docker镜像中:docker save -i jiar.tar

解析

说明:
当前目录详细阐述java类中的方法、docker-compose中的目录说明
只提供主要的描述,具体代码自行查看源文件

java

java部分主要介绍资料中提供的SSOSeraphAuthenticator类,其中的方法都有注释

SSOSeraphAuthenticator

下图是对各类方法的作用说明
在这里插入图片描述
在SSOSeraphAuthenticator中主要看login方法,其中login最终会调用dologin方法,本文主要针对单点登录对dologin进行了调整。如果想看原本的实现,可以到下个类目提到的AbstractAuthenticator类、DefaultAuthenticator类

其中的方法各位道友自行查阅,注释都比较详细。

AbstractAuthenticator类(原本的默认类)

此处说明:为什么要定义SSOSeraphAuthenticator、我的login方法从何而来,其中的逻辑为什么要那样写

在jira的配置文件中,有一处配置了JiraSeraphAuthenticator类,配置文件的说明栏目会介绍到。也正是因为配置文件默认配置了JiraSeraphAuthenticator类以及login.jsp,所以当我们正常登录时,地址栏中的login.jsp可以请求到JiraSeraphAuthenticator类中的login方法

JiraSeraphAuthenticator类又继承了DefaultAuthenticator类
在这里插入图片描述

DefaultAuthenticator类(原本的默认类)

该类为JiraSeraphAuthenticator提供了login、logout等方法的实现
在这里插入图片描述

由此,我们可以按照JiraSeraphAuthenticator类,自定义自己的类实现DefaultAuthenticator类,那么就能实现原本的登录。最后在配置文件中使用我们自己的类就行了。
login.html也是同理,替换原本login.jsp的配置。html它仅仅作为中转站,其目的一个是通过它的请求能到我们自定义类的login方法,其次是可以携带参数,比如token等等,到了程序里我们再解析token获取用户信息等等,具体携带的参数可以根据业务需求调整。


到这里我们的login方法就准备好了

login.html

定义表单
在这里插入图片描述
通过js提交表单
在这里插入图片描述


到这里我们就能请求能到login方法了

logout.html

该html供单点退出使用,在login.html的基础上新增了isLogout参数。单纯访问退出地址后会到登录页。正常通过业务系统退出jira的话,get请求获取的响应可以不管,毕竟session状态以及cookei已经清掉了
在这里插入图片描述
传递到后端调用logout方法。logout没有提供外部调用的接口
在这里插入图片描述
退出访问地址:http://ip:port/logout.html

jira-sso-linux.tar文件说明

介绍资料中提供的jira-sso-linux.tar解压后的目录结构以及各个目录的内容
在这里插入图片描述

  1. jar:需要引入的jar包
  2. lib目录下包含classes文件夹、login.html页面、logout.html页面
  3. classes目录下包含jira的配置文件seraph-config.xml、sso文件夹
  4. sso文件夹下就是放我们java程序编译后的targe目录下sso目录下的SSOSeraphAuthenticator类的class文件
    4.1 例如下图
    在这里插入图片描述
    打开文件目录后可以得到
    在这里插入图片描述
    这两个文件就是需要拷贝到sso目录下的文件

docker-compose编排文件说明

主要介绍下图中的映射目录说明
在这里插入图片描述
针对以上映射内容,主要说明容器内的目录

  1. /var/atlassian/application-data/jira:jira的数据目录
  2. /opt/atlassian/jira/atlassian-jira/WEB-INF/classes/com/atlassian/jira/security
    该目录是我们存放编译后文件的目录。映射关系由上图得知,存在client、sso目录
    sso:我们编写SSOSeraphAuthenticator类的包目录
    client:在我提供的java资料中,该目录下没有任何文件,此处配置是为了说明我们后续可以建自己的包,以及类文件,且都建在security目录下。比如在需要的场景下有个service包,那么需要在java的security包下建一个service包,接着在docker-compose中添加一条像client映射关系的配置:./lib/classes/service:/opt/atlassian/jira/atlassian-jira/WEB-INF/classes/com/atlassian/jira/security/service。那么在执行编排文件后,就可以在我们的类中访问service中的方法
    在这里插入图片描述
  3. /opt/atlassian/jira/lib/:该lib目录是存放所需jar的目录,比如这里的hutool.jar
  4. /opt/atlassian/jira/atlassian-jira/:该目录下存放静态文件,比如这里的login.html、logout.html
  5. ./lib/classes/seraph-config.xml:/opt/atlassian/jira/atlassian-jira/WEB-INF/classes/seraph-config.xml:ro
    该关系为配置文件的映射,无需修改

配置文件

说明:目前只介绍单点登录、登出涉及到修改的部分,其他内容未做研究
位置:容器内所在的目录/opt/atlassian/jira/atlassian-jira/WEB-INF/classes/seraph-config.xml

配置本地的登录认证类
在这里插入图片描述

部署:

  1. 编译java程序得到class文件
    在这里插入图片描述
  2. 将class文件拷贝到docker-compose目录下的/lib/classes/sso/目录下,如果有其他包下的类,则拷贝到对应目录下,当然全部放在这个目录也行
    在这里插入图片描述
  3. 通过docker-compose构建容器:docker-compose up -d(class文件变更后重启即可:docker-compose restart
  4. 如果是不带参数访问login进行测试,则访问:html://ip:port/login.html,登录进去是代码中默认提供的用户张三,则表示登录成功

不同版本

不同版本如何查找相关运行环境:(都从容器内拷贝出来,且版本号是对应版本所属的版本号)

  1. 配置文件:
    到目录/opt/atlassian/jira/atlassian-jira/WEB-INF/classes下拷贝:seraph-config.xml
  2. jar包:
    到目录/opt/atlassian/jira/atlassian-jira/WEB-INF/lib下拷贝以下jar包到本地的exlib目录下:(查找命令:find . -name "*名称*"
    2.1. spring-core-5.3.19.jar
    2.2. jira-api-9.4.2.jar
    2.3. atlassian-seraph-4.1.3.jar
    2.4. embedded-crowd-api-5.0.0-m02.jar
    2.5. javax.servlet-api-4.0.1.jar

bug

管理员删除用户的组且该用户没有任何组的情况下,首次登录进入系统,需要手动刷新一次页面才能正常使用

不足

1. 退出只能通过login方法作为入口,调用logout方法
2. 通过走sso的登录状态没有更新,目前也没去研究
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【小中大 / 1】

题目 、 代码 #include <bits/stdc.h> using namespace std; const double eps 1e-8; const int N 1e510; int a[N]; int main() {int n;cin >> n;for(int i 1; i < n; i){cin >> a[i];}sort(a1, an1);int maxx a[n], minn a[1];double midd;if((1…

Mac OS14外接显示器字体过小和放大字体模糊问题的简单解决

文章目录 问题简述解决方法 问题简述 使用Mac mini外接2K 显示器时&#xff0c;默认分辨率是25601440&#xff0c;字体较小&#xff0c;如果切换成19201080&#xff0c;字体又变大模糊。 解决方法 使用HiDP I&#xff08;一种显示技术&#xff0c;使用多个物理像素显示1个像…

一款好用的电子样本册转换器

在数字化时代&#xff0c;电子样本册已成为各行各业必备的工具。一款好用的电子样本册转换器&#xff0c;可以让你在繁杂的资料管理中轻松解脱。今天&#xff0c;就为大家推荐一款实用的电子样本册转换神器&#xff0c;让你的工作效率翻倍&#xff01; 工具推荐&#xff1a;FLB…

做好职业规划,绘制璀璨蓝图!

我们来聊一聊如何做好职业规划&#xff0c;建立自己奋斗的目标和计划。 1、使用 SWOT 模型分析自己的现状 SWOT 分析通过对自己的优势、劣势、机会和威胁加以综合评估&#xff0c;做一个合理的自我分析&#xff0c;帮助我们更清楚地分析自己的现状&#xff0c;发现自身的优势和…

GenAI 客户支持 — 第 3 部分:为人类设计聊天机器人的聊天界面

作者&#xff1a;Ian Moersen 本博客系列揭示了我们的现场工程团队如何使用 Elastic stack 和生成式 AI 开发出一款可爱而高效的客户支持聊天机器人。如果你错过了本系列的其他文章&#xff0c;请务必查看第一部分、第二部分和第四部分。 通过 Web 应用聊天的想法已经存在了很长…

[AHK]ListBox的增删改移等操作示范

ahk v1 中对ListBox的操作&#xff1a;增、删、改、上移、下移等操作。 #singleinstance forcetitle ListBox 例子gui,add,listbox,xm ym w100 r20 vLB choose1 gLBevent,电话|聊天|拍拖|表白|订婚|礼金|礼盒 gui,add,edit ,xm yp250 w200 vEDT -background gui,add,butto…

c++数据结构算法题讲解

那么从本期文章开始&#xff0c;会尽量带大家一起刷题 第一题 题目 关键词 思路 源代码 class MinStack { public: void push(int val) { _st.push(val); if(_minst.empty() || val < _minst.top()) { _minst.push(val); } } void pop() { if(_st.top() _minst.top()) {…

ld_addr + UAF漏洞修复

文章目录 ciscn 2023中一条新的IO链例题&#xff1a;思路&#xff1a;分析&#xff1a;利用&#xff1a; 如何修复UAF漏洞 ciscn 2023中一条新的IO链 如果vtable check不通过&#xff0c;会走_dl_addr&#xff0c;在 _dl_addr中会调用到 在exit_hook中利用的那个函数指针&#…

LCD彩条显示——FPGA学习笔记10

部分素材来自原子哥 一、LCD简介 基本原理&#xff1a;在两块平行玻璃板中填充液晶材料&#xff0c;通过电场控制液晶分子旋转从而达到透光和遮光的目的。 LCD屏幕重要参数&#xff1a;分辨率、像素格式、驱动时序 分辨率&#xff1a; 像素格式&#xff1a; RGB&#xff1a;…

C++第四节课 - 内联函数 + 初认类

一、auto关键字 C中可以使用typeid打印变量的类型 #include<iostream> using namespace std;int main() {int a 0;int b a;auto c a;auto d 1 1.11;cout << typeid(c).name() << endl;cout << typeid(d).name() << endl;return 0; } 但是上…

ActiveMQ 的网络连接及消息回流机制

1、ActiveMQ 的网络连接 activeMQ 如果要实现扩展性和高可用性的要求的话&#xff0c;就需要用用到网络连接模式。 NetworkConnector&#xff1a;主要用来配置 broker 与 broker 之间的通信连接 如上图所示&#xff0c;MQ 服务器1 和MQ 服务器2 通过 NewworkConnector 相连&…

PhotoZoom 9安装包下载-图片无损放大编辑PhotoZoom 9 Pro软件安装

PhotoZoom 9 Pro是一款专业的图像放大软件&#xff0c;旨在提供高质量的图像放大和改进功能。适用于摄影师、设计师、印刷专业人员以及任何需要将图像放大到更大尺寸并保持高质量的用户。它使用先进的放大算法&#xff0c;能够有效地处理不同类型的图像&#xff0c;并在保持细节…

使用切换 JDK 的方式优化部署微服务占用内存过高的问题

使用切换 JDK 的方式优化部署微服务占用内存过高的问题 一、前言二、下载 J9 虚拟机的JDK三、切换 JDK1、上传到服务器2、解压3、修改 JDK 路径4、解决 JDK 没有切换成功的问题 一、前言 前段时间在服务器部署了微服务项目&#xff0c;但即使限制了每个服务的堆&#xff0c;内…

苹果首款AI手机发布!iPhone 16全新AI功能体验感拉满

苹果于2024年秋季盛大发布iPhone 16系列&#xff0c;带来前所未有的AI智能体验。iPhone 16系列不仅硬件全面升级&#xff0c;更融入了尖端的AI技术&#xff0c;为用户带来更加智能化的生活体验。 在科技春晚的舞台上&#xff0c;苹果不负众望地揭开了iPhone 16系列的神秘面纱。…

【贪心算法】(一)贪心算法理论及基础习题

【贪心算法】贪心算法理论及基础习题&#xff08;一&#xff09; 理论基础简单例题分发饼干K次取反后最大化的数组和柠檬水找零买卖股票的最佳时机 Ⅱ单调递增的数字摆动序列 两个纬度权衡问题分发糖果根据身高重建队列 理论基础 什么是贪心&#xff1a; 贪心的本质是选择每一…

[N-152]基于java贪吃蛇游戏5

开发工具eclipse,jdk1.8 文档截图&#xff1a; N-152基于java贪吃蛇游戏5

通过Python调用Excel VBA宏:扩展自动化能力的深度探索

目录 1. 引言 1.1 自动化办公的重要性 1.2 Python与Excel VBA的结合优势 2. Python调用Excel VBA宏的基本原理 2.1 Excel VBA宏的基本概念 2.2 Python调用VBA宏的方法 3. 安装与准备 3.1 安装pywin32库 3.2 配置Excel以允许宏运行 4. Python调用VBA宏的实例 4.1 导出…

基于单片机的室内装修环境检测系统设计

基于单片机的室内装修环境检测系统&#xff0c;该系统可实现苯、甲醛、氨气等有害气体的浓度检测和超标报警。该系统以STC89C52RC单片机为核心&#xff0c;由传感器检测室内装修环境中苯、甲醛、氨气的浓度以及温湿度&#xff0c;将以上测量出来的数据传送到PCF8591转换器&…

Java+vue的医药进出口交易系统(源码+数据库+文档)

外贸系统|医药进出口交易系统 目录 基于Javavue的服装定制系统 一、前言 二、系统设计 三、系统功能设计 仓储部门功能模块 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 博主介绍&#xff1a;✌️大厂码农|毕设…

15.2 JDBC数据库编程2

15.2.1 数据库访问步骤 使用JDBC API连接和访问数据库&#xff0c;一般分为以下5个步骤: (1) 加载驱动程序 (2) 建立连接对象 (3) 创建语句对象 (4) 获得SQL语句的执行结果 (5) 关闭建立的对象&#xff0c;释放资源 下面将详细描述这些步骤 15.2.2 加载驱动程序 要使…