1. 程式人生 > >spring cloud單點登入

spring cloud單點登入

概述

基於springcloud的單點登入服務及基於zuul的閘道器服務(解決了通過zuul轉發到認證服務之後session丟失問題)

詳細

一、準備工作

學習前請先系統的學習一下eureka、zuul、spring security,否則上手可能會比較困難,我當時買的《springcloud微服務實戰》,這本書寫的還不錯。

該專案基於springcloud Dalston.SR1。因公司決定使用spring cloud,前期做認證服務時發現通過zuul閘道器把請求轉發到認證服務之後session丟失,一直報csrf驗證失敗問題,網上的大部分資料也不靠譜,通過研究解決掉該問題,特做了一個例子,供大家參考

二、專案截圖

blob.png

blob.png

blob.png

三、各個服務說明

① 服務註冊(基於eureka):專案名稱:service-registry-server 埠號:8761

啟動類:cn.com.springcloudtest.cloud.service.registry.ServiceRegistryServerApplication

② 閘道器服務(基於zuul): 專案名稱:api-gateway-server 埠號:8080

啟動類:cn.com.springcloudtest.cloud.api.gateway.ApiGatewayServerApplication

③ 認證服務(基於oauth2及spring security): 專案名稱:uaa-server 埠號:7769

啟動類:cn.com.springcloudtest.cloud.uaa.UaaServerApplication

認證服務使用redis儲存了session,客戶端保存於mysql資料庫

四、配置檔案說明

有些配置作者也沒全部搞明白,網上找的設定,但是這麼設定確定是沒問題的

① service-registry-server服務註冊配置資訊不再過多描述,標準用法

② api-gateway-server閘道器服務配置資訊

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

spring:

  aop: #aop代理

    proxyTargetClass: true

  application:

    name: api-gateway-server

 

server:

  port: 8080

  tomcat:

    uri-encoding: UTF-8

 

#服務註冊

eureka:

  client:

    serviceUrl:

      defaultZone: http://127.0.0.1:8761/eureka/

#  server:

#    enable-self-preservation: false  #關閉eureka自我保護,生產環境不建議關閉自我保護

 

#認證中心index頁面地址,如果直接登入認證中心則會跳轉到該地址

uaa.server.index-path: /uaa/index

#認證中心跳轉路徑字首

uaa.server.service.path: /uaa/**

#不走認證的url集合

http.authorize.matchers: /**/css/**,/**/styles/**,/**/js/**,/**/plugin/**,/**/plugins/**,/**/template/**,/**/img/**,/**/fonts/**,/**/cvr100u/**,/css/**,/js/**,/plugin/**,/template/**,/img/**,/fonts/**,/cvr100u/**

 

#閘道器資訊

zuul:

  routes:

    uaa-server:

      sensitiveHeaders: "*"  #敏感headers也支援全域性設定(必須這樣設定)

      path: ${uaa.server.service.path}

      stripPrefix: false

  add-proxy-headers: true  #X-Forwarder-Host請求頭預設新增到轉發請求中

 

#安全認證資訊

security:

  basic:

    enabled: false

  oauth2:

    sso:

      loginPath: /login

    client:

      accessTokenUri: http://127.0.0.1:7769/uaa/oauth/token

      userAuthorizationUri: /uaa/oauth/authorize

      clientId: acme

      clientSecret: acmesecret

    resource:

      jwt:

        keyValue: |

          -----BEGIN PUBLIC KEY-----

          MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAnGp/Q5lh0P8nPL21oMMrt2RrkT9AW5jgYwLfSUnJVc9G6uR3cXRRDCjHqWU5WYwivcF180A6CWp/ireQFFBNowgc5XaA0kPpzEtgsA5YsNX7iSnUibB004iBTfU9hZ2Rbsc8cWqynT0RyN4TP1RYVSeVKvMQk4GT1r7JCEC+TNu1ELmbNwMQyzKjsfBXyIOCFU/E94ktvsTZUHF4Oq44DBylCDsS1k7/sfZC2G5EU7Oz0mhG8+Uz6MSEQHtoIi6mc8u64Rwi3Z3tscuWG2ShtsUFuNSAFNkY7LkLn+/hxLCu2bNISMaESa8dG22CIMuIeRLVcAmEWEWH5EEforTg+QIDAQAB

          -----END PUBLIC KEY-----

      id: openid

      serviceId: ${PREFIX:}resource

③ uaa-server配置資訊

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

spring:

  application:

    name: uaa-server

  #資料庫連線資訊

  datasource:

    url: jdbc:mysql://localhost:3306/uaa?characterEncoding=UTF-8

    username: root

    password: root

    driver-class-name: com.mysql.jdbc.Driver

    max-idle: 5

    max-wait: 10000

    min-idle: 2

    initial-size: 3

    validation-query: SELECT 1

    time-between-eviction-runs-millis: 18800

    jdbc-interceptors: ConnectionState;SlowQueryReport(threshold=50)

  jpa:

    database: MYSQL

    show-sql: true

  #使用redis儲存session,redis服務地址

  redis:

    host: 127.0.0.1

    port: 6379

#不快取thymeleaf模板,開發環境下配置該屬性,生產環境下請勿配置

thymeleaf:

    cache: false

    cache-period: 0

template:

    cache: false

 

server:

  port: 7769

  context-path: /uaa   #認證服務上下文地址(必須配置)

  use-forward-headers: false

  tomcat:

    uri-encoding: UTF-8

 

#服務註冊

eureka:

  instance:

    preferIpAddress: true

  client:

    serviceUrl:

      defaultZone: http://127.0.0.1:8761/eureka/

 

security:

  basic:

    enabled: false

  user:

    password: password

  ignored: /css/**,/js/**,/favicon.ico,/webjars/**

  sessions: NEVER #永遠不自己建立session

 

#jwt資訊(自定義的屬性,AuthorizationServerConfigurer配置類中用到)

jwt:

  access:

    token:

      converter:

        resource:

          location: classpath:keystore.jks

          password: foobar

          key-pair-alias: test

     

#自定義的屬性,WebSecurityConfigurer配置類中用到

http:

  authorize:

    #不走認證的url集合

    matchers: /**/css/**,/**/js/**,/**/plugin/**,/**/template/**,/**/img/**,/**/fonts/**,/**/cvr100u/**,/css/**,/js/**,/plugin/**,/template/**,/img/**,/fonts/**,/cvr100u/**

  login:

    path: /login

五、java程式碼配置

①、api-gateway-server服務配置都集中在WebSecurityConfigurer類中,配置比較簡單

②、uaa-server服務配置都集中在AuthorizationServerConfigurer和WebSecurityConfigurer中,AuthorizationServerConfigurer是jwt相關的配置,WebSecurityConfigurer是安全相關的配置,重要的部分程式碼中已經做了註釋

六、專案執行效果

注:專案執行前請閱讀readme.txt檔案

使用者名稱:[email protected] 密碼:admin

blob.png

blob.png