實現「第三方賬號密碼授權登錄」:資源擁有者(用戶)授權客戶端(第三方應用)訪問受保護資源。採用 Resource Owner Password Credentials Grant 流程,客戶端攜帶 client_id/secret + 用戶名密碼換取 access_token,再攜帶 Token 訪問受保護 API。
<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>
<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>
authenticationManager:驗證用戶名密碼(JDBC 查詢)。oauth2AuthenticationManager:驗證 client_id/secret(基於 ClientDetailsUserDetailsService)。mobile_1/secret_1,授權類型 password, authorization_code, refresh_token, implicit,作用域 read,write,trust。InMemoryTokenStore + 自定義 MyTokenService extends DefaultTokenServices。
accessTokenValiditySeconds=10(演示用)。supportRefreshToken=false、reuseRefreshToken=true。createAccessToken() 生成無連字符 UUID。/oauth/token:ClientCredentialsTokenEndpointFilter 解析表單參數中的 client 憑證。AuthorizationServer:開啟 password、refresh_token 等授權類型。ResourceServer:保護 /json/**(需 ROLE_USER)、/admin/**(需 SCOPE_READ + ROLE_ADMIN)。UnanimousBased + ScopeVoter/RoleVoter/AuthenticatedVoter,多條件為「與」關係(與 Spring Security 原生「或」不同)。| 操作 | 請求示例 |
|---|---|
| 獲取 Token | POST /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 |
| 刷新 Token | POST /oauth/token?grant_type=refresh_token&refresh_token=xxx&client_id=mobile_1&client_secret=secret_1 |
完整源碼:百度網盤。此配置展示了 OAuth2 授權碼、密碼、刷新令牌等核心流程的 Spring XML 實現,適合快速搭建授權服務器原型。