OAuth2 是一种用于保护 API 的标准协议,它提供了一种授权机制,允许应用程序代表用户请求资源。
配置OAuth2认证服务器
OAuth2 认证服务器是一种授权服务器,用于验证用户身份并授权给客户端访问资源。下面是配置 OAuth2 认证服务器的步骤:
1. 添加依赖
在 Spring Boot 项目的 pom.xml 文件中添加 Spring Security OAuth2 的依赖:
代码语言:javascript复制<dependency>
<groupId>org.springframework.security.oauth</groupId>
<artifactId>spring-security-oauth2</artifactId>
</dependency>
2. 配置认证服务器
在 Spring Boot 项目的 application.yml 或 application.properties 文件中添加 OAuth2 认证服务器的配置:
代码语言:javascript复制security:
oauth2:
client:
clientId: clientapp
clientSecret: secret
authorizedGrantTypes: authorization_code,refresh_token,password
scopes: openid,read,write
authorization:
tokenKeyAccess: hasAuthority('ROLE_TRUSTED_CLIENT')
checkTokenAccess: hasAuthority('ROLE_TRUSTED_CLIENT')
这里我们配置了一个 OAuth2 客户端,包括客户端 ID、客户端密钥、授权类型和范围。
3. 创建授权服务器
创建一个授权服务器类,继承 AuthorizationServerConfigurerAdapter 类,实现其中的 configure() 方法。
代码语言:javascript复制@Configuration
@EnableAuthorizationServer
public class AuthorizationServerConfig extends AuthorizationServerConfigurerAdapter {
@Autowired
private AuthenticationManager authenticationManager;
@Override
public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
clients
.inMemory()
.withClient("clientapp")
.secret("{noop}secret")
.authorizedGrantTypes("password", "refresh_token")
.scopes("openid", "read", "write")
.accessTokenValiditySeconds(120)
.refreshTokenValiditySeconds(600);
}
@Override
public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
endpoints
.authenticationManager(authenticationManager)
.tokenStore(tokenStore())
.accessTokenConverter(accessTokenConverter());
}
@Bean
public TokenStore tokenStore() {
return new InMemoryTokenStore();
}
@Bean
public JwtAccessTokenConverter accessTokenConverter() {
JwtAccessTokenConverter converter = new JwtAccessTokenConverter();
converter.setSigningKey("123456");
return converter;
}
}
这里我们配置了一个内存中的客户端,包括客户端 ID、客户端密钥、授权类型和范围。然后我们还配置了授权服务器端点,包括认证管理器、令牌存储和访问令牌转换器。
4. 创建资源服务器
创建一个资源服务器类,继承 ResourceServerConfigurerAdapter 类,实现其中的 configure() 方法。
代码语言:javascript复制@Configuration
@EnableResourceServer
public class ResourceServerConfig extends ResourceServerConfigurerAdapter {
@Override
public void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/api/**").authenticated()
.and()
.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
.and()
.csrf().disable();
}
@Override
public void configure(ResourceServerSecurityConfigurer resources) throws Exception {
resources.resourceId("resource-server-rest-api").stateless(true);
}
}
这里我们配置了一个资源服务器类,使用了 @EnableResourceServer 注解启用了资源服务器,并实现了其中的 configure() 方法和 configure(ResourceServerSecurityConfigurer resources) 方法。其中,configure() 方法用于配置 HTTP 安全策略,这里只允许 /api/** 的 URL 路径访问,而且必须经过身份验证。configure(ResourceServerSecurityConfigurer resources) 方法用于配置资源服务器的安全性,这里我们设置了资源 ID,并设置资源服务器为无状态(stateless)。
这样,我们就完成了 OAuth2 认证服务器和资源服务器的配置。