本文目标
带领读者对Spring Security OAuth2框架的授权码模式有一个比较直观的概念,能使用框架搭建授权码模式授权服务器与资源服务器(分离版本)
授权码模式流程回顾
授权码模式要求:用户登录并对第三方应用(客户端)进行授权,出示授权码交给客户端,客户端凭授权码换取access_token(访问凭证)
此模式要求授权服务器与用户直接交互,在此过程中,第三方应用是无法获取到用户输入的密码等信息的,这个模式也是OAuth 2.0中最安全的一个
Demo基本结构
这里主要关注authorization-code-authorization-server
与authorization-code-resource-server
这两个模块
本文以及后续文章的demo均放在GitHub上,欢迎大家Star & Fork,源码地址:GitHub - hellxz/spring-security-oauth2-learn: 基于Spring Security OAuth2 5.0以下版本的写法的学习代码
authorization-code-client-resttemplate-jdbc
这个项目是用来测试非OAuth2服务使用RestTemplate与JdbcTemplate对接OAuth2授权服务的,流程这里不讲,有兴趣可以debug看看,可能会让您对整个流程会有更清晰的感受
Maven依赖
<!--Spring Security--> |
|
<dependency> |
|
<groupId>org.springframework.boot</groupId> |
|
<artifactId>spring-boot-starter-security</artifactId> |
|
</dependency> |
|
<!--Spring Boot Starter Web 所有demo均使用web--> |
|
<dependency> |
|
<groupId>org.springframework.boot</groupId> |
|
<artifactId>spring-boot-starter-web</artifactId> |
|
</dependency> |
|
<!-- Spring Security OAuth2 --> |
|
<dependency> |
|
<groupId>org.springframework.security.oauth</groupId> |
|
<artifactId>spring-security-oauth2</artifactId> |
|
<version>${spring-security-oauth2.version}</version> |
|
</dependency> |
搭建授权服务器(Authorization Server)
文中服务器均使用demo级别配置,请勿直接使用到生产环境
授权服务器结构主体如下:
启动类自不多说,先说下SecurityConfig
package com.github.hellxz.oauth2.config; |
|
import org.springframework.context.annotation.Bean; |
|
import org.springframework.context.annotation.Configuration; |
|
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; |
|
import org.springframework.security.config.annotation.web.builders.HttpSecurity; |
|
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; |
|
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; |
|
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; |
|
import org.springframework.security.crypto.password.PasswordEncoder; |
|
import java.util.Collections; |
|
@Configuration |
|
@EnableWebSecurity |
|
public class SecurityConfig extends WebSecurityConfigurerAdapter {
|
|
@Bean |
|