Class LoginService
登入引擎 capability(ADR-023)
login/refresh/logout 三操作的 orchestration。對帳號的全部需求以 AuthPrincipal 契約
+ AuthPrincipalLookup SPI 表達,不假設任何帳號結構;wire 面(HTTP mapping、DTO
形狀、例外 → RFC 7807 映射、使用者資訊查詢)歸消費端的 HTTP 殼。
login(String, String, String):authenticate → 互動式登入資格 → 登入政策 → 代行合併 → 簽發 access + opaque refreshrefreshSession(String):驗 server-side Session family → 重載當前權限重鑄(非 claim 複製)logout(String,String):撤銷 Refresh Session,並短效 blacklist 目前 access family
預期的 credential rejection 以保留實際原因的 AuthenticationException 家族表達;HTTP
揭露程度由消費端最後的 response policy 決定,基礎設施例外不得偽裝成 Session 失效。租戶 claim 經
TenantAwareUserDetails 探詢——principal 未實作即無租戶 claim。
組合:jar 不做 autoconfiguration(ADR-014),由消費端的組態(參考實作為
AuthInfrastructureConfig)以 @Bean 建立本類;全部依賴皆可由 Spring 建構子注入解析
(Optional<T> 依賴無 bean 時為 empty)。
-
Nested Class Summary
Nested ClassesModifier and TypeClassDescriptionstatic final record登入結果(引擎級——wire DTO 由消費端殼自 principal/acting 組裝)static final recordRefresh 成功後的引擎結果;replacement credential 由 HTTP 殼寫入 Cookie,不放入 wire body。 -
Constructor Summary
ConstructorsConstructorDescriptionLoginService(org.springframework.security.authentication.AuthenticationManager authenticationManager, JwtTokenProvider jwtTokenProvider, AuthPrincipalLookup principalLookup, TokenBlacklistStore tokenBlacklistStore, Optional<LoginActingContributor> actingContributor, Optional<LoginPolicy> loginPolicy) 建構子(全部參數皆可由 Spring 建構子注入解析)LoginService(org.springframework.security.authentication.AuthenticationManager authenticationManager, JwtTokenProvider jwtTokenProvider, AuthPrincipalLookup principalLookup, TokenBlacklistStore tokenBlacklistStore, Optional<LoginActingContributor> actingContributor, Optional<LoginPolicy> loginPolicy, RefreshSessionStore refreshSessionStore, RefreshCredentialCodec refreshCredentialCodec, Clock clock, SessionOptions defaultSessionOptions) 建立使用 server-side Refresh Session 的登入引擎。LoginService(org.springframework.security.authentication.AuthenticationManager authenticationManager, JwtTokenProvider jwtTokenProvider, AuthPrincipalLookup principalLookup, TokenBlacklistStore tokenBlacklistStore, Optional<LoginActingContributor> actingContributor, Optional<LoginPolicy> loginPolicy, RefreshSessionStore refreshSessionStore, RefreshCredentialCodec refreshCredentialCodec, Clock clock, SessionOptions defaultSessionOptions, RefreshSessionRotationMode refreshSessionRotationMode) 建立可明示 Refresh Credential 使用協定的 server-side Refresh Session 登入引擎。LoginService(org.springframework.security.authentication.AuthenticationManager authenticationManager, JwtTokenProvider jwtTokenProvider, AuthPrincipalLookup principalLookup, TokenBlacklistStore tokenBlacklistStore, Optional<LoginActingContributor> actingContributor, Optional<LoginPolicy> loginPolicy, RefreshSessionStore refreshSessionStore, RefreshCredentialCodec refreshCredentialCodec, Clock clock, SessionOptions defaultSessionOptions, RefreshSessionRotationMode refreshSessionRotationMode, Optional<SessionEligibilityPolicy> sessionEligibilityPolicy) 建立具 refresh-time 應用政策重新驗證的登入引擎。 -
Method Summary
Modifier and TypeMethodDescriptionexitImpersonation(String currentRefreshCredential, AuthPrincipal actor, String app) 結束 impersonation,沿用目前 family 的 remember/idle policy 換回 actor。issue(AuthPrincipal principal, String app) 為已由外部協定驗證完成的主體建立 app session。issue(AuthPrincipal principal, String app, SessionOptions sessionOptions) 登入:authenticate → 互動式登入資格 → 登入政策 → 代行合併 → 簽發login(String username, String password, String app, SessionOptions sessionOptions) 以應用建立的 credential token 登入。login(org.springframework.security.core.Authentication authenticationRequest, String app, SessionOptions sessionOptions) void登出:把 token 的 session 加入黑名單(同時失效 access 與 refresh token)並清除 contextvoid登出並撤銷 server-side Session family;Access Token blacklist 只保留即時撤銷用途。Deprecated.refreshSession(String refreshCredential) 以 opaque credential 驗證 Refresh Session,並依目前 principal 重鑄 Access Token。intrevokeSessionsByPolicy(String policy, String reference, String reason) 依應用政策識別主動撤銷所有相符 family,並立即 blacklist 其 Access Token family。switchToImpersonation(String currentRefreshCredential, AuthPrincipal target, String actorSubject, String app) 以目前 Session policy 切換到純 impersonation Session family。 current family 必須屬於 actor,且不可已在 impersonation 中。switchToImpersonation(String currentRefreshCredential, AuthPrincipal target, String actorSubject, String app, SessionOptions sessionOptions, SessionPolicyBinding policyBinding) 以明確 Session policy 與產品政策綁定切換到純 impersonation family。switchToImpersonation(String currentRefreshCredential, AuthPrincipal target, String actorSubject, String app, SessionPolicyBinding policyBinding) 沿用目前 family 的 remember/idle policy,並綁定 refresh-time 應用政策。
-
Constructor Details
-
LoginService
@Autowired public LoginService(org.springframework.security.authentication.AuthenticationManager authenticationManager, JwtTokenProvider jwtTokenProvider, AuthPrincipalLookup principalLookup, TokenBlacklistStore tokenBlacklistStore, Optional<LoginActingContributor> actingContributor, Optional<LoginPolicy> loginPolicy) 建構子(全部參數皆可由 Spring 建構子注入解析)- Parameters:
authenticationManager- 帳密認證(消費端組裝,含鎖定等 provider 堆疊)jwtTokenProvider- token 簽發與解析principalLookup- 主體查找 SPItokenBlacklistStore- session 黑名單儲存actingContributor- 代行貢獻點;無 bean 時 emptyloginPolicy- 登入把關政策;無 bean 時 empty = 放行
-
LoginService
public LoginService(org.springframework.security.authentication.AuthenticationManager authenticationManager, JwtTokenProvider jwtTokenProvider, AuthPrincipalLookup principalLookup, TokenBlacklistStore tokenBlacklistStore, Optional<LoginActingContributor> actingContributor, Optional<LoginPolicy> loginPolicy, RefreshSessionStore refreshSessionStore, RefreshCredentialCodec refreshCredentialCodec, Clock clock, SessionOptions defaultSessionOptions) 建立使用 server-side Refresh Session 的登入引擎。- Parameters:
refreshSessionStore- 持久化 Session family 的 app-owned adapterrefreshCredentialCodec- opaque credential 產生/雜湊 primitiveclock- 可測試的應用時鐘defaultSessionOptions- 舊簽章入口未明示 policy 時使用的產品預設
-
LoginService
public LoginService(org.springframework.security.authentication.AuthenticationManager authenticationManager, JwtTokenProvider jwtTokenProvider, AuthPrincipalLookup principalLookup, TokenBlacklistStore tokenBlacklistStore, Optional<LoginActingContributor> actingContributor, Optional<LoginPolicy> loginPolicy, RefreshSessionStore refreshSessionStore, RefreshCredentialCodec refreshCredentialCodec, Clock clock, SessionOptions defaultSessionOptions, RefreshSessionRotationMode refreshSessionRotationMode) 建立可明示 Refresh Credential 使用協定的 server-side Refresh Session 登入引擎。
RefreshSessionRotationMode.REUSABLE只應由消費端在開發環境明確啟用;框架本身不推測 部署環境,production-safe 驗證由擁有環境設定的 app 組裝層負責。 -
LoginService
public LoginService(org.springframework.security.authentication.AuthenticationManager authenticationManager, JwtTokenProvider jwtTokenProvider, AuthPrincipalLookup principalLookup, TokenBlacklistStore tokenBlacklistStore, Optional<LoginActingContributor> actingContributor, Optional<LoginPolicy> loginPolicy, RefreshSessionStore refreshSessionStore, RefreshCredentialCodec refreshCredentialCodec, Clock clock, SessionOptions defaultSessionOptions, RefreshSessionRotationMode refreshSessionRotationMode, Optional<SessionEligibilityPolicy> sessionEligibilityPolicy) 建立具 refresh-time 應用政策重新驗證的登入引擎。
-
-
Method Details
-
login
登入:authenticate → 互動式登入資格 → 登入政策 → 代行合併 → 簽發- Parameters:
username- 登入身分識別子password- 密碼app- 來源前端識別(登入政策用;可為 null)- Throws:
org.springframework.security.core.AuthenticationException- 認證、資格或政策拒絕;實際原因原樣傳播至 response policy
-
login
public LoginService.LoginResult login(String username, String password, String app, SessionOptions sessionOptions) -
login
public LoginService.LoginResult login(org.springframework.security.core.Authentication authenticationRequest, String app) 以應用建立的 credential token 登入。
應用的 wire model 若需要額外範圍(例如 tenant + username),應先解析成自己的
Authenticationrequest,再交給本方法;登入引擎因此不需要認識 tenant 或 DTO。 -
login
public LoginService.LoginResult login(org.springframework.security.core.Authentication authenticationRequest, String app, SessionOptions sessionOptions) -
issue
為已由外部協定驗證完成的主體建立 app session。
OIDC callback 先驗證 IdP response、完成 ExternalIdentity → Account 映射,再以本方法 簽發與 local login 完全相同的 app access token/opaque Refresh Credential。 主 API 因而只需信任 app JWT。
-
issue
public LoginService.LoginResult issue(AuthPrincipal principal, String app, SessionOptions sessionOptions) -
switchToImpersonation
public LoginService.LoginResult switchToImpersonation(String currentRefreshCredential, AuthPrincipal target, String actorSubject, String app) 以目前 Session policy 切換到純 impersonation Session family。 current family 必須屬於 actor,且不可已在 impersonation 中。 -
switchToImpersonation
public LoginService.LoginResult switchToImpersonation(String currentRefreshCredential, AuthPrincipal target, String actorSubject, String app, SessionPolicyBinding policyBinding) 沿用目前 family 的 remember/idle policy,並綁定 refresh-time 應用政策。 -
switchToImpersonation
public LoginService.LoginResult switchToImpersonation(String currentRefreshCredential, AuthPrincipal target, String actorSubject, String app, SessionOptions sessionOptions, SessionPolicyBinding policyBinding) 以明確 Session policy 與產品政策綁定切換到純 impersonation family。
sessionOptions可把 break-glass family 限縮為短效 non-remembered Session;policyBinding會隨 family 保存並於每次 refresh 重新驗證。 -
exitImpersonation
public LoginService.LoginResult exitImpersonation(String currentRefreshCredential, AuthPrincipal actor, String app) 結束 impersonation,沿用目前 family 的 remember/idle policy 換回 actor。 -
refreshSession
以 opaque credential 驗證 Refresh Session,並依目前 principal 重鑄 Access Token。
STRICT 成功回應輪替 credential;client 必須先以同源跨分頁鎖序列化 refresh。秘密 selector 讓舊 verifier 仍能定位 family,atomic compare-and-rotate 衝突即視為 replay 並 撤銷 family。REUSABLE 不輪替 credential,改以原子 credential-use 滑動 idle window,供 開發環境中無法共用 Web Lock 的 localhost origins 使用。Store/lookup 的基礎設施例外 原樣傳播,只有明確 Session rejection 轉為
BadCredentialsException。 -
revokeSessionsByPolicy
-
refresh
Deprecated.刷新 access token:驗證 → 黑名單檢查 → 重載當前權限重鑄- Returns:
- 新的 access token(帶最新 authorities)
- Throws:
org.springframework.security.authentication.BadCredentialsException- session 已撤銷(Session has been revoked)RefreshSessionRejectedException- token subject 查無或主體不符合 refresh 資格;訊息保留實際原因 其他底層例外原樣上拋,消費端不得映為 credential rejection
-
logout
登出:把 token 的 session 加入黑名單(同時失效 access 與 refresh token)並清除 context- Parameters:
token- 存取 token;null 表示呼叫端未附 token(僅清 context)
-
logout
-