Class ScopeJwtAuthenticationConverter

java.lang.Object
io.leandev.appfuse.security.resourceserver.ScopeJwtAuthenticationConverter
All Implemented Interfaces:
org.springframework.core.convert.converter.Converter<org.springframework.security.oauth2.jwt.Jwt, org.springframework.security.authentication.AbstractAuthenticationToken>

public class ScopeJwtAuthenticationConverter extends Object implements org.springframework.core.convert.converter.Converter<org.springframework.security.oauth2.jwt.Jwt, org.springframework.security.authentication.AbstractAuthenticationToken>

FEDERATED 模式的 JWT → Authentication 轉換器

驗證外部企業 IdP(Keycloak/Okta,OIDC)簽發的 token。授權資訊來自 IdP 的 claim,對映到與自簽 token 同一套 resource:action 權限詞彙(ADR-009 點 2):

  • scope / scp claim(OAuth2 標準,空白分隔字串或字串陣列)→ 原樣作為 GrantedAuthority不加 SCOPE_ 前綴),如 order:read scope → order:read authority,直接滿足 @PreAuthorize("hasAuthority('order:read')")。此半由 Spring 內建 JwtGrantedAuthoritiesConverter 承擔(claim 名留預設,即依序試 scope / scp)。
  • roles claim(預設 roles)→ ROLE_*(供 hasRole(...) 型端點規則),已帶 ROLE_ 前綴者不重複加。IdP 端須以同一套詞彙設定 scope / role。

本類仍存在的理由:Spring 的轉換器一次只對映一個 claim × 一種前綴;此處需要 「兩個 claim、兩種前綴、且 roles 帶前綴守衛」的合併,故保留一層薄組合——但 scope 的 claim 探詢與切分已交還框架,不再自行剖析。

principal 保持為 Jwt,租戶由 JwtClaimTenantIdResolvertenantId claim 解析(與 STANDALONE 共用,見 ADR-009 與 ADR-001)。

  • Constructor Details

    • ScopeJwtAuthenticationConverter

      public ScopeJwtAuthenticationConverter()
      以預設 roles claim 名稱(roles)建立轉換器
    • ScopeJwtAuthenticationConverter

      public ScopeJwtAuthenticationConverter(String rolesClaim)
      Parameters:
      rolesClaim - IdP token 內角色 claim 的名稱;null 或空白表示不對映角色
  • Method Details

    • convert

      public org.springframework.security.authentication.AbstractAuthenticationToken convert(org.springframework.security.oauth2.jwt.Jwt jwt)
      Specified by:
      convert in interface org.springframework.core.convert.converter.Converter<org.springframework.security.oauth2.jwt.Jwt, org.springframework.security.authentication.AbstractAuthenticationToken>