springcloud gateway集成springsecuity进行认证和授权
时间: 2024-05-04 14:18:09 浏览: 168
Spring Cloud Gateway 是 Spring Cloud 的微服务网关,可以用来实现路由转发、请求过滤、熔断限流、认证授权等功能。而 Spring Security 是 Spring 的安全框架,可以实现用户认证、角色授权等功能。将两者结合起来,可以实现在网关层进行认证和授权,保护后端微服务的安全。
下面是 Spring Cloud Gateway 集成 Spring Security 进行认证和授权的步骤:
1. 引入依赖
在 pom.xml 文件中添加以下依赖:
```
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-security</artifactId>
</dependency>
```
2. 配置 Spring Security
在 Spring Security 的配置类中配置认证和授权规则,例如:
```
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
private UserDetailsService userDetailsService;
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers("/admin/**").hasRole("ADMIN")
.antMatchers("/user/**").hasAnyRole("ADMIN", "USER")
.anyRequest().authenticated()
.and()
.httpBasic();
}
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(userDetailsService);
}
}
```
3. 配置 GatewayFilterFactory
在 GatewayFilterFactory 中添加 Spring Security 的过滤器,例如:
```
@Component
public class AuthGatewayFilterFactory extends AbstractGatewayFilterFactory<AuthGatewayFilterFactory.Config> {
@Autowired
private ReactiveUserDetailsService userDetailsService;
public AuthGatewayFilterFactory() {
super(Config.class);
}
@Override
public GatewayFilter apply(Config config) {
return (exchange, chain) -> {
return exchange.getPrincipal()
.cast(Authentication.class)
.flatMap(auth -> authorizeRequest(exchange, chain, auth))
.switchIfEmpty(Mono.error(new AuthorizationDeniedException("Unauthorized")));
};
}
private Mono<Void> authorizeRequest(ServerWebExchange exchange, GatewayFilterChain chain, Authentication auth) {
AuthorizationDecision decision = new AuthorizationDecision(
auth.isAuthenticated() && auth.getAuthorities().stream()
.anyMatch(granted -> granted.getAuthority().equals("ROLE_ADMIN")));
return decision.isGranted() ? chain.filter(exchange) : Mono.error(new AuthorizationDeniedException("Unauthorized"));
}
public static class Config {
// 这里可以添加一些配置参数
}
}
```
其中,`AuthGatewayFilterFactory` 是一个自定义的 GatewayFilterFactory,用来添加 Spring Security 的过滤器。`authorizeRequest` 方法中实现了认证和授权的逻辑,判断用户是否有访问权限。
4. 配置路由规则
在 application.yml 文件中配置路由规则,例如:
```
spring:
cloud:
gateway:
routes:
- id: admin-service
uri: lb://admin-service
predicates:
- Path=/admin/**
filters:
- Auth=ROLE_ADMIN
- id: user-service
uri: lb://user-service
predicates:
- Path=/user/**
filters:
- Auth=ROLE_USER
```
其中,`Auth=ROLE_ADMIN` 和 `Auth=ROLE_USER` 是在 `AuthGatewayFilterFactory` 中添加的过滤器名称。
通过以上步骤,就可以实现 Spring Cloud Gateway 集成 Spring Security 进行认证和授权的功能。在路由转发之前,会先进行用户认证和授权,保护后端微服务的安全。
阅读全文