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網關服務配置信息

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配置信息

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文件

用戶名:admin@163.com 密碼:admin

blob.png

blob.png

注:本文著作權歸作者,由demo大師發表,拒絕轉載,轉載需要作者授權

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM