Spring Boot 2.x实战83 - Spring Security 7 -OAuth 2.0之Authorization Server(基于JWT)

本文详细介绍了如何在Spring Boot 2.x中配置OAuth 2.0 Authorization Server,包括JWT的使用。内容涵盖OAuth 2.0授权流程、Authorization Server的自动配置、用户配置、JWT配置以及Token的获取和刷新。同时,文章提到了新书《从企业级开发到云原生微服务:Spring Boot 实战》,涵盖了Spring Boot开发的多个方面。
摘要由CSDN通过智能技术生成

3 OAuth 2.0

OAuth 2.0是安全授权的工业标准协议,我们了解它需要理解下面的专用术语:
在这里插入图片描述

  • 交互参与方:

    • Client:需要访问Resource Sever受保护资源的应用;
    • Resource Owner :终端用户,Client通过终端用户进行不同类型的授权(Grant Type);
    • Authorization Server:提供访问授权的应用,Client使用某种Grant TypeAuthorization Server获取Access Token
    • Resource Sever:包含受保护资源的应用,Client使用Access Token访问Resource Server的受保护资源;
  • 授权类型 - Grant Type

    • Authorization Code:让用户访问Client页面时,页面打向Authorization Server的登录页面,登录后显示授权访问页面,授权成功后Client即可获得Access Token访问Resource Server
    • Password:通过提供提供用户名和密码获得Access Token,一般是给应用服务的客户端使用(IOS、Android、Web App)。
    • Client Credentials:Client通过Client Id和Client Secret直接向Authorization Server请求Access Token;它主要用于非用户参与的应用,如后台服务。
  • Token

    • Access Token:用来访问受保护资源的唯一令牌;
    • Refresh Token:当Access Token失效时,我们可以使用Refresh Token来获取一个新的Access Token,它的时效性要远远大于Access Token
    • JWT:JSON Web Token,它代表双方之间安全传输的信息;它使用数字签名,传输的信息可以被验证和信任。
3.1 OAuth 2.0 Authorization Server

新建应用,信息如下:

Group:top.wisely

Artifact:auth-server

Dependencies:Spring SecuritySpring Web StarterSpring Data JPAMySQL DriverLombok

build.gradle文件中的依赖如下:

dependencies {
   implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
   implementation 'org.springframework.boot:spring-boot-starter-security'
   implementation 'org.springframework.boot:spring-boot-starter-web'
   compileOnly 'org.projectlombok:lombok'
   compileOnly 'org.projectlombok:lombok'
   runtimeOnly 'mysql:mysql-connector-java'
   annotationProcessor 'org.projectlombok:lombok'
  //...
}

Spring Security不提供OAuth 2.0 Authorization Server的功能,我们使用spring-security-oauth2-autoconfigure来实现OAuth 2.0 Authorization Server的功能和配置。Spring Boot不提供spring-security-oauth2-autoconfigure版本的维护,需指定它的版本。

implementation 'org.springframework.security.oauth.boot:spring-security-oauth2-autoconfigure:2.2.X.RELEASE'
3.1.1 spring-security-oauth2-autoconfigure提供的自动配置

spring-security-oauth2-autoconfigure使用OAuth2AutoConfiguration导入了关于Authorization Server配置OAuth2AuthorizationServerConfiguration,他们通过AuthorizationServerPropertiessecurity.oauth2.authorization.*来进行定制配置。OAuth2AuthorizationServerConfiguration做了下面的配置:

  • AuthorizationServerConfigurerAdapter:继承此类通过重载其方法对进行配置。
    • configure(ClientDetailsServiceConfigurer clients):配置client的信息,可通过security.oauth2.client.*来配置,只支持配置一个。
    • configure(AuthorizationServerEndpointsConfigurer endpoints):配置Authorization Server端点的非安全特性。配置了TokenStoreAccessTokenConverter,若Grant Type为password则需设置AuthenticationManager
    • configure(AuthorizationServerSecurityConfigurer security):配置Authorization Server的安全性。
      • tokenKeyAccess:配置端点/oauth/token_key的访问安全,提供JWT编码的Token;通过security.oauth2.authorization.tokenKeyAccess来配置。
      • checkTokenAccess:配置端点/oauth/check_token的访问安全,解码Access Token用来检查和确认生成的token;通过security.oauth2.authorization.checkTokenAccess来配置。
  • 导入AuthorizationServerTokenServicesConfiguration:配置JWT。
    • TokenStore:用来生成和获取token;自动配置了JwtTokenStore的Bean;
    • AccessTokenConverter:将access token转换成不同的格式;自动配置了JwtAccessTokenConverter转换成JWT格式。
3.1.2 获取用户配置

Authorization Server要获取终端用户,来获取用户相关信息。我们沿用上节的SysAuthoritySysRoleSysUserSysAuthorityRepository
SysRoleRepositorySysUserRepositoryCusotmUserDetailsService。我们的配置如下:

@Configuration
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
   
    @Autowired
    SysUserRepository sysUserRepository;
    @Bean
    protected UserDetailsService userDetailsService() {
   
        return new CusotmUserDetailsService(sysUserRepository);
    }

    @Bean
    PasswordEncoder passwordEncoder(){
   
        return new BCryptPasswordEncoder();
    }

    @Bean
    @Override //暴露authenticationManager Bean。
    protected AuthenticationManager authenticationManager() throws Exception 
`spring-boot-starter-oauth2-authorization-server`是Spring Boot提供的OAuth2认证服务器的Starter,可以用于构建安全的OAuth2认证授权服务器。 以下是使用`spring-boot-starter-oauth2-authorization-server`构建OAuth2认证服务器的简单步骤: 1. 添加依赖 在`pom.xml`文件中添加以下依赖: ``` <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-oauth2-authorization-server</artifactId> </dependency> ``` 2. 配置认证服务器 在`application.yml`文件中添加以下配置: ``` spring: security: oauth2: authorization: server: jwt: signing-key: mySecretKey client: registration: my-client: client-id: my-client client-secret: mySecret scope: - read - write redirect-uri-template: http://localhost:8080/login/oauth2/code/my-client authorization-grant-type: authorization_code client-name: My Client provider: my-authorization-server: authorization-uri: http://localhost:8080/oauth2/authorize token-uri: http://localhost:8080/oauth2/token user-info-uri: http://localhost:8080/oauth2/userinfo user-name-attribute: name ``` 其中,`jwt.signing-key`是用于签名JWT的密钥,`client.registration`用于配置客户端信息,`client.provider`用于配置认证服务器信息。 3. 启动认证服务器 在Spring Boot应用程序中添加`@EnableAuthorizationServer`注解,启动OAuth2认证服务器: ```java @SpringBootApplication @EnableAuthorizationServer public class OAuth2AuthorizationServerApplication { public static void main(String[] args) { SpringApplication.run(OAuth2AuthorizationServerApplication.class, args); } } ``` 以上就是使用`spring-boot-starter-oauth2-authorization-server`构建OAuth2认证服务器的简单步骤。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值