当前位置: 首页 > news >正文

单点登录【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。

相关文章:

  • 【设计模式】JAVA Design Patterns——Combinator(功能模式)
  • 浅析智能体开发(第二部分):智能体设计模式和软件架构
  • Redis篇 浅谈分布式系统
  • js setTimeout、setInterval、promise、async await执行顺序梳理
  • 30.包名的修改和新建后端模块
  • 【UE5.1 角色练习】06-角色发射火球-part2
  • 温故而知新-Java基础篇【面试复习】
  • C#-根据日志等级进行日志的过滤输出
  • FreeRTOS面试题汇总
  • vmware - 主机向虚拟机拷贝文件的临时方法
  • JAVA开发面试超详细
  • 若依nodejs版本过高问题解决方案
  • 【vue】封装的天气展示卡片,在线获取天气信息
  • spring boot 之 集成 druid数据库连接池
  • ACM实训
  • ----------
  • Apache的80端口被占用以及访问时报错403
  • co.js - 让异步代码同步化
  • Codepen 每日精选(2018-3-25)
  • ES10 特性的完整指南
  • exif信息对照
  • Git初体验
  • interface和setter,getter
  • java概述
  • jquery cookie
  • JS专题之继承
  • OpenStack安装流程(juno版)- 添加网络服务(neutron)- controller节点
  • SQLServer之创建数据库快照
  • 爱情 北京女病人
  • 日剧·日综资源集合(建议收藏)
  • 融云开发漫谈:你是否了解Go语言并发编程的第一要义?
  • 数组大概知多少
  • 在Docker Swarm上部署Apache Storm:第1部分
  • 主流的CSS水平和垂直居中技术大全
  • 新海诚画集[秒速5センチメートル:樱花抄·春]
  • ​【经验分享】微机原理、指令判断、判断指令是否正确判断指令是否正确​
  • ![CDATA[ ]] 是什么东东
  • # Swust 12th acm 邀请赛# [ K ] 三角形判定 [题解]
  • #define用法
  • ()、[]、{}、(())、[[]]命令替换
  • (html转换)StringEscapeUtils类的转义与反转义方法
  • (二)c52学习之旅-简单了解单片机
  • (分享)一个图片添加水印的小demo的页面,可自定义样式
  • (离散数学)逻辑连接词
  • (深入.Net平台的软件系统分层开发).第一章.上机练习.20170424
  • (原创)可支持最大高度的NestedScrollView
  • (原創) X61用戶,小心你的上蓋!! (NB) (ThinkPad) (X61)
  • .babyk勒索病毒解析:恶意更新如何威胁您的数据安全
  • .java 指数平滑_转载:二次指数平滑法求预测值的Java代码
  • .Net Core webapi RestFul 统一接口数据返回格式
  • .net dataexcel winform控件 更新 日志
  • .net mvc部分视图
  • .Net 转战 Android 4.4 日常笔记(4)--按钮事件和国际化
  • .net用HTML开发怎么调试,如何使用ASP.NET MVC在调试中查看控制器生成的html?
  • /bin、/sbin、/usr/bin、/usr/sbin