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,结果不允许访问,结果如下:
获取下token:
携带token再次访问http://localhost:9001/test,就可以正常访问了,结果如下:
我们知道,资源服务器的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进行权限控制,之后用到再研究下。
推荐阅读
-
Spring Cloud下基于OAUTH2认证授权的实现示例
-
Spring Cloud实战 | 最终篇:Spring Cloud Gateway+Spring Security OAuth2集成统一认证授权平台下实现注销使JWT失效方案
-
Spring Cloud下基于OAUTH2认证授权(二)
-
Spring Cloud下基于OAUTH2认证授权(四)
-
Spring Cloud:认证 授权 OAuth2、JWT
-
Spring Cloud下基于OAUTH2认证授权的实现示例
-
Spring Cloud 入门 ---- OAuth2 分布式认证授权【随笔】
-
Spring Cloud下基于OAUTH2认证授权的实现
-
Spring Cloud 入门 ---- Security 整合 Oauth2 认证授权【随笔】
-
Spring Cloud下基于OAUTH2认证授权的实现