SSO 单点登录实现方案
发布日期:2021-06-23 09:17:47
浏览次数:17
分类:技术文章
本文共 4004 字,大约阅读时间需要 13 分钟。
SSO 单点登录实现方案
基本概念
三种实现方案
Session 共享
Oauth 2.0 实现
JWT 实现单点登录
Spring Boot 实现 JWT
1.引入依赖
com.auth0 java-jwt 3.10.3
2.编写工具类
public class JwtUtils { // 用于JWT进行签名加密的秘钥 private static String SECRET = "code-duck-*%#@*!&"; /** * JWT 包含三部分: Header 头部 Payload 负载 Signature 签名 * Signature: sign = hash(Base64(header) + Base64(payload)+secret) * Header: * { * "alg": "HS256", * "typ": "JWT" * } * payload:{ ** iss: jwt签发者 * sub: 面向的用户(jwt所面向的用户) * aud: 接收jwt的一方 * exp: 过期时间戳(jwt的过期时间,这个过期时间必须要大于签发时间) * nbf: 定义在什么时间之前,该jwt都是不可用的. * iat: jwt的签发时间 * jti: jwt的唯一身份标识,主要用来作为一次性token,从而回避重放攻击。 *
* } * * @param map * @return: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJleHAiOjE2MTM1NzcxNDAsInVzZXIiOiLnlKjmiLfkv6Hmga8ifQ.yDa69wPKNpDFMAPAnXBh-21rRXb5VvFdOqZcC0uDsQU * @exception: */ public static String generateToken(Map
map) { JWTCreator.Builder builder = JWT.create(); //Map 内的信息放到JWT payload 中 map.forEach((k, v) -> { builder.withClaim(k, v); }); // 设置JWT 令牌 过期时间60s Calendar installCalendar = Calendar.getInstance(); installCalendar.add(Calendar.SECOND, 60); builder.withExpiresAt(installCalendar.getTime()); // 设置 签名 并返回token return builder.sign(Algorithm.HMAC256(SECRET)); } /** * @Param: 传入token * @return: */ public static void verify(String token) { JWT.require(Algorithm.HMAC256(SECRET)).build().verify(token); } /** * @Param: 传入token * @return: 解密的token信息 */ public static DecodedJWT getTokenInfo(String token) { return JWT.require(Algorithm.HMAC256(SECRET)).build().verify(token); }}
3.获取 token
@RestController@RequestMapping("/user")public class UserController { @PostMapping("/login") public Maplogin() { HashMap result = new HashMap<>(); // 获取用户信息 HashMap map = new HashMap<>(); map.put("user", "用户信息"); // 生成 token String token = JwtUtils.generateToken(map); result.put("token", token); return result; } @PostMapping("/test") public void test() { System.out.println("测试方法"); }}
4.编写过滤器
public class JwtFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { String token = ((HttpServletRequest) request).getHeader("token"); HashMapmap = new HashMap<>(); try { JwtUtils.verify(token);//验证令牌 chain.doFilter(request, response); } catch (SignatureVerificationException e) { e.printStackTrace(); map.put("msg", "无效签名!"); } catch (TokenExpiredException e) { e.printStackTrace(); map.put("msg", "token过期!"); } catch (AlgorithmMismatchException e) { e.printStackTrace(); map.put("msg", "token算法不一致!"); } catch (Exception e) { e.printStackTrace(); map.put("msg", "token无效!!"); } response.setContentType("application/json;charset=UTF-8"); response.getWriter().println(map); } @Override public void destroy() { }}
5.注册过滤器
@Configurationpublic class FilterConfiguration { private String skipUrlPattern = ""; @Bean public FilterRegistrationBean filterRegistration() { FilterRegistrationBean registration = new FilterRegistrationBean(); registration.setFilter(new JwtFilter()); registration.addInitParameter("skipUrlPattern", skipUrlPattern); registration.addUrlPatterns("/*"); return registration; }}
转载地址:https://blog.csdn.net/spring_mybatis_111/article/details/113840213 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
逛到本站,mark一下
[***.202.152.39]2024年03月10日 10时37分27秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
cmd mysql 数据分析_小白学数据分析--与MySQL有关的小知识
2019-04-21
java完成九宫格数独_简单实现java数独游戏
2019-04-21
php 安装zip,php7.4安装zip扩展
2019-04-21
php7 gitbook,php7性能分析扩展工具xhprof
2019-04-21
java wav 切割_java切割音频文件
2019-04-21
java获取服务器编码_使用Java代码获取服务器性能信息及局域网内主机名
2019-04-21
mysql 导出json_如何将MySQL数据库导出到JSON?
2019-04-21
linux 离线安装中文字库,centos7 离线安装字体fontconfig
2019-04-21
鸿蒙系统chromeos2.0,【华为鸿蒙系统】鸿蒙OS 2.0 适配计划曝光
2019-04-21
android高德地图设置缩放级别,设置地图中心点/级别
2019-04-21
dv4 安装linux,linux安装中的问题
2019-04-21
gmat阅读.html,GMAT阅读“Ecoefficiency”文章深度分析
2019-04-21
html5 带图片导航,html5 带声音的导航
2019-04-21
avs3 mkv格式封装_将你的视频无损封装成MP4,非转码哦!
2019-04-21
java http服务端_HTTP协议经典面试题整理及答案详解
2019-04-21
mysql 递归查找父节点_数据结构与算法—浅显易懂的二叉排序(查找)树
2019-04-21