Springboot实现OAuth2登录

初涉认证,觉得Spring Securty好神奇,注册几个接口,就可以完成认证和授权。本次的目标是实现OAuth2的登录。

OAuth2登录,依赖 Spring Security 5.0 。SpringBoot 2.0 中已经整合。

1. 引入依赖

首先,需要引入Spring Security相关的依赖:

<dependency>
    <groupId>org.springframework.bootgroupId>
    <artifactId>spring-boot-starter-securityartifactId>
dependency>

<dependency>
    <groupId>org.springframework.securitygroupId>
    <artifactId>spring-security-oauth2-clientartifactId>
dependency>

2. 注册认证方式

然后,创建类,说明要使用OAuth2认证:

@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
                .anyRequest().authenticated()
                .and()
                .oauth2Login()      // (1)
                .and()
                .logout()           // (2)
                .and()
                .csrf().disable();  // (3)
    }
}

类名随意,但必需继承WebSecurityConfigurerAdapter,并且重写void configure(HttpSecurity http)方法。还有一点,类需要使用@EnableWebSecurity注解。

  • (1) 使用OAuth2认证
  • (2) 支持logout
  • (3) 支持通过GET方法进行logout

这是最简单的实现。使用了Spring Security自带的Login页面。

3. 注册OAuth2客户端

@Configuration
public class OAuth2LoginConfig {
    @Bean
    public ClientRegistrationRepository clientRegistrationRepository() {
        return new InMemoryClientRegistrationRepository(aaaClientRegistration());
    }

    @Value("${spring.security.oauth2.client.registration.aaa.client-id}")
    private String clientId;

    @Value("${spring.security.oauth2.client.registration.aaa.client-secret}")
    private String clientSecret;

    private ClientRegistration aaaClientRegistration() {
        return ClientRegistration.withRegistrationId("aaa")  // (1)
                .clientId(clientId)  // (2)
                .clientSecret(clientSecret)  // (3)
                .clientAuthenticationMethod(ClientAuthenticationMethod.POST)  // (4)
                .redirectUriTemplate("{baseUrl}/login/oauth2/code/{registrationId}")  // (5)
                .clientName("AAA")       // (6)
                .tokenUri("http://your.provider.com/oauth/token")  // (7)
                .authorizationUri("http://your.provider.com/oauth/authorize")  // (8)
                .authorizationGrantType(AuthorizationGrantType.AUTHORIZATION_CODE)  // (9)
                .scope("api")  // (10)
                .userNameAttributeName("username")  // (11)
                .userInfoUri("http://your.provider.com/api/v3/user")  // (12)
                .jwkSetUri("")  // (13)
                .build();
    }
}

以Bean的形式,将ClientRegistrationRepository实例注入到Spring中。

  • (1) 指定服务的名称,例子中,是 aaa。这是个ID,名字随便取。主要用于区分环境中存在种OAuth2服务。
  • (2) clientId是服务分配的一个client_id,在OAuth2服务那里注册Application时分配
  • (3) clientSecret与clientId一样,由服务分配。这个例子里,使用了Springboot配置的值,主要目的是为了区分开发环境和生产环境。可以在服务那里注册2个Application,一个用于开发,一个用于上线。由于每个Application的clientId和clientSecret都不一样,所以使用从配置中读取的方式。
  • (4) 服务端支持的认证方式
  • (5) 服务端认证通过后,回调到本地的URL。这里的{baseUrl}{registrationId}是框架可以自己填的。{baseUrl}是本地应用的地址,如http://127.0.0.1{registrationId}则是(1)中使用的ID。在OAuth2服务那里注册Application时,需要填写这么一个回调地址。默认情况下,这个地址的格式必需是/login/oauth2/code/。所以,在这个例子中,在服务那里注册Application时,填写的回调地址必需是http://127.0.0.1//login/oauth2/code/aaa
  • (6) 随便写
  • (7) (8) (9) (10) (12) (13) 都是服务提供者那里给出的参数,照着填就行
  • (11) userInfoUri返回的json中,标识username的key。

4. 总结

输入任意地址均可跳转到登录页面:http://127.0.0.1:8080/login

登出页面是:http://127.0.0.1:8080/logout

这是个最简单的例子,login/logout的页面都是由框架自动生成的。且仅聚焦于OAuth2客户端的核心过程。

参考官方文档:https://docs.spring.io/spring-security/site/docs/5.0.7.RELEASE/reference/htmlsingle/

如果需要更多定制的能力,同样可以参考官方文档。

你可能感兴趣的:(Springboot实现OAuth2登录)