单点登陆案例实现

news2024/9/27 23:29:01

一 单点登陆系统简介

单点登录(Single Sign On),简称为 SSO,是目前比较流行的企业业务整合的解决方案之一。SSO的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。

例如:QQ、rwrew  QQ腾讯公司 穿越火线、QQ飞车、QQ华夏、LOL、DNF

用户名就是QQ 密码

定义:同一家公司不同应用使用同一套登陆系统叫做单点登陆系统(单点就是同一套的意思)

单点登陆系统也是要搭建集群

传统部署方式:

 

 

二 集成代码实现

2.1 Controller类实现如下代码

package cn.yty.login.controller;

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.shiro.codec.Hex;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.converter.json.MappingJacksonValue;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

import cn.yty.redis.service.RedisService;
import cn.yty.user.pojo.User;
import cn.yty.user.service.UserService;
import cn.yty.utils.FormatDatetime;
import cn.yty.utils.RequestUtils;
import cn.yty.web.pojo.ReturnState;

@RestController
@RequestMapping("user")
public class UserController {
	
	@Autowired
	private UserService userService;

	@Autowired
	private RedisService redisService;
	
	
	/**
	 * 1  用户登录
	 */
	@GetMapping("login")
	public ReturnState login(String username,String password,
			HttpServletRequest request, HttpServletResponse response,HttpSession session){
		//用户名不能为空
		if (null != username || !"".equals(username)) {
			//密码不能为空
			if (null != password || !"".equals(password)) {
				User user2 = userService.findByUsername(username);
				if (null != user2) 
				{
					//检查密码
					if (encodePassword(password).equals(user2.getPassword())) {
						//将登录信息写入session
						redisService.set(RequestUtils.getToken(request, response),user2.getUsername());
						return new ReturnState("success","登录成功", "200", null);
					}else{
						return new ReturnState("success","用户名或密码错误", "201", null);
					}
				}else{
					return new ReturnState("error","用户名不存在,请注册后登陆!", "302", null);
				}
			}else{
				return new ReturnState("error","密码不能为空!", "401", null);
			}
		}else{
			return new ReturnState("error","用户名不能为空!", "400", null);
		}
	}
	/**
	 * 密码加密
	 */
	private String encodePassword(String password) {
		try {
			//加盐  jdk 各种加密
			MessageDigest instance = MessageDigest.getInstance("MD5");
			//加密产生密文
			byte[] digest = instance.digest(password.getBytes());
			//十六进制再加密一次
			char[] encodeHex = Hex.encode(digest);
			return new String(encodeHex);
		} catch (NoSuchAlgorithmException e) {
			e.printStackTrace();
		}
		return null;
	}
}




2.2 新建RequestUtils.java工具类,代码如下

package cn.gog.utils;
import java.util.UUID;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class RequestUtils {
	public static String getToken(HttpServletRequest request, HttpServletResponse response){
		//1.Cookie中是否有令牌, 取cookie令牌
		Cookie[] cookies = request.getCookies();
		if(cookies != null && cookies.length > 0){
			for(Cookie cookie : cookies){
				if(cookie.getName().equals("token")){
					//2. 有 直接使用
					return cookie.getValue();
				}
			}
		}
		//3. 没有 生成一个新的令牌
		String token = UUID.randomUUID().toString().replaceAll("-", "");
		//4. 创建cookie并保存令牌
		Cookie cookie = new Cookie("token", token);
		//设置存活时间 -1表示关闭浏览器销毁
		cookie.setMaxAge(-1);
		//设置携带路径(就是在所有项目中都可以获取这个cookie)
		cookie.setPath("/");
		//5. 写回到浏览器
		response.addCookie(cookie);
		//6. 返回新生成的令牌
		return token;
	}


	/**
	 *  清除token
	 */
	 public static void removeToken(HttpServletResponse response){
		Cookie newCookie=new Cookie("token",null); //假如要删除名称为username的Cookie
		newCookie.setMaxAge(0); //立即删除型
		newCookie.setPath("/"); //项目所有目录均有效,这句很关键,否则不敢保证删除
		response.addCookie(newCookie); //重新写入,将覆盖之前的
	 }
}

集成完毕

 

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

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

相关文章

exe指定自带jre环境执行--exe4j使用注意点

不要打钩,允许使用jre运行而不仅仅是jdk 将jre复制粘贴到exe目录下,和我吗的exe在同一文件夹

Flowable学习[一]

一、参考CSDN博主[水中加点糖]的博客[采用springbootflowable快速实现工作流],文章地址:https://puhaiyang.blog.csdn.net/article/details/79845248,下载其发布在github上的代码 二、本地解压代码,并加载到idea中 三、使用docke…

使用three.js与WebGL相比有什么优势?

推荐:使用 NSDT场景编辑器 助你快速搭建可二次编辑的3D应用场景 特点 WebGL和Three.js是两个与网页3D图形渲染相关的技术。以下是它们的一些特点: WebGL: 基于OpenGL ES标准,为网页提供了一种基于GPU加速的图形渲染API。具有高性能的图像处…

期权攻略:手续费、保证金、期权账户租赁、零门槛开户哪家强?

期权开户的手续费和保证金收取方式可能因不同的券商和期权分仓平台而异。一般来说,期权手续费是根据交易的类型和数量张数来计算的,可以是固定费用或按比例收取,下文介绍期权攻略:手续费、保证金、期权账户租赁、零门槛开户哪家强…

[ubuntu]ubuntu18.04使用自带共享桌面实现vncserver连接

vncserver有很多方法比如你安装vnc4server,tightvncserver,x11vnc等都可以实现vnc局域网连接,今天使用系统共享桌面设置vnc连接 Ubuntu开启远程桌面 Ubuntu18.04使用gnome桌面环境,系统自带屏幕共享和远程登录功能,默认使用的是vino作为VNC…

PyTorch深度学习实战(12)——数据增强

PyTorch深度学习实战(12)——数据增强 0. 前言1. 图像增强1.1 仿射变换1.2 亮度修改1.3 添加噪音1.4 联合使用多个增强方法 2. 对批图像执行图像增强3. 利用数据增强训练模型小结系列链接 0. 前言 数据增强是指通过对原始数据进行一系列变换和处理&…

三款远程控制软件对比,5大挑选指标:安全、稳定、易用、兼容、功能

陈老老老板🤴 🧙‍♂️本文专栏:生活(主要讲一下自己生活相关的内容)生活就像海洋,只有意志坚强的人,才能到达彼岸。 🧙‍♂️本文简述:三款远程控制软件对比,5大挑选指标&#xff1…

两款开箱即用的Live2d

目录 背景第一款:开箱即用的Live2d在vue项目中使用html页面使用在线预览依赖文件地址配置相关参数成员属性源码 模型下载 第二款:换装模型超多的Live2d在线预览代码示例源码 模型下载 背景 从第一次使用服务器建站已经三年多了,记得那是在2…

App Tamer for Mac CPU智能控制管理

App Tamer是一款针对 macOS 平台的软件,它可以帮助用户有效地管理和控制正在运行的应用程序。通过优化 CPU 使用率,减少电池消耗和降低系统负载,App Tamer 提供了更加流畅和高效的计算体验。 App Tamer 的主要特点包括: 智能控制&…

HttpRunner接口自动化框架搭建,干货满满!

前言 除了前面讲述的unittest、pytest等等自动化框架外,HttpRunner也是当前流行自动化框架之一。 一、先简单来介绍下httprunner框架 1、它是面向HTTP协议的测试框架,独立于语言之外,无需编写代码脚本,只需要去维护yaml/json文…

【分布式共识】Multi-Paxos 算法思想

上一篇文章主要聊了Basic Paxos算法,而Multi-Paxos并不是一种算法,是一种算法思想。具体就是Basic Paxos解决的是对一个值达成共识。而后者是通过执行多次的Basic Paxos算法就多个值达成一致。具体的落地实现有Raft。 Muti-Paxos的问题 在Basic Paxos中…

为什么要建设校园气象站?

为什么要建设校园气象站?这是因为校园气象站不仅是气象观测工具,也可以作为气象教学仪器。校园气象站是由温度传感器、湿度传感器、大气压力传感器、二氧化碳传感器、风速传感器、风向传感器、雨量计等共同组成,它们会将看不见摸不着的各种气…

pdf太大怎么压缩大小?这样压缩文件很简单

工作和学习中,用到PDF文件的机会还是比较多的,但有时候PDF文件过大会给我们带来困扰,比如上传PDF文件时会因超出系统大小导致无法上传,这时候简单的解决方法就是压缩PDF文件,下面就来看看具体的操作方法吧~ 方法一&…

Codeforces EDU 151 Div.2

文章目录 A. Forbidden IntegerB. Come TogetherC. Strong PasswordD. Rating SystemE. Boxes and Balls A. Forbidden Integer Problem - A - Codeforces 给定整数n,从1~k中选择除了x的数,使这些数之和为n,每个数可以选择无限次 爆搜&…

回溯算法详解

目录 回溯算法详解 回溯VS递归 回溯算法的实现过程 n个结点构造多本节要讨论的是当给定 n(n>0)个结点时,可以构建多少种形态不同的树。 回溯算法详解 回溯算法,又称为“试探法”。解决问题时,每进行一步&#…

港联证券|集合竞价涨停马上又取消什么意思?

【科创板上市公司掀罕见回购潮】近来科创板上市公司董事长、实控人提议回购潮涌。Wind数据显现,今年以来,除掉定向回购,A股共有240家上市公司发表回购方案。其中,8月16日晚至20日晚,共有40家科创板上市公司董事长、实控…

Java 实现证件照底图替换,Java 实现照片头像底图替换

效果图 这里前端用layui实现的案例截图 color底图颜色可以在网页上这样取色 new Color(34, 133, 255) 实现案例下载链接:https://download.csdn.net/download/weixin_43992507/88237432

浅谈中压系统母线弧光保护的必要性-安科瑞黄安南

摘要:本文介绍了中低压开关柜内部发生电弧故障的原因、危害以及弧光保护在中压母线保护中的原理、用途、应用关键点,同时还介绍了弧光保护应用现状,探讨了无线测温在线监测系统在实际工作场景中的应用案例,证明了其在电力监控方面…

了解扩散概率模型 (DPM)

一、介绍 对复杂的概率分布进行建模是机器学习的核心问题。如果这个问题可以出现在不同的形状下,最常见的设置之一如下:给定仅由一些可用样本描述的复杂概率分布,如何生成新样本? 所有生成模型都依赖于相同的基本思想,…

基于PyQt+mysql图书管理系统

1 需求分析 针对图书馆的图书管理系统数据库设计,分别对图书馆的读者、一般工作人员和部门负责人进行详细地分析,总结出如下的需求信息: (1)图书馆中的图书具有书号、书名、作者、馆藏册数、在馆册数、价格、出版社及摘要等必要信…