聊聊我在这家公司设计的SSO

  • 时间:
  • 浏览:0
  • 来源:大发pk10_pk10最高邀请码_大发pk10最高邀请码

最近小明遇到这么 需求:都要将几个独立的系统(子系统)汇总到这么 集中的系统(父系统)当中,当用户在父系统登录随后 ,再点击这几个子系统,就还都要免登录跳转到任意这么 系统。当时一听,duang~duang~也有一点方案涌进来(吹牛的),但这么下面同类 方案得到了leader的肯定,如今假如有一天 在线上跑着了,接下来给亲们 复盘一下。

看过同类 需求,亲们 是也有第一感觉就说 :这不就说 SSO(单点登录)系统嘛?

单点登录(英语:Single sign-on,缩写为 SSO),又译为单一签入,并也有对于一点相互关连,假如有一天 又是所村里人 独立的软件系统,提供访问控制的属性。当拥有这项属性时,当用户登录时,就还都要获取所有系统的访问权限,越多对每个单一系统都逐一登录。这项功能通常是以轻型目录访问协议(LDAP)来实现,在服务器上会将用户信息存储到LDAP数据库中。相同的,单一退出(single sign-off)就说 指,只都要单一的退出动作,就还都要现在随后 刚开始对于多个系统的访问权限。

是的,没错,小明接到同类 需求随后 ,整体思路也是按着SSO设想的,假如有一天 细想随后 ,发现这么详细照搬,要考虑项目的实际情况报告:比如已知的几个子系统是随后 的假如有一天 开发好的,这么大动干戈,都要平滑接入父系统,假如有一天 根据需求,SSO的功能也没必要详细实现,简而言之,就说 这么 阉割版的SSO。

小明只都要实现:用户在父系统账号密码登录后,通过点击任意这么 子系统的功能按钮(不都要重复输入账号登录)能能 跳转子系统功能页即可。

设计流程

项目

这么 简单朴素的SpringBoot项目

时序图

说干就干,用户输入账号密码,请求SSO用户登录模块进行账号密码校验,校验通随后 建立全局会话,假如有一天 返回前端token凭证(我使用的是sessionId),跳转一点系统时携带token,一点系统拿到token后,再调用SSO平台进行token校验,假如有一天 校验通过,则用户可在子系统内建立会话,用户跳转系统完成。下面给亲们 举例SSO跳转这么 子系统的时序图:

在这里插一嘴哈,我使用的流程图工具是ProcessOn,是一款在线画图工具,非常适合画各种示意图,体验极佳,假如有一天 亲们 想尝试一下,还都要使用我的邀请链接注册使用~

整个流程图如后面 所示,下面主要针对各个功能点进行详细说明。

SSO系统的登录与会话保持

本次会话管理采用的是redis session,spring完美支持redis存储session信息,此外还支持MONGODB\JDBC\HAZELCAST等存储会话土措施。通过redis存储session,还都要满足集群部署、分布式系统的session共享(当然那此也有后话)。

pom.xml依赖配置如下

        <!--redis 依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>
        <!--sessions 依赖-->
        <dependency>
            <groupId>org.springframework.session</groupId>
            <artifactId>spring-session-data-redis</artifactId>
        </dependency>

application.yml配置redis及session

spring:
  redis:
    host: 127.0.0.1
    password: 123456
    port: 6379
    timeout: 50000
    database: 0
    jedis:
      pool:
        max-active: 50000
        max-wait: -1
        max-idle: 10
        min-idle: 5
  # 设置session存储类型为redis 
  session:
    store-type: redis

此时,redis存储会话配置假如有一天 完成,但总虽然缺少那此,嗷,这么 除此之外,亲们 还都要设置session的有效时长,application.yml中的配置如下:

server:
  servlet:
    session:
        # 支持Duration表达式,此时表示120分钟
      timeout: PT120M

当然,亲们 还都要在Springboot主土措施通过@EnableRedisHttpSession开启redis session

注意:假如有一天 后面 配置的session有效时长不生效,亲们 还都要在注解属性上配置session有效时间(不瞒亲们 ,我就说 在此处配置才生效的)

@SpringBootApplication
// 开启redis session ,假如有一天

设置session有效时长
@EnableRedisHttpSession(maxInactiveIntervalInSeconds = 7500)
public class XiaoMingApplication {

    public static void main(String[] args) {
        SpringApplication.run(XiaoMingApplication.class, args);
    }
}

至此,sso系统的登录及会话管理就完成啦。接下来看一下与一点系统咋样交互。

跳转子系统

流程

假如有一天 SSO假如有一天 登录 -> 用户点击某个子系统按钮(和负责A系统的人员约定好的链接)发起get请求 -> A系统后端接收到请求 -> 调用SSO系统进行token校验(下面会讲到) -> 建立会话,同类

http://xxx/jump?token=123456

这是这么 在地址栏输入的get请求,该接口都要特殊处理,后端拦截器都要放行。

参数说明
xxx 此处xxx为域名,jump为系统A提供的接口url地址,还都要自定义,都要约定告知
token 返回的校验凭证

该接口虽然就都要干两件事情:

  1. 请求SSO进行token校验(同类随后 的用户、密码登录,只不过调用SSO平台接口校验);
  2. 建立本地会话(和账号密码登录成功随后 的建立会话土措施一致)。
  3. 控制校验通随后 的页面跳转。

SSO为子系统提供token校验接口

后面 讲到SSO会暴漏这么 token校验接口,同类 块逻辑很简单,就说 拿着token去redis中查找对应的用户信息算不算处在。众所周知,小明是这么 懒人,为了投机取巧,小明token的生成规则,就说 session的id,假如有一天 ,判断用户算不算登录,虽然就说 根据sessionId查找redis算不算处在会话,此处有亮点。通过查看源码,我发现同类 功能,根本越多亲们 此人 去实现,spring假如有一天 想到亲们 会用到。

spring提供了这么 接口org.springframework.session.SessionRepository

package org.springframework.session;

public interface SessionRepository<S extends Session> {
    S createSession();

    void save(S var1);
    // 同类

就说


    S findById(String var1);

    void deleteById(String var1);
}

其中S findById(String var1)就说 亲们 要调用的土措施,同类 土措施作用就说 根据sessionId去会话中心查找会话对象,正是亲们 所都要的,亲们 只需通过@Autowired获取,开箱即用~亲们 一块儿看一下业务代码:

@Autowired
private SessionRepository sessionRepository;
    @PostMapping("/checkToken")
public BaseResponseFacade checkToken(@RequestBody UserLoginVo userLoginVo) {
    if (Objects.isNull(userLoginVo)) {
        return ResponseUtil.error(NEED_LOGIN);
    }
    String token = userLoginVo.getToken();
    Session session = sessionRepository.findById(token);
    if (Objects.isNull(session)) {
        return ResponseUtil.error(NEED_LOGIN);
    }
    AdverInfo adverInfo = JSON.parseObject(session.getAttribute("adverInfo"), AdverInfo.class);
    return ResponseUtil.success(adverInfo);
}

SSO和子系统的交互文档也贴出来给亲们 一睹为快

接口调用请求说明

  • 请求土措施:POST
  • 请求格式:JSON
  • 请求地址
    • 测试:http:/xxx/checkToken
    • 正式:http://xxx/checkToken
  • POST数据示例
{
    "token": "123456"
}
参数说明
xxx/checkToken xxx为域名,checkToken为营销云平台提供的校验接口地址
token 调用接口凭据

返回说明

正常时返回的json数据包示例

假如有一天 SSO校验通过,则系统A还都要与与当前用户建立本地会话,用户正常进入系统

{
    "data":{
    "XXX":"XXX"
    },
    "errorMsg":"成功",
    "errorCode":0
}

参数说明

errorCode 0:表示请求成功
errorMsg 返回码说明
XXX 一点相关信息
异常时返回的json数据包示例

当SSO后台校验失败时返回参数如下

{
  "errorMsg": "NEED_LOGIN",
  "errorCode": 10
}

参数说明

errorMsg 错误信息说明
errorCode 错误标志

错误码说明

1 系统繁忙
10 都要用户登录
5000 服务器内控 错误

小明设计的简洁版sso就大抵这么 ,亲们 还都要作为这么 sso入门demo来看待

猜你喜欢

TechWeb.com.cn

华天科技预计今年前三季度盈利16,461.02万元至17,761.02万元,同比下降45.75%至49.72%。华天科技上年同期盈利3.27亿元。Libra(天秤币)學會成员将

2019-10-14

忆捷 G50 USB3.0(500G)好不好,优缺点,是否值得买

关于大伙儿儿儿儿|广告服务|使用条款|联系大伙儿儿儿儿北京盛拓优讯信息技术有限公司.版权所有中华人民共和国增值电信业务经营许可证编号:京B2-20170206北京市公安局海淀分

2019-10-14

港超足球联赛\愉园“小虎队”今硬碰杰志

图:左起:由车路士足校培训的愉园小将张俊轩、袁世杰、黄浩然、朱伟钧、黄智康与翁煦涛,齐集港超舞台【大公报讯】记者李恒基报道:拖累本地顶级足球赛事舞台十个 球季,老牌球队愉园今

2019-10-14

人物專訪\黃洋:爭取出場不放鬆

圖:黃洋(前)將在十月滿36歲,但仍以年輕球員初到球隊的心態去競爭正選十年人事幾番新,港超足球隊傑志近10年6次在香港頂級組別聯賽稱霸,如今進入新舊交替期,當年的冠軍功臣仍在陣

2019-10-14

王者荣耀2018年度评选活动之王者最会玩投票地址

王者荣耀2018年度评选活动现在不可能 开启了投票活动,玩家可不时需为买车人最喜欢的精彩瞬间进行投票了,下面我们来看下这次活动的投票地址吧。本次的活动一共有4个奖项评选:年度

2019-10-14