欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Spring Cloud下基于OAUTH2认证授权(二)

程序员文章站 2022-06-13 15:57:41
...

写在前面:各位看到此博客的小伙伴,如有不对的地方请及时通过私信我或者评论此博客的方式指出,以免误人子弟。多谢!   

  上一篇介绍了一些基本的概念及大致的使用流程,现在就通过代码记录下基于oauth2的使用,首先导入依赖包,

<dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-oauth2</artifactId>
</dependency>

然后配置一下授权服务器,完整代码如下:

@Configuration
@EnableAuthorizationServer
public class CustomAuthorizationServer extends AuthorizationServerConfigurerAdapter {

    @Autowired
    private DataSource dataSource;
   

    @Override
    public void configure(AuthorizationServerSecurityConfigurer security) throws Exception {
        security.allowFormAuthenticationForClients();
              
    }

    @Override
    public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
        clients.withClientDetails(clientDetails());
    }


    @Override
    public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
        endpoints.tokenStore(tokenStore());
               
    }

    @Bean
    public ClientDetailsService clientDetails() {
        return new JdbcClientDetailsService(dataSource);
    }

    @Bean
    public TokenStore tokenStore() {
        return new JdbcTokenStore(dataSource);
    }

}

如上:简单配置了一下客户端详情,并且客户端信息是记录到数据库中的,需要从数据库中获取客户端信息;端点配置中只设置了token的存储方式,我将token存到数据库中;security配置只开启了允许表单认证和开启/oauth/check_token验证端口认证权限访问。

然后配置一下资源服务器,完整代码如下:

@Configuration
@EnableResourceServer
public class CustomResourceServer extends ResourceServerConfigurerAdapter {

    private static final String DEMO_RESOURCE_ID = "oauth-server";

    @Override
    public void configure(ResourceServerSecurityConfigurer resources) throws Exception {
        resources.resourceId(DEMO_RESOURCE_ID)
                .stateless(true);
    }

   
    @Override
    public void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests().anyRequest().authenticated();
    }

}

如上:HttpSecurity就是用默认的配置,默认情况下不在/oauth/**下的资源都是受保护的资源。

新建测试类:

@RestController
public class TestController {

    @RequestMapping(value = "/test")
    public String test() {
        return "oauth";
    }
    
}

使用postman测试:

访问http://localhost:9001/test,结果不允许访问,结果如下:

Spring Cloud下基于OAUTH2认证授权(二)

获取下token:

Spring Cloud下基于OAUTH2认证授权(二)

携带token再次访问http://localhost:9001/test,就可以正常访问了,结果如下:

Spring Cloud下基于OAUTH2认证授权(二)

我们知道,资源服务器的HttpSecurity配置可以控制资源的访问,在测试类中添加一个测试方法并修改HttpSecurity配置测试一下,测试类代码如下:

@RestController
public class TestController {


    @RequestMapping(value = "/test")
    public String test() {
        return "oauth";
    }

    @RequestMapping("/api/test")
    public String test1() {
        return "13579";
    }

}

HttpSecurity配置改为:

http .requestMatchers().antMatchers("/api/**", "/test")
                .and().authorizeRequests().antMatchers("/api/**").authenticated()
                .and().authorizeRequests().antMatchers("/test").permitAll();

测试发现访问/test可以直接访问,访问/api/test需要授权后才能访问,达到了控制资源访问的目的,通常我们在用spring boot 配合spring security和oauth2的时候经常会配合WebSecurityConfig使用,他们两者可以相互配合来对不同的Url进行权限控制,之后用到再研究下。