自定义单点登录(2)
自定义 登录 单点
2023-09-14 09:04:40 时间
我是温浩然:
单点登录,分为客户端和服务器端,客户端,主要与用户的浏览器进行交互,操作浏览器,比如,cookie,session等。
服务器端,主要是储存用户的信息,和后台数据库进行交互,获取当前登录的用户信息,对用户的登录进行验证。
关于单点登录,我感觉,验证方式有很多种,
我这里,是对cookie进行操作,当用户登录成功后,会在浏览器新建cookie,储存一定信息,当
SSO单点登录流程源码学习 单点登录系统无状态应用,通过对SSO单点登录系统验证码、LT存入redis,及补偿service的操作更加深入的了解单点登录系统登录流程
OIDC SSO - 相关SSO流程和注意事项 ## 背景信息 OIDC SSO相关文档总共4篇,主要内容为对OIDC实现SSO登录流程时的各个细节和相关技术的阐述:1. 《[OIDC SSO - OAuth2.0的授权模式选择](https://ata.alibaba-inc.com/articles/218489)》 2. 《OIDC SSO - 相关SSO流程和注意事项》 3. 《[OIDC SSO - Discovery Mech
什么是SSO 百科:SSO英文全称Single Sign On,单点登录。SSO是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。
SSO是一种统一认证和授权机制,指访问同一服务器不同应用中的受保护资源的同一用户,只需要登录一次,即通过一个应用中的安全验证后,再访问其他应用中的受保护资源时,不再需要重新登录验证。
我是温浩然:
单点登录,分为客户端和服务器端,客户端,主要与用户的浏览器进行交互,操作浏览器,比如,cookie,session等。
服务器端,主要是储存用户的信息,和后台数据库进行交互,获取当前登录的用户信息,对用户的登录进行验证。
关于单点登录,我感觉,验证方式有很多种,
我这里,是对cookie进行操作,当用户登录成功后,会在浏览器新建cookie,储存一定信息,当用户访问受保护的请求时,获取cookie并进行验证,如果验证通过,则该用户已经登录,可以访问受保护的信息。
下面贴在Filter中,进行验证的代码。
1、服务器中,对用户进行验证的代码。
package com.tujia.core.security; import java.util.Date; import java.util.HashMap; import java.util.Map; import java.util.UUID; import javax.annotation.Resource; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; import org.springframework.web.util.WebUtils; import com.tujia.common.exception.UnAuthedException; import com.tujia.tuuser.dao.UserDao; import com.tujia.tuuser.entity.User; import com.tujia.tuuser.service.UserService; @Component public class SecurityUtil { @Resource private UserDao userDao; private String TOURL = "TOURL"; private static ThreadLocal User threadTuser = new ThreadLocal User private Map String,AuthTuUser map = new HashMap String,AuthTuUser private Map String,User mapUser = new HashMap String,User //下面这个是对数据进行操作,与数据库进行交互的Java类 @Autowired private UserService userService; /*@Autowired TokenAuthentication tokenAuthentication;*/ //tujia.requrl 下面这些都是配置文件 @Value("${tujia.requrl}") private String requrl; @Value("${tujia.token}") private String tokenKey; @Value("${loginURL:\"\"}") private String loginURL; private int MS_IN_A_DAY = 24 * 3600 * 1000; private int SECS_IN_A_MONTH = 24 * 3600 * 30; * 得到当前登录的用户,用户再业务逻辑的地方 * @return public static User getCurrentTuser() { return threadTuser.get(); * 用在filter的地方, * @param request * @throws UnAuthedException * @return:true:已经登录了。false:没有登录 public boolean authenticate(HttpServletRequest request, HttpServletResponse response) throws UnAuthedException { boolean result; // 处理cookie情况 Cookie cookie = WebUtils.getCookie(request, tokenKey); String url = request.getRequestURI(); //if登录cookie is null ,则添加cookie url. if (cookie == null){ //这是被拦截后添加的cookie Cookie cookieurl = new Cookie(requrl, url); cookieurl.setPath("/"); cookieurl.setMaxAge(-1); response.addCookie(cookieurl); return false; String value = cookie.getValue(); AuthTuUser au = (AuthTuUser) map.get(value); if (au == null ){ Cookie cookieurl = new Cookie(requrl, url); cookieurl.setPath("/"); cookieurl.setMaxAge(-1); response.addCookie(cookieurl); return false; request.getSession().setAttribute("userLogin", mapUser.get(value)); result = verifyTuserId(au.getId()); if (!result) { logout(request, response); return result;贴的很多,但是如果看得仔细,会发现其中我增加了两个cookie,一个是token,就是保存在浏览器中的登录信息。
public User getLoinTuser(HttpServletRequest request) throws UnAuthedException { // 处理cookie情况 Cookie cookie = WebUtils.getCookie(request, tokenKey); if (cookie == null) return null; String value = cookie.getValue(); AuthTuUser au = (AuthTuUser) map.get(value); if (au == null)// || au.isExpire() return null; User user = userService.get(au.getId()); return user; private String generateValue() { return UUID.randomUUID().toString(); public void inputSuccess(HttpServletRequest request,HttpServletResponse response, long userId, boolean saved) throws UnAuthedException { if (verifyTuserId(userId)) { addCookieAndCache(request,response, userId, saved); }else{ throw new UnAuthedException("该用户不存在,请重新输入!"); private void addCookieAndCache(HttpServletRequest request,HttpServletResponse response, long userId, boolean saved) { AuthTuUser au = new AuthTuUser(userId); User user = userDao.get(userId); String tokenValue = generateValue(); Cookie cookie = new Cookie(tokenKey, tokenValue); cookie.setPath("/"); if (saved) { cookie.setMaxAge(SECS_IN_A_MONTH); au.setSaved(true); } else { cookie.setMaxAge(-1); au.setExpireDate(new Date(System.currentTimeMillis() + MS_IN_A_DAY)); request.setAttribute("token", tokenValue); response.addCookie(cookie); map.put(tokenValue, au); mapUser.put(tokenValue, user); request.getSession().setAttribute("userLogin", user); public boolean verifyTuserId(long userId) throws UnAuthedException { boolean result; User user = userService.get(userId); if (user.isDeleted()) {// 员工被停用了 result = false; } else { threadTuser.set(user); result = true; return result; * @param req * @return public void logout(HttpServletRequest request, HttpServletResponse response) { Cookie cookie = WebUtils.getCookie(request, tokenKey); if (cookie == null) return; String value = cookie.getValue(); AuthTuUser au = (AuthTuUser) map.get(value); if (au == null) { delteCookie(response, tokenKey); delteCookie(response, requrl); return; delteCookie(response, tokenKey); map.remove(value); return; private void delteCookie(HttpServletResponse response, String cookieName) { Cookie cookie = new Cookie(cookieName, ""); cookie.setPath("/"); cookie.setMaxAge(0); response.addCookie(cookie); // 线程结束的时候调用。 public static void clearOnThreadOver() { threadTuser.remove(); public void setTOURL(HttpServletResponse response, HttpServletRequest request) { StringBuffer u = request.getRequestURL(); if (request.getQueryString() != null) { u.append(?); u.append(request.getQueryString()); Cookie cookie = new Cookie(TOURL, u.toString()); cookie.setPath("/"); cookie.setMaxAge(-1); response.addCookie(cookie); public String getTOURL(HttpServletRequest request, HttpServletResponse response) { Cookie cookie = WebUtils.getCookie(request, TOURL); if (cookie == null) return ""; delteCookie(response, TOURL); return cookie.getValue(); public String getLoginURL() { return loginURL; public String getReqURL(HttpServletRequest request,HttpServletResponse response){ Cookie cookie = WebUtils.getCookie(request, requrl); String value = cookie.getValue(); return value; public void setLoginURL(String loginURL) { this.loginURL = loginURL; public void requrl(HttpServletRequest request,HttpServletResponse response) { Cookie cookie = WebUtils.getCookie(request, requrl); if(cookie == null){ Cookie cookieurl = new Cookie(requrl, "/tu-login/user/index"); cookieurl.setPath("/"); cookieurl.setMaxAge(-1); response.addCookie(cookieurl); public boolean getAuthTuUser(String token){ AuthTuUser au = (AuthTuUser) map.get(token); if (au == null ){ return false; }else{ User user = mapUser.get(token); return true;
另一个cookie是requrl,这个是,当用户访问受保护的请求,然后登录后,能自动调整显示的页面。
AuthTuUser这个是储存用户登录信息的javaBean,当用户判断是否登录时,就用map来判断。
SSO单点登录流程源码学习 单点登录系统无状态应用,通过对SSO单点登录系统验证码、LT存入redis,及补偿service的操作更加深入的了解单点登录系统登录流程
OIDC SSO - 相关SSO流程和注意事项 ## 背景信息 OIDC SSO相关文档总共4篇,主要内容为对OIDC实现SSO登录流程时的各个细节和相关技术的阐述:1. 《[OIDC SSO - OAuth2.0的授权模式选择](https://ata.alibaba-inc.com/articles/218489)》 2. 《OIDC SSO - 相关SSO流程和注意事项》 3. 《[OIDC SSO - Discovery Mech
什么是SSO 百科:SSO英文全称Single Sign On,单点登录。SSO是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。
SSO是一种统一认证和授权机制,指访问同一服务器不同应用中的受保护资源的同一用户,只需要登录一次,即通过一个应用中的安全验证后,再访问其他应用中的受保护资源时,不再需要重新登录验证。
相关文章
- Vue专题 04_自定义指令语法(directives)
- 【说站】python类如何自定义实例化
- GitHub pages配置自定义域名利用Cloudflare全球CDN
- WordPress自定义字段字符串类型转数字排序
- wordpress 为自定义类型文章新增自定义字段的方法-文曦博客
- SpringSecurity自定义设置登录界面
- C/C++ Qt 信号自定义槽函数
- 自定义注解(参数解析器)
- 【RecyclerView】 一、RecyclerView 最基本用法 ( 添加支持库 | 设置布局文件 | 自定义适配器 )
- 【Android Gradle 插件】将自定义 Gradle 插件上传到自建 Maven 仓库 ⑦ ( 登录 Maven 私服 | Maven 私服初始化设置 | 创建 Maven 仓库 )
- Spring Cloud Bus使用自定义的消息转换器(三)
- JS 按自定义格式 拼接二进制串 解析二进制串
- Sql Server中常用的6个自定义函数分享
- MySQL自定义排序实现最佳结果(mysql 自定义排序)
- 数据类型利用Redis自定义数据类型实现更优雅的存储(redis自定义)
- Jquery自定义动画概述及示例
- php中自定义函数dump查看数组信息类似var_dump
- jquery自定义下拉列表示例
- java自定义日期转化类示例
- PHP采用自定义函数实现遍历目录下所有文件的方法