通用介绍

单点登录系统,简称为 SSO,是目前比较流行的企业业务整合的解决方案之一。SSO的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。任何SSO框架都需要创建统一的认证中心!

解决问题

当我们有多个系统时,每个系统都需要做登录操作的时候,会遇到非常繁琐的问题(频繁的登录),当调用其他服务时也会出现访问不到,授权的问题,那么怎么解决此问题呢?我们就用到了SSO框架。

框架介绍

我们使用MaJiaSSO框架来解决单点登录问题。此框架使用非常简单,五分钟集成框架,使用JWT作为Token,不依赖任何存储,用户可以携带自定义信息,可以自定义Token加密盐。我们只需要创建一个统一的认证服务,此服务我们用来验证用户登录,并且验证获取Token。访问其他服务时,只需要带上Token就可以进行访问。我们可以使用@NoToken注解来控制放开那些不需要注解的请求映射。

对比优点

  1. 不依赖任何存储(大部分SSO依赖缓存/Redis/Mysql等存储)
  2. 即插即用,五分钟集成
  3. Token基于JWT,用户可以自己携带信息
  4. 用户自定义加密盐,安全便捷
  5. 基于注解控制请求,简单方便
  6. 基于拦截器,可以动态控制拦截请求(推荐拦截所有/**,使用@NoToken控制)
  7. 认证服务器重启无影响,无缓存

使用SSO框架

建立统一认证中心

pom引入

<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>1.5.10.RELEASE</version><relativePath /></parent><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- sso core --><dependency><groupId>com.majiaxueyuan</groupId><artifactId>sso-core</artifactId><version>1.2.2</version></dependency></dependencies>

登录请求Controller
在这里,为了方便就不编写Sql服务,假如用户名和密码分别为admin/123456时表示认证通过。
认证通过时,调用方法loginSuccess,传入参数(唯一ID,用户名,其他信息,自定义加密盐),判断返回状态码是不是200,如果是,直接获取data就是TOKEN值。

@RestController
public class LoginController {@RequestMapping("/login")public String login(String username, String password) {if (username.equals("admin") && password.equals("123456")) {// 表示登录成功JSONObject json = new JSONObject();json.put("username", username);json.put("role", new ArrayList<String>(Arrays.asList("admin", "normal")));Result loginSuccess = TokenLoginHelper.loginSuccess(1L, username, json.toJSONString(), "token-salt");if (loginSuccess.getCode().equals(200)) {String token = loginSuccess.getData().toString();System.out.println(token);return "token:" + token;}return "登录失败";}return "failed";}
}

请求时正常返回Token如下:

到这里认证服务就集成完毕了

普通服务集成MaJiaSSO

对于普通服务而言,一个服务也是这样集成,两个服务也是这样集成…100个服务也是这样集成。
注意事项:在集成时,我们需要注意设置加密盐要和授权中心一致(必须一致,一把锁必须对应它的钥匙才能打开锁)

集成步骤:

  1. 创建正常的SpringBoot服务
  2. 引用Jar包
  3. 添加拦截器
  4. 放开不需要认证的请求

集成就完毕了!!!

pom.xml

<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>1.5.10.RELEASE</version><relativePath /></parent><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>com.majiaxueyuan</groupId><artifactId>sso-core</artifactId><version>1.2.2</version></dependency></dependencies>

添加MaJiaSSO拦截器,并设置加密盐

@Configuration
public class MaJiaSsoConfig extends WebMvcConfigurerAdapter {@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(ssoIntercepter()).addPathPatterns("/**");}@Beanpublic MaJiaSSOIntercepter ssoIntercepter() {return new MaJiaSSOIntercepter().setTokenSalt("token-salt");}
}

放开某些请求,并且获取我们保存在Token中的信息
/hello请求是需要我们携带Token进行访问的,而/hi请求则利用注解放开了验证,代码如下

@RestController
public class ClientController {@RequestMapping("/hello")public String hello(HttpServletRequest req) {SSOUser user = (SSOUser) req.getAttribute("ssoUser");System.out.println(user.toString());return "hello";}@RequestMapping("/hi")@NoToken(notNeedToken = true)public String wei() {return "hi,no token!";}
}

访问图(不需要Token,被NoToken注解)

需要Token未携带时访问(返回Code401),当Token不合法,会提示非法请求

正常携带Token时访问,并且控制台会打印出我们携带的所有信息

控制台打印携带的信息

当携带错误的Token进行访问时,我们可以理解为有人恶意的攻击我们的系统,给出提示

到这里我们集成MaJiaSSO就成功了,可以添加很多服务,为每个服务添加上拦截器就OK!SSO就是这么简单。

SSO单点登录系统的实战运用相关推荐

  1. SpringBoot+MyBatis+Redis实现SSO单点登录系统(二)

    SpringBoot+MyBatis+Redis实现SSO单点登录系统(二) 三.代码 配置文件配置数据库,redis等相关的信息. # See http://docs.spring.io/sprin ...

  2. SpringBoot+MyBatis+Redis实现SSO单点登录系统(一)

    SpringBoot+MyBatis+Redis实现SSO单点登录系统(一) 一.SSO系统概述 SSO英文全称Single Sign On,单点登录.SSO是在多个应用系统中,用户只需要登录一次就可 ...

  3. sso单点登录系统(解决session共享)

    场景:假设一个用户将自己的登录信息提交到后台,如果session保存的信息分布在多台机器上,并且不共享,那么可能导致用户的登录信息出现短暂的丢失,为什么这样讲,因为用户访问服务器中间还要经过负载均衡服 ...

  4. 互联网分布式微服务云平台规划分析--SSO单点登录系统

    介绍 鸿鹄云架构[SSO单点登录系统]为所有微服务提供统一的用户认证服务,系统本身属于微服务模式,使用JWT+Redis分布式存储方案,确保不同微服务.系统之间的安全通讯和统一用户校验.认证.在整个服 ...

  5. Shiro整合SSO单点登录系统

    版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/m0_37797991/article/ ...

  6. 手撕一套sso(单点登录)系统之原理篇1

    在手撕之前,你首先要了解一些原理,我写的案例成品可以访问zauth,语言是Java8. 目录 1.关于Http 2.用户信息怎么存?存什么?存在哪? 2.1 使用前端存储技术Storage或index ...

  7. sso单点登录系统的理解

    单点登录有两种方式,一种是跨域,一种是不跨域. 一:在不跨域的情况下, 只需要将cookie设置为顶域状态,即可以实现cookie的共享. 二:跨域登录 用户访问app系统,app系统是需要登录的,但 ...

  8. 基于cookie的SSO单点登录系统

    利用COOKIE实现单点登录功能 近期公司要求帮一个项目实现单点登录功能,在综合考量下决定采用cookie实现,大概的流程如下图所: 转载于:https://www.cnblogs.com/bugge ...

  9. SSO单点登录系统搭建(附源码)

最新文章

  1. Android 依赖库发布(上传 Library 到 JCenter)gradle最高支持4.4
  2. 被上海爱立信录取,GL
  3. qpython3可视图形界面_python GUI库图形界面开发之PyQt5窗口控件QWidget详细使用方法...
  4. android 打印线程信息
  5. 关于warning: Clock skew detected. Your build may be incomplete. 的解决方法【转】
  6. 【HDU - 1455】Sticks (dfs + 剪枝)
  7. python爬取哔哩哔哩视频_Python实现视频爬取下载
  8. 性能提升120倍!滴滴东北大学提出自动结构化剪枝压缩算法框架
  9. android apk 防止反编译技术加壳技术(转)
  10. 基于模板的通用代码生成器LKGenerator(二)-使用时的关键步骤,注意事项及实例
  11. 因中间件问题重重,谷歌暂停Chrome的量子安全功能
  12. MYSQL语句和多表查询
  13. synchronized 修饰在 static方法和非static方法的区别
  14. 应用在AVR上的拼音输入法
  15. nginx静态图片路径映射
  16. 摆动序列算法C语言,376 摆动序列 leetcode
  17. 阿里云域名泛解析教程
  18. 盛姓取名女孩儒雅大气
  19. 马尔科夫预测MATLAB
  20. nginx配置区分移动端和PC端,访问不同域名

热门文章

  1. ffmpeg rtmp 花屏_FFmpeg - 如何编码封装透明通道视频
  2. 广州有哪些值得加入的互联网公司?
  3. 亿格瑞x6老是显示服务器未就绪,亿格瑞新品 X6 家庭云盘详情
  4. 高校社团管理系统_落笔文学社 | 第五届全国高校书信漂流瓶活动
  5. 循环赛日程表(非递归)
  6. Android Studio 找不到符号 变量xxx 类id
  7. excel常用函数vlookup函数
  8. 超详细的vue-router原理
  9. Springer latex模板中的问题解决——单竖线,tikz包调用
  10. iPhone X、面容 ID 视频上手体验