通用登陆(下)

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 Tair(兼容Redis),内存型 2GB
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
简介: 登陆代理接入

接入配置

1 代理服务端(sso-mananger) 部署与配置

1.1创建数据库表

-- ----------------------------
-- Table structure for sso_app
-- ----------------------------
DROP TABLE IF EXISTS `sso_app`;
CREATE TABLE `sso_app` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `gmt_create` datetime DEFAULT NULL COMMENT '创建时间',
  `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间',
  `creator` varchar(255) DEFAULT NULL COMMENT '创建者',
  `modifier` varchar(255) DEFAULT NULL COMMENT '修改者',
  `deleted` smallint(4) DEFAULT '0' COMMENT '是否删除',
  `app_name` varchar(255) NOT NULL COMMENT '应用名称',
  `app_code` varchar(255) NOT NULL COMMENT '应用码',
  `index_url` varchar(255) NOT NULL COMMENT '跳转地址',
  `sso_protocol` varchar(50) NOT NULL COMMENT '协议',
  `sso_provider` varchar(50) NOT NULL COMMENT '提供商',
  `login_url` varchar(256) NOT NULL,
  `logout_url` varchar(128) NOT NULL,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;


-- ----------------------------
-- Table structure for sso_app_oauth_detail
-- ----------------------------
DROP TABLE IF EXISTS `sso_app_oauth_detail`;
CREATE TABLE `sso_app_oauth_detail` (
  `id` bigint(32) NOT NULL,
  `grant_type` varchar(32) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL COMMENT '授权码模式:AUTHORIZATION_CODE;账号密码:IMPLICIT',
  `redirect_url` varchar(128) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL,
  `client_id` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL,
  `client_secret` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL,
  `access_token_url` varchar(128) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL COMMENT '获取accessToken的url',
  `user_info_url` varchar(128) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL COMMENT '获取userInfo的url',
  `gmt_create` datetime DEFAULT NULL,
  `gmt_modified` datetime DEFAULT NULL,
  `creator` varchar(32) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL,
  `modifier` varchar(32) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL,
  `deleted` smallint(4) DEFAULT NULL,
  `app_code` varchar(32) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin ROW_FORMAT=DYNAMIC;

测试数据:

-- ----------------------------
-- data for test
-- ----------------------------
INSERT INTO `sso_app` VALUES ('1', '2020-09-28 16:31:52', '2020-09-28 16:31:53', 'zkl', 'zkl', '0', 'test-cas', 'test-cas', 'http://aliyun-gts-gateway-pre.ingress.dayu.work', 'cas', 'fourA', 'http://139.224.247.5:8080/cas/login?service=http://aliyun-gts-sso-integration-pre.ingress.dayu.work/sso/cas?appCode=test-cas', '');
INSERT INTO `sso_app` VALUES ('2', '2020-09-28 16:31:52', '2020-09-28 16:31:53', 'zkl', 'zkl', '0', 'test-idaas', 'test-idaas', 'http://aliyun-gts-gateway-pre.ingress.dayu.work', 'oauth2', 'idaas', 'https://ythrgnwpev.login.aliyunidaas.com/oauth/authorize?response_type=code&scope=read&client_id=7e455ca863992197f1c78934c61bab56b2dZqzcrS8k&redirect_uri=http%3A%2F%2Faliyun-gts-sso-integration-pre.ingress.dayu.work%2Fsso%2Foauth%3FappCode%3Dtest-idaas', '');
INSERT INTO `sso_app` VALUES ('3', '2020-09-28 16:31:52', '2020-09-28 16:31:53', 'zkl', 'zkl', '0', 'test-oauth', 'test-oauth', 'http://aliyun-gts-gateway-pre.ingress.dayu.work', 'oauth2', 'oauth', 'http://aliyun-gts-gateway-pre.ingress.dayu.work/sso/password/toLogin?appCode=test', '');
INSERT INTO `sso_app_oauth_detail` VALUES ('1', 'AUTHORIZATION_CODE', 'http://aliyun-gts-sso-integration-pre.ingress.dayu.work/sso/oauth?appCode=test-idaas', '7e455ca863992197f1c78934c61bab56b2dZqzcrS8k', '11R4M9NcWufM8VrlJPguT2HcR7aQflBuEWsVGlHJvl', 'https://ythrgnwpev.login.aliyunidaas.com/oauth/token', 'https://ythrgnwpev.login.aliyunidaas.com/api/bff/v1.2/oauth2/userinfo', null, null, null, null, '0', 'test-idaas');
INSERT INTO `sso_app_oauth_detail` VALUES ('2', 'PASSWORD', null, 'client', 'secret', 'http://172.21.8.65:8080/oauth/token', 'http://172.21.8.65:8080/oauth/userinfo', null, null, null, null, '0', 'test-oauth');

1.2准备Redis实例

1.3获取部署脚本与jar

aliyun-gts-sso-manage-boot.zip
或者从代码库中拉下代码,进行构建。

1.4修改配置文件

  • 如果是zip文件,解压,并修改conf中的配置文件,填写上述部署的redis连接信息和数据库连接信息。
  • 如果是源代码构建,修改代码中的application.yml文件,填写上述部署的redis连接信息和数据库连接信息。
  • 如果配置是防止在nacos中,请填写nacos的内网地址。

1.5 公共配置

#应用启动端口
server.port=8080

#数据源配置
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/common_login?serverTimezone=GMT%2B8
spring.datasource.username=root
spring.datasource.password=123456

#缓存配置
gts.cache.type=redis
gts.cache.host=127.0.0.1
gts.cache.auth=123456
gts.cache.port=6379
gts.cache.database=0

1.6 CAS相关配置说明

application.properties


##cas配置

# 开启cas认证模式
gts.sso.type=cas
#cas服务端前缀地址
gts.sso.server-url-prefix=http://cas-server-ip:port/cas
#cas服务端登录地址
gts.sso.server-login-url=http://cas-server-ip:port/cas/login
#sso服务端地址(保证cas服务端可见)
gts.sso.client-host-url=http://sso-manager-server
#cas协议校验类型,支持cas和cas3两种类型 
gts.sso.validation-type=cas
#cas无需验证的url,以下两个是通用登录服务内部的三个接口,必须要配置
gts.sso.ignore-pattern=/getAppInfoByCode|/oauth|/getUserInfo
#token的存储方式,支持jwt和redis两种方式
sso.token.store-type=jwt
#token过期时间/秒
sso.token.expired-in-seconds=5

1.7 IDaaS相关配置说明

  • application.properties文件的配置
#token的存储方式,支持jwt和redis两种方式
sso.token.store-type=jwt
#token过期时间/秒
sso.token.expired-in-seconds=5

1.8 OAuth密码模式相关配置说明

  • application.properties文件的配置
#token的存储方式,支持jwt和redis两种方式
sso.token.store-type=jwt
#token过期时间/秒
sso.token.expired-in-seconds=5

1.9 启动服务

如果是zip文件下载,请使用bin子目录中的start.sh进行启动。
注意:linux环境下启动.sh脚本时,需要给启动文件授权可执行权限。执行命令:

chmod 777 *.sh



2 网关接入配置(Spring Cloud Gateway)

a.pom.xml 引入maven依赖

<dependency>
    <groupId>com.aliyun.gts.bpaas</groupId>
    <artifactId>aliyun-gts-sso-client</artifactId>
    <version>1.0.0-SNAPSHOT</version>
</dependency>

b.配置application.yml

gts:
  sso:
    client:
        #启用客户端
      enable: true
      #sso服务端地址(这里的地址要配置成sso-manager的内网地址)
      server-url: http://sso-manager-ip:port
      #服务appCode
      app-code: test
      #登陆忽略访问路径
      login-ignores: /**/ignores/**
#固定路由配置      
spring:
  cloud:
    gateway:
      routes:
        - id: sso_client
          uri: http://127.0.0.1:${server.port} 
          predicates:
            - Path=/ssoclient/user/**
          filters:
            - StripPrefix=1      

3 前端的接入

a.接入登陆页:

前端在访问资源接口时,接收到UNAUTHORIZED的响应后,重定向到响应体返回的url,响应结果示例:

{"code":"UNAUTHORIZED","data":"http://139.224.247.5:8080/cas/login?service=http://aliyun-gts-sso-integration-pre.ingress.dayu.work/sso/cas?appCode=data-exchange-server%26callBackUrl%3D%2F","message":"unauthorized","requestId":"d4a31e95-1db6-4167-9e09-273b4a64d9a2","success":false}

b.指定登陆成功返回页面PTAH

在接入登陆页时,修改UNAUTHORIZED响应返回的url的callBackUrl参数为该页面path,再进行重定向,参考代码如下:

 function getNewUrl(url,path) {
    const tmp = url.split('callBackUrl%3D');
    return tmp[0] + 'callBackUrl%3D'+ path;
 }

c.接收token:

前端需要在获取到转发请求以后,从redirect的地址栏中获取token,存储到local-storage,用于接下来请求的发送。请求资源时,"token"放置于请求头。例如:

headers.token = eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJhdWQiOiJ7XCJ1c2VyTmFtZVwiOlwiYWRtaW5cIn0iLCJleHAiOjE2MDY5OTc5ODAsImlhdCI6MTYwNjk3OTk4MH0.hdZhUAbarIpI6bYTLRNMEKJq5I-OS466lRziJdovDw8

d.获取用户基本信息

登陆成功后,可通过网关侧client内嵌web接口获取用户基本信息内容。接口详情:

接口PATH 请求方式 请求头信息 请求参数
/ssoclient/user/getUserInfo GET 登陆成功获取到的token

返回参数格式:

{"requestId":"8959ea09-2636-4f85-b741-e8fb365dc7c1","code":"","message":"success","success":true,"meta":null,"data":{"userName":"admin","userCode":null}}

e.用户登出(CAS模式)

网关侧client登出接口信息:

认证模式 接口PATH 请求方式 请求头信息 请求参数
CAS /sso/logout GET 登陆成功获取到的token service,用于指定登出后跳转页面url

登出后跳转到xxx.com,登出url示例:

http://aliyun-gts-gateway-pre.ingress.dayu.work/sso/logout?service=http://xxx.com

返回参数格式:

{"requestId":"50abd28d-86da-4078-8974-e46980540477","code":"","message":"success","success":true,"meta":null,"data":"http://139.224.247.5:8080/cas/logout?service=http%3A%2F%2Fxxx.com"}

前端重定向到:http://139.224.247.5:8080/cas/logout?service=http%3A%2F%2Fxxx.com 即可完成登出。


_

4. 启动测试

3.1 准备工作

a.启动Spring Cloud Gateway
b.启动sso-manager-server
c.启动CAS服务端、oauth服务端 、阿里云开通IDaas服务
d.启动Mysql
e.启动Redis

3.2 CAS,IDaaS,Oauth密码模式测试

  1. 连接mysql,后续测试的时候,要修改该mysql的common_login数据库中sso_app,sso_app_oauth_detail表的相关数据
  2. 连接redis,后续切换模式测试的时候,要清redis的缓存,key为: sso::app::test

3.2.1 CAS模式

  1. 因为获取到的app信息会存到缓存中,而为了方便演示(不然要每次修改网关的appCode,然后重启,我们用的appCode都是叫test,所以每次换模式演示的时候都要先清一下redis,key为: sso::app::test
  1. 修改数据库表sso_app中字段app_name是test-cas的app_code为test

image.png

  1. 访问资源地址: http://aliyun-gts-gateway-pre.ingress.dayu.work/gateway/getUserInfo,没有登录,data中会返回的是登录地址

image.png

  1. 浏览器访问登录地址

image.png
image.png

  1. 输入CAS用户名和密码并点击登录,就能够访问到资源(资源返回的是用户信息)

image.png
注意到url中的参数token,前端需要获取该token,用于接下来的访问。

3.2.2 IDaaS模式

  1. 因为获取到的app信息会存到缓存中,而为了方便演示(不然要每次修改网关的appCode,然后重启),我们用的appCode都是叫test,所以每次换模式演示的时候都要先清一下redis,key为: sso::app::test
  2. 修改sso_app表中app_name是test-idaas的app_code为test,注意要把刚才测试cas模式的app_code改为test-cas(app_code是唯一的)

image.png

  1. 修改sso_app_oauth_detail表中app_code是test-idaas修改为test

image.png

  1. 访问资源地址: http://aliyun-gts-gateway-pre.ingress.dayu.work/gateway/getUserInfo,没有登录,data中会返回的是登录地址,访问登录地址

image.png
image.png

  1. 输入IDaas用户名和密码,点击登录,就能够访问到资源(资源返回的是用户信息)

image.png

2.2.3 Oauth密码模式

  1. 因为获取到的app信息会存到缓存中,而为了方便演示(不然要每次修改网关的appCode,然后重启),我们用的appCode都是叫test,所以每次换模式演示的时候都要先清一下redis,key为: sso::app::test
  2. 修改sso_app表中app_name是test-oauth的app_code为test,注意要把刚才测试idaas模式的app_code改为test-idaas(app_code是唯一的)

image.png

  1. 修改sso_app_oauth_detail表中app_code是test-oauth修改为test

image.png

  1. 访问资源地址: http://aliyun-gts-gateway-pre.ingress.dayu.work/gateway/getUserInfo,没有登录,data中会返回的是登录地址,访问登录地址

image.png
image.png

  1. 输入oauth-server用户名和密码,点击登录,就能够访问到资源(资源返回的是用户信息)

image.png

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
存储 前端开发 PHP
构建一个简单的网站,包括用户注册、登录功能
构建一个简单的网站,包括用户注册、登录功能
390 1
|
移动开发 前端开发 JavaScript
一些框架获取当前登录用户以及用户信息整理
无论是哪一个框架,获取当前登录用户信息是必不可少的,做一些功能的时候我们肯定得用到当前登陆者信息,所以我就查找了一下几个框架是如何获取当前用户信息,例如在若依框架中,用 this.$store.state.user就可以获取到。当获得的信息是极少时,不足够我们做其他功能时,当然你也可以自己在这个获取的基础上面增加所需信息即可。
一些框架获取当前登录用户以及用户信息整理
|
8月前
|
SQL 关系型数据库 MySQL
MySQL数据库基础练习系列13、用户注册与登录系统
MySQL数据库基础练习系列13、用户注册与登录系统
62 1
|
存储 安全 关系型数据库
通用密钥,无需密码,在无密码元年实现Passkeys通用密钥登录(基于Django4.2/Python3.10)
毋庸讳言,密码是极其伟大的发明,但拜病毒和黑客所赐,一旦密码泄露,我们就得绞尽脑汁再想另外一个密码,但记忆力并不是一个靠谱的东西,一旦遗忘密码,也会造成严重的后果,2023年业界巨头Google已经率先支持了Passkeys登录方式,只须在设备上利用PIN码解锁、指纹或面部辨识等生物识别方式,即可验证身份,也就是说,可以和密码说拜拜了。
通用密钥,无需密码,在无密码元年实现Passkeys通用密钥登录(基于Django4.2/Python3.10)
|
存储 SQL JSON
用户登录设计及免密登录的通用思路
完整的用户登录设计及免密登录的通用思路。涉及到了SQL表单创建、Mapper接口、Service接口、Controller接口。其中还讲述了如何统一的响应体,保持前后端友好开发;以及持久化token。
793 0
|
PHP
laravel-admin 自定义登陆逻辑,补充原有账号密码登录
laravel-admin 自定义登陆逻辑,补充原有账号密码登录
382 0
|
小程序 JavaScript 计算机视觉
无需交 300 元认证费,快速创建已认证的小程序
快速创建小程序接口优化了小程序注册认证的流程,能帮助第三方平台迅速拓展线下商户,拓展商户的服务范围,占领小程序线下商业先机。采用法人人脸识别方式替代小额打款等认证流程,极大的减轻了小程序主体、类目资质信息收集的人力成本。通过该接口创建小程序默认为“已认证”。为降低接入小程序的成本门槛,通过该接口创建的小程序无需交 300 元认证费。
181 0
无需交 300 元认证费,快速创建已认证的小程序
|
JavaScript 前端开发 数据安全/隐私保护
前端案例:简易登录表单的制作,包括用户名、密码、随机验证码(代码完整,复制即用)
前端案例:简易登录表单的制作,包括用户名、密码、随机验证码(代码完整,复制即用)
575 0
|
Java 数据库 数据安全/隐私保护
用户模块之登录功能 | 学习笔记
快速学习用户模块之登录功能
241 0
|
存储 自然语言处理 前端开发
通用登陆(上)
登陆代理服务