不常用的第三方服务集成

1.ldap

1.1.ldap服务搭建

docker方式搭建:包含了ldap服务和ldap admin图形化界面服务

参考ldap服务:http://127.0.0.1:81
用户名:CN=admin,DC=ldap,DC=com 密码:123456

docker-compose.yml文件内容如下

version: '3'services:ldap:image: osixia/openldap:latestcontainer_name: ldapenvironment:- TZ=Asia/Shanghai- LDAP_ORGANISATION=ldap- LDAP_DOMAIN=ldap.com- LDAP_ADMIN_PASSWORD=Admin100%ports:- 389:389- 636:636networks:- ldap-netldapui:image: osixia/phpldapadmin:latestcontainer_name: ldapuiprivileged: trueenvironment:- TZ=Asia/Shanghai- PHPLDAPADMIN_HTTPS=false- PHPLDAPADMIN_LDAP_HOSTS=ldapports:- 1443:443- 81:80depends_on:- ldapnetworks:- ldap-netnetworks:ldap-net:driver: bridge

1.2.与springboot集成

pom.xml引入

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-ldap</artifactId>
</dependency>

java文件


import lombok.extern.slf4j.Slf4j;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.ldap.core.AttributesMapper;
import org.springframework.ldap.core.LdapTemplate;
import org.springframework.ldap.core.support.LdapContextSource;
import org.springframework.ldap.filter.EqualsFilter;
import org.springframework.ldap.query.LdapQuery;
import org.springframework.ldap.query.LdapQueryBuilder;
import javax.naming.NamingEnumeration;
import javax.naming.directory.Attribute;
import java.util.*;
import java.util.stream.Collectors;@Slf4j
public class LdapConfig {private static LdapConfig instance;private LdapConfig() {}public static LdapConfig getInstance() {if (instance == null) {synchronized (LdapConfig.class) {if (instance == null) {instance = new LdapConfig();}}}return instance;}private LdapTemplate ldapTemplate;/*** String ldapUrl = "ldap://127.0.0.1:389";* String ldapBase = "dc=ldap,dc=com";* String ldapUsername = "cn=admin,dc=ldap,dc=com";* String ldapPassword = "123456";**/private void init() {try {SettingDao settingDao = (SettingDao) SpringContextUtil.getBean("settingDao");Map<String, Object> dataMap = getSettingByKeys(settingDao,"ldapUrl","ldapBase","ldapUsername","ldapPassword");String ldapUrl = (String)dataMap.get("ldapUrl");String ldapBase = (String)dataMap.get("ldapBase");String ldapUsername = (String)dataMap.get("ldapUsername");String ldapPassword = (String)dataMap.get("ldapPassword");LdapContextSource contextSource = new LdapContextSource();contextSource.setUrl(ldapUrl);contextSource.setBase(ldapBase);contextSource.setUserDn(ldapUsername);contextSource.setPassword(ldapPassword);contextSource.setPooled(true);contextSource.afterPropertiesSet();Map<String, Object> config = new HashMap<>(1);config.put("java.naming.ldap.attributes.binary", "objectGUID");contextSource.setBaseEnvironmentProperties(config);this.ldapTemplate = new LdapTemplate(contextSource);ldapTemplate.setIgnorePartialResultException(true);} catch (Exception e) {log.error("LDAP 服务连接异常", e);throw new I18nServerEndException("common.tips_32");}}public boolean verifyUser(String userName, String password) {EqualsFilter ef = new EqualsFilter("uid", userName);try {return getLdapTemplate().authenticate("", ef.toString(), password);} catch (Exception e) {log.error("LDAP 服务连接异常", e);throw new I18nServerEndException("common.tips_32");}}public List<Map<String, Object>> fetchUserList(String userName) {LdapQuery query = LdapQueryBuilder.query().where("uid").is(userName);try {return getLdapTemplate().search(query, (AttributesMapper<Map<String, Object>>) (attributes) -> {Map<String, Object> map = new HashMap<>();NamingEnumeration<? extends Attribute> all = attributes.getAll();while(all.hasMore()){Attribute attribute = all.next();String id = attribute.getID();map.put(id, attribute.get());}return map;});} catch (Exception e) {log.error("LDAP 服务连接异常", e);throw new I18nServerEndException("common.tips_32");}}private Map<String, Object> getSettingByKeys(SettingDao settingDao, String... keys){Integer num = keys.length;List<Criteria> criteriaList = new ArrayList<>(num);for (String key : keys) {criteriaList.add(Criteria.where("key").is(key));}List<Setting> settingList = settingDao.fetchList(new Query(new Criteria().orOperator(criteriaList)));if(settingList == null || settingList.size() != num){throw new I18nServerEndException("common.tips_32");}return settingList.stream().collect(Collectors.toMap(Setting :: getKey, Setting :: getValue, (a, b) -> b));}private LdapTemplate getLdapTemplate() throws I18nServerEndException {if(ldapTemplate == null){init();}return ldapTemplate;}public void clear(){this.ldapTemplate = null;}
}

2.sftp

2.1.sftp服务搭建

docker-compose方式搭建

version: '3'services:sftp:image: atmoz/sftpvolumes:- ./test/:/home/foo/ports:- "2222:22"privileged: truecommand: foo:123456:1002

镜像作者的设定应该是把映射目录作为根目录(监狱),根目录(./test)是不能有写权限的,需要在下面再建一个子目录.

./test文件夹授权755,在test目录下再新建一个文件夹,比如upload, 把需要上传的文件放置在upload中,并且修改upload权限为777,例如:

mkdir upload

chmod 777 upload

2.2.与springboot集成

pom.xml引入

<dependency>
    <groupId>com.jcraft</groupId>
    <artifactId>jsch</artifactId>
    <version>0.1.55</version>
</dependency>
<dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>2.8.0</version>
</dependency>

java文件

import com.jcraft.jsch.*;
import lombok.extern.slf4j.Slf4j;
i

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

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

相关文章

0基础学会在亚马逊云科技AWS上利用SageMaker、PEFT和LoRA高效微调AI大语言模型(含具体教程和代码)

项目简介&#xff1a; 小李哥今天将继续介绍亚马逊云科技AWS云计算平台上的前沿前沿AI技术解决方案&#xff0c;帮助大家快速了解国际上最热门的云计算平台亚马逊云科技AWS上的AI软甲开发最佳实践&#xff0c;并应用到自己的日常工作里。本次介绍的是如何在Amazon SageMaker上…

【qt】TCP客户端如何断开连接?

disconnectFromHost() 来关闭套接字,断开连接. 当我们关闭窗口时,也需要断开连接. 需要重写关闭事件 如果当前的套接字状态是连接上的,我们就可以来断开连接. 运行结果:

SSM框架学习笔记(仅供参考)

&#xff08;当前笔记简陋&#xff0c;仅供参考&#xff09; 第一节课&#xff1a; &#xff08;1&#xff09;讲述了Spring框架&#xff0c;常用jar包&#xff0c;以及框架中各个文件的作用 &#xff08;2&#xff09;演示了一个入门程序 &#xff08;3&#xff09;解释了…

前端项目本地的node_modules直接上传到服务器上无法直接使用(node-sasa模块报错)

跑 jekins任务的服务器不能连接外网下载依赖包&#xff0c;就将本地下载的 node_modules直接上传到服务器上&#xff0c;但是运行时node-sass模块报错了ERROR in Missing binding /root/component/node_modules/node-sass/vendor/linux-x64-48/binding.node >> 报错信息类…

不会编程怎么办?量化交易不会编程可以使用吗?

量化交易使用计算机模型程序代替人工进行交易&#xff0c;一般需要投资者自己编写程序建模&#xff0c;然后回测无误之后再进行实盘交易&#xff0c;那么不会编程的投资者能使用量化软件进行量化交易吗&#xff1f; 不会编程使用量化软件有两种方法 一种是请人代写代码&#x…

浅谈后置处理器之JSON提取器

浅谈后置处理器之JSON提取器 JMeter 的 JSON 提取器&#xff08;JSON Extractor&#xff09;是一个强大的后置处理器&#xff0c;它允许用户从HTTP响应、数据库查询或其他类型的响应中提取JSON数据&#xff0c;并将这些数据存储为变量&#xff0c;以便在后续的请求中重用。这对…

LabVIEW人工模拟肺控制系统开发

开发了一种创新的主被动一体式人工模拟肺模型&#xff0c;通过LabVIEW开发的上位机软件&#xff0c;实现了步进电机驱动系统的精确控制和多种呼吸模式的模拟。该系统不仅能够在主动呼吸模式下精确模拟快速呼吸、平静呼吸和深度呼吸&#xff0c;还能在被动模式下通过PID控制实现…

LeetCode加油站(贪心算法/暴力,分析其时间和空间复杂度)

题目描述 一.原本暴力算法 最初的想法是&#xff1a;先比较gas数组和cost数组的大小&#xff0c;找到可以作为起始点的站点(因为如果你起始点的油还不能到达下一个站点&#xff0c;就不能作为起始点)。当找到过后&#xff0c;再去依次顺序跑一圈&#xff0c;如果剩余的油为负数…

【代码随想录】【算法训练营】【第64天】 [卡码117]软件构建 [卡码47]参加科学大会

前言 思路及算法思维&#xff0c;指路 代码随想录。 题目来自 卡码网。 day 64&#xff0c;周三&#xff0c;继续ding~ 题目详情 [卡码117] 软件构建 题目描述 卡码117 软件构建 解题思路 前提&#xff1a; 思路&#xff1a; 重点&#xff1a; 代码实现 C语言 [卡码…

GO channel 学习

引言 单纯地将函数并发执行是没有意义的。函数与函数间需要交换数据才能体现并发执行函数的意义。 虽然可以使用共享内存进行数据交换&#xff0c;但是共享内存在不同的goroutine中容易发生竞态问题。为了保证数据交换的正确性&#xff0c;必须使用互斥量对内存进行加锁&#…

喰星云·数字化餐饮服务系统 多处 SQL注入漏洞复现

0x01 产品简介 喰星云数字化餐饮服务系统是一款专为餐饮企业设计的综合性管理软件,旨在通过信息化手段提升餐饮企业的运营效率、降低运营成本,并实现数据驱动的决策管理。该系统包括供应链管理、财务管理、巡店管理、人力资源管理等多个模块,可全面覆盖餐饮企业的日常运营需…

[RoarCTF2019]polyre

参考博客 buu-[RoarCTF2019]polyre&#xff08;控制流平坦化&#xff0c;虚假控制流程&#xff09;-CSDN博客 [RoarCTF2019]Polyre | bypass ollvm - 暖暖草果 - 博客园 (cnblogs.com) buu-[RoarCTF2019]polyre&#xff08;控制流平坦化&#xff0c;虚假控制流程&#xff09…

Java 设计模式系列:外观模式

简介 外观模式&#xff08;Facade Pattern&#xff09;是一种设计模式&#xff0c;又名门面模式&#xff0c;是一种通过为多个复杂的子系统提供一个一致的接口&#xff0c;而使这些子系统更加容易被访问的模式。该模式对外有一个统一接口&#xff0c;外部应用程序不用关心内部…

VUE_TypeError: Cannot convert a BigInt value to a number at Math.pow 解决方法

错误信息 TypeError: Cannot convert a BigInt value to a number at Math.pow vue 或 react package.json添加 "browserslist": {"production": ["chrome > 67","edge > 79","firefox > 68","opera >…

树的结构(b,b+树)

无论线性表&#xff0c;栈还是队列&#xff0c;都是一对一&#xff0c;查询的时候&#xff0c;效率较低&#xff0c;数据量比较的大的情况 1.树的定义 一种数据结构&#xff0c;有层次关系的集合&#xff0c;根朝上&#xff0c;叶朝下 除了根节点外&#xff0c;每个子节点都…

【自动驾驶汽车通讯协议】UART通信详解:理解串行数据传输的基石

文章目录 0. 前言1. 同步通讯与异步通讯1.1 同步通信1.2 异步通信 2. UART的数据格式3. 工作原理3.1 波特率和比特率3.2 UART的关键特性 4. UART在自动驾驶汽车中的典型应用4.1 UART特性4.2应用示例 5. 结语 0. 前言 按照国际惯例&#xff0c;首先声明&#xff1a;本文只是我自…

【周末闲谈】Stable Diffusion会魔法的绘画师

个人主页&#xff1a;【&#x1f60a;个人主页】 系列专栏&#xff1a;【❤️Python】 文章目录 前言Stable Diffusion介绍 使用ComfyUI 和 WebUIComfyUIWebUI 配置需求 Stable Diffusion资源分享吐司AiAUTOMATIC1111Civitai绘世整合包Nenly同学stability.ai 前言 在很早之前&…

香橙派AIpro部署YOLOv5:探索强悍开发板的高效目标检测能力

香橙派AIpro部署YOLOv5&#xff1a;探索强悍开发板的高效目标检测能力 一、香橙派AIpro开箱使用体验 1.1香橙派AIpro开箱 拿到板子后第一件事情就是开箱&#xff1a; 开箱后可以看见一个橘子的标识&#xff0c;也就是香橙派了&#xff0c;并且还有四个大字&#xff1a;为AI…

取消文字默认选中效果

点击的时候会选中文字 .user-select-none {user-select: none;}<div class"model user-select-none" onclick"createRipple(event)">Click me for ripple effect outside </div>点击再快也不会选中了

【C++】——类和对象(上)

文章目录 什么是类和对象类的定义类的访问限定符及其封装类的作用域类的实例化类的对象的大小计算this指针 什么是类和对象 类是一个用户定义的类型&#xff0c;它封装了数据&#xff08;称为属性或成员变量&#xff09;和操作这些数据的方法&#xff08;称为成员函数或方法&a…