单点登录【demo】

前言

2023-07-29 15:44:56

公开发布于
2024-5-22 00:04:56

单点登录【demo】

以下是 Java 实现单点登录的示例代码:

单点登录(Single Sign-On,SSO)是一种身份认证和授权机制,可以使用户在多个应用程序或系统之间使用相同的身份进行登录。以下是一个简单的单点登录实现的示例代码:

认证服务器:

import java.util.HashMap;
import java.util.Map;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;@SpringBootApplication
@RestController
public class AuthServer {private Map<String, String> users = new HashMap<>();    // 保存用户信息public static void main(String[] args) {SpringApplication.run(AuthServer.class, args);}@PostMapping("/authenticate")public ResponseEntity<String> authenticate(@RequestBody User user) {if (users.containsKey(user.getUsername()) && users.get(user.getUsername()).equals(user.getPassword())) {String token = generateToken(); // 生成令牌TokenStore.addToken(token, user.getUsername()); // 将令牌保存到TokenStorereturn ResponseEntity.ok(token);} else {return ResponseEntity.status(HttpStatus.UNAUTHORIZED).build();}}private String generateToken() {// 生成令牌的代码return "token123";}static class User {private String username;private String password;public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}}
}

Token 存储:

import java.util.HashMap;
import java.util.Map;public class TokenStore {private static Map<String, String> tokens = new HashMap<>(); // 保存Token和对应的用户名public static void addToken(String token, String username) { // 将Token和对应的用户名保存到Map中tokens.put(token, username);}public static boolean isValidToken(String token) { // 判断Token是否有效return tokens.containsKey(token);}public static String getUsername(String token) { // 根据Token获取对应的用户名return tokens.get(token);}public static void removeToken(String token) { // 删除Tokentokens.remove(token);}
}

客户端:

import java.util.Scanner;import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.client.RestTemplate;public class Client {private static String authServerUrl = "http://localhost:8080/authenticate"; // 认证服务器URLpublic static void main(String[] args) {Scanner scanner = new Scanner(System.in);System.out.print("Username: ");String username = scanner.nextLine();System.out.print("Password: ");String password = scanner.nextLine();scanner.close();// 发送认证请求RestTemplate restTemplate = new RestTemplate();HttpHeaders headers = new HttpHeaders();headers.set("Content-Type", "application/json");HttpEntity<?> requestEntity = new HttpEntity<>(new AuthServer.User(username, password), headers);ResponseEntity<String> responseEntity = restTemplate.exchange(authServerUrl, HttpMethod.POST, requestEntity, String.class);if (responseEntity.getStatusCode() == HttpStatus.OK) { // 如果认证成功String token = responseEntity.getBody(); // 获取令牌System.out.println("Token: " + token);// 访问受保护资源String resourceUrl = "http://localhost:8081/resource";headers.set("Authorization", "Bearer " + token);requestEntity = new HttpEntity<>(null, headers);responseEntity = restTemplate.exchange(resourceUrl, HttpMethod.GET, requestEntity, String.class);System.out.println(responseEntity.getBody()); // 输出受保护资源的内容// 注销String logoutUrl = "http://localhost:8080/logout";headers.set("Content-Type", "application/x-www-form-urlencoded");requestEntity = new HttpEntity<>("token=" + token, headers);responseEntity = restTemplate.exchange(logoutUrl, HttpMethod.POST, requestEntity, String.class);System.out.println(responseEntity.getBody()); // 输出注销消息} else { // 如果认证失败System.out.println("Invalid username or password");}}
}

在这个例子中,客户端会向认证服务器发送一个 POST 请求以验证用户身份。如果验证通过,则认证服务器将返回一个 Token,客户端存储并在后续的请求中使用该 Token。在此示例中,客户端还会尝试访问受保护的资源,该资源要求使用令牌进行身份验证。

另外,Token Store 是一个用于存储 Token 和对应用户名的简单 Map 实现,用于在服务器和客户端之间共享 Token。

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

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

相关文章

SQL常用基础语句(一)-- FGHIJ开头

GROUP BY GROUP BY语法可以根据给定数据列的每个成员对查询结果进行分组统计&#xff0c;最终得到一个分组汇总表。在GROUP BY子句后面包含了一个HAVING子句&#xff0c;HAVING类似于WHERE&#xff0c;&#xff08;唯一的差别是WHERE过滤行&#xff0c;HAVING过滤组&#xff0…

【C/C++笔试练习】TCP、IP广播、ARP协议、IP路由器、MAC协议、三次握手、TCP/IP、子网划分年、会抽奖、抄送列表

文章目录 C/C笔试练习选择部分&#xff08;1&#xff09;TCP&#xff08;2&#xff09;IP广播&#xff08;3&#xff09;ARP协议&#xff08;4&#xff09;IP路由器&#xff08;5&#xff09;MAC协议&#xff08;6&#xff09;三次握手&#xff08;7&#xff09;TCP/IP&#xf…

PHP在线制作表白网源码

PHP在线制作表白网源码&#xff0c;送女友个惊喜吧&#xff0c;无数据库&#xff0c;上传就能用&#xff0c;后台/admin&#xff0c;账号密码都是admin 百度网盘&#xff1a;https://pan.baidu.com/s/1rbD2_8IsP9UPLK-cdgEXfA?pwdre59

AWS安全性身份和合规性之Secrets Manager

AWS Secrets Manager是一项AWS托管的服务&#xff0c;用于安全地存储、管理和轮转敏感信息&#xff0c;如数据库密码、API密钥、OAuth令牌等。AWS Secrets Manager助您在整个生命周期内轻松管理、检索和轮换数据库凭证、API密钥和其他密钥。 关键词&#xff1a;集中管理、加密…

sql使用加和进行合并去重并提升速率

背景 有三张表ltd1 、ltd0051和、ltd0011ltd1作为主表&#xff0c;左关联 ltd0051和ltd0011如果ltd0051有两条重复数据、td0011有两条重复数据&#xff0c;左关联之后就会得到4条&#xff0c;同时ltd0051和ltd0011这两条数据都是正确&#xff0c;基于主键我们需要将两个相同主键…

【全开源】AJAX家政上门服务系统小程序自营+多商家(高级授权)+独立端

基于FastAdmin和原生微信小程序开发的一款同城预约、上门服务、到店核销家政系统&#xff0c;用户端、服务端(高级授权)、门店端(高级授权)各端相互依赖又相互独立&#xff0c;支持选择项目、选择服务人员、选择门店多种下单方式&#xff0c;支持上门服务和到店核销两种服务方式…

深入理解数仓开发(一)数据技术篇之日志采集

前言 今天开始重新回顾电商数仓项目&#xff0c;结合《阿里巴巴大数据之路》和尚硅谷的《剑指大数据——企业级电商数据仓库项目实战 精华版》来进行第二次深入理解学习。之前第一次学习数仓&#xff0c;虽然尽量放慢速度力求深入理解&#xff0c;但是不可能一遍掌握&#xff0…

我在去哪儿薅到了5块钱火车票代金券,速薅

哈哈&#xff0c;亲爱的薅羊毛小伙伴们&#xff01; 刚刚在去哪儿大佬那儿发现了一个超级薅羊毛福利&#xff01;我只花了短短两分钟&#xff0c;就搞到了一张5块钱火车票代金券&#xff0c;简直是天上掉馅饼的节奏啊&#xff01; 话不多说&#xff0c;薅羊毛的姿势给你们摆好…

代码随想录算法训练营第十六天(py)| 二叉树 | 104.二叉树的最大深度、111.二叉树的最小深度、222.完全二叉树的节点个数

104.二叉树的最大深度 给定一个二叉树 root &#xff0c;返回其最大深度。 二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。 思路1 迭代法 层序遍历 层序遍历的思路很简单&#xff0c;其结果本来就是按层数记录的&#xff0c;只需返回结果的长度皆可。…

【C语言回顾】联合和枚举

前言1. 联合体1.1 联合体的声明1.2 联合体的特点1.3 联合体的使用 2. 枚举2.1 枚举的声明2.2 枚举的特点2.3 枚举的使用 结语 #include<GUIQU.h> int main { 上期回顾: 【C语言回顾】结构体 个人主页&#xff1a;C_GUIQU 专栏&#xff1a;【C语言学习】 return 一键三连;…

解决法律条文的录入前判断发条冲突的需求;怎么选择NLPModel?怎么使用模型?

要在NLPModel类中实现法律条文的冲突检测功能&#xff0c;可以使用BERT模型来计算句子相似度。以下是详细的步骤&#xff0c;包括如何选择模型、训练模型以及使用模型。 选择NLP模型 根据你的需求&#xff0c;BERT&#xff08;Bidirectional Encoder Representations from Tra…

Linux多线程系列三: 生产者消费者模型,信号量使用,基于阻塞队列和环形队列的这两种生产者消费者代码的实现

Linux多线程系列三: 生产者消费者模型,信号量,基于阻塞队列和环形队列的这两种生产者消费者代码的实现 一.生产者消费者模型的理论1.现实生活中的生产者消费者模型2.多线程当中的生产者消费者模型3.理论 二.基于阻塞队列的生产者消费者模型的基础代码1.阻塞队列的介绍2.大致框架…

别说废话!说话说到点上,项目高效沟通的底层逻辑揭秘

假设你下周要在领导和同事面前汇报项目进度&#xff0c;你会怎么做&#xff1f;很多人可能会去网上搜一个项目介绍模板&#xff0c;然后按照模板来填充内容。最后&#xff0c;汇报幻灯片做了 80 页&#xff0c;自己觉得非常充实&#xff0c;但是却被领导痛批了一顿。 这样的境…

树的非递归遍历(层序)

层序是采用队列的方式来遍历的 就比如说上面这颗树 他层序的就是&#xff1a;1 24 356 void LevelOrder(BTNode* root) {Que q;QueueInit(&q);if (root){QueuePush(&q, root);}while (!QueueEmpty(&q)){BTNode* front QueueFront(&q);QueuePop(&q);print…

简析网络风险量化的价值与应用实践,如何构建网络风险预防架构

网络风险量化能够让公司董事会和高管层看清当前的网络安全风险格局&#xff1b;它还将使安全团队能够在业务需求的背景下做出网络安全决策&#xff0c;帮助组织确定哪些风险对业务构成最大的威胁&#xff0c;以及预期的经济损失将是什么。 随着网络攻击手段的日益多样化和复杂…

多模态大模型新进展——GPT-4o、Project Astra关键技术丨青源Workshop第27期

青源Workshop丨No.27 多模态大模型新进展—GPT-4o、Project Astra关键技术主题闭门研讨会 刚刚过去的两天&#xff0c;OpenAI、Google纷纷发布了多模态大模型的最新成果&#xff0c;GPT-4o、Project Astra先后亮相。 本周五&#xff08;北京时间5月17日&#xff09;18点&#x…

O2OA(翱途)开发平台数据统计如何配置?

O2OA提供的数据管理中心&#xff0c;可以让用户通过配置的形式完成对数据的汇总&#xff0c;统计和数据分组展现&#xff0c;查询和搜索数据形成列表数据展现。也支持用户配置独立的数据表来适应特殊的业务的数据存储需求。本文主要介绍如何在O2OA中开发和配置统计。 一、先决…

eNSP学习——OSPF多区域配置

目录 主要命令 前期准备 实验内容 分析 实验目的 实验步骤 实验拓扑 实验编址 实验步骤 1、基本配置 配置与测试结果(部分) 2、配置骨干区域路由器 配置与测试结果(示例) 3、配置非骨干区域路由器 查看OSPF邻居状态 查看路由表中的OSPF路由条目 查看OSPF链…

【30天精通Prometheus:一站式监控实战指南】第6天:mysqld_exporter从入门到实战:安装、配置详解与生产环境搭建指南,超详细

亲爱的读者们&#x1f44b;   欢迎加入【30天精通Prometheus】专栏&#xff01;&#x1f4da; 在这里&#xff0c;我们将探索Prometheus的强大功能&#xff0c;并将其应用于实际监控中。这个专栏都将为你提供宝贵的实战经验。&#x1f680;   Prometheus是云原生和DevOps的…

python设计模式--观察者模式

观察者模式是一种行为设计模式&#xff0c;它定义了一种一对多的依赖关系&#xff0c;让多个观察者对象同时监听某一个主题对象&#xff0c;当主题对象状态发生变化时&#xff0c;会通知所有观察者对象&#xff0c;使它们能够自动更新。 在 Python 中&#xff0c;观察者模式通…