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 Map
login() {
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"); HashMap
map = 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 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:Docker 部署 Elasticsearch
下一篇:安装火绒的情况下怎么关闭防火墙

发表评论

最新留言

逛到本站,mark一下
[***.202.152.39]2024年03月10日 10时37分27秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章

java 设置pdf页面大小_Java PDF页面设置——页面大小、页边距、纸张方向、页面旋转... 2019-04-21
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咨询公司,Technical support and consulting 2019-04-21
linux 离线安装中文字库,centos7 离线安装字体fontconfig 2019-04-21
可以使用鸿蒙系统的55款手机,华为鸿蒙系统首批适配机型即将公布,共有55款产品可升级搭载... 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
point 如何求elbow_机器人学——实践一(Arm Navigation 理论+代码) 2019-04-21
avs3 mkv格式封装_将你的视频无损封装成MP4,非转码哦! 2019-04-21
java http服务端_HTTP协议经典面试题整理及答案详解 2019-04-21
mysql 递归查找父节点_数据结构与算法—浅显易懂的二叉排序(查找)树 2019-04-21