首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

Spring Security OAuth2 完整實戰:從 Maven 依賴到 Token 服務自定義

     編輯:Java 綜合教學

Spring Security OAuth2 完整實戰:從 Maven 依賴到 Token 服務自定義

一、 目標架構

實現「第三方賬號密碼授權登錄」:資源擁有者(用戶)授權客戶端(第三方應用)訪問受保護資源。採用 Resource Owner Password Credentials Grant 流程,客戶端攜帶 client_id/secret + 用戶名密碼換取 access_token,再攜帶 Token 訪問受保護 API。

二、 Maven 核心依賴

<properties>
    <spring.version>4.0.4.RELEASE</spring.version>
    <spring-security.version>3.2.4.RELEASE</spring-security.version>
    <spring-security-oauth2.version>2.0.2.RELEASE</spring-security-oauth2.version>
</properties>

<dependencies>
    <dependency><groupId>org.springframework.security.oauth</groupId>
        <artifactId>spring-security-oauth2</artifactId>
        <version>${spring-security-oauth2.version}</version></dependency>
    <dependency><groupId>org.springframework.security</groupId>
        <artifactId>spring-security-config</artifactId>
        <version>${spring-security.version}</version></dependency>
    <dependency><groupId>org.springframework.security</groupId>
        <artifactId>spring-security-taglibs</artifactId>
        <version>${spring-security.version}</version></dependency>
    <!-- Spring MVC, ORM, Hibernate, Jackson, MySQL, C3P0 等 -->
</dependencies>

三、 web.xml 關鍵配置

<filter>
    <filter-name>springSecurityFilterChain</filter-name>
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
    <filter-name>springSecurityFilterChain</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

<servlet>
    <servlet-name>spring-dispatcher</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
</servlet>

四、 applicationContext-security.xml 核心 Bean 解析

  1. 兩套 AuthenticationManager:
    • 默認 authenticationManager:驗證用戶名密碼(JDBC 查詢)。
    • oauth2AuthenticationManager:驗證 client_id/secret(基於 ClientDetailsUserDetailsService)。
  2. ClientDetails 配置:內存定義客戶端 mobile_1/secret_1,授權類型 password, authorization_code, refresh_token, implicit,作用域 read,write,trust。
  3. Token 存儲與服務:InMemoryTokenStore + 自定義 MyTokenService extends DefaultTokenServices。
    • 縮短 accessTokenValiditySeconds=10(演示用)。
    • 關閉 supportRefreshToken=false、reuseRefreshToken=true。
    • 重寫 createAccessToken() 生成無連字符 UUID。
  4. 端點與過濾器:
    • /oauth/token:ClientCredentialsTokenEndpointFilter 解析表單參數中的 client 憑證。
    • AuthorizationServer:開啟 password、refresh_token 等授權類型。
    • ResourceServer:保護 /json/**(需 ROLE_USER)、/admin/**(需 SCOPE_READ + ROLE_ADMIN)。
  5. 決策管理器:UnanimousBased + ScopeVoter/RoleVoter/AuthenticatedVoter,多條件為「與」關係(與 Spring Security 原生「或」不同)。

五、 關鍵接口測試

操作請求示例
獲取 TokenPOST /oauth/token?client_id=mobile_1&client_secret=secret_1&grant_type=password&username=aa&password=aa
響應{"access_token":"...","token_type":"bearer","refresh_token":"...","expires_in":43199,"scope":"read write trust"}
訪問資源GET /admin?access_token=xxx
刷新 TokenPOST /oauth/token?grant_type=refresh_token&refresh_token=xxx&client_id=mobile_1&client_secret=secret_1

完整源碼:百度網盤。此配置展示了 OAuth2 授權碼、密碼、刷新令牌等核心流程的 Spring XML 實現,適合快速搭建授權服務器原型。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved