資安

通用登陸(下)

接入配置

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

Leave a Reply

Your email address will not be published. Required fields are marked *