2023-05-26 22:16:23

Spring Security是一个强大的安全框架,可以帮助开发人员轻松地实现各种安全功能。Nacos是阿里巴巴开源的一个动态服务发现、配置和管理平台。在Spring Security中使用Nacos动态配置接口白名单需要以下步骤:

  1. 添加Nacos客户端依赖

在pom.xml文件中添加以下依赖:

1
2
3
4
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
  1. 配置Nacos客户端

在application.properties或application.yml文件中添加以下配置:

1
2
3
4
spring.cloud.nacos.config.server-addr=${NACOS_SERVER_ADDR}
spring.cloud.nacos.config.namespace=${NACOS_NAMESPACE}
spring.cloud.nacos.config.group=${NACOS_CONFIG_GROUP}
spring.cloud.nacos.config.file-extension=${NACOS_CONFIG_FILE_EXTENSION}

其中,${NACOS_SERVER_ADDR}是Nacos服务地址,${NACOS_NAMESPACE}是命名空间,${NACOS_CONFIG_GROUP}是配置组名,${NACOS_CONFIG_FILE_EXTENSION}是配置文件扩展名。

  1. 创建接口白名单过滤器

创建一个实现 FilterInvocationSecurityMetadataSource接口的类,用于获取当前请求URL所对应的权限信息。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
@Component
public class MyFilterInvocationSecurityMetadataSource implements FilterInvocationSecurityMetadataSource {

@Override
public Collection<ConfigAttribute> getAttributes(Object object) throws IllegalArgumentException {
HttpServletRequest request = ((FilterInvocation) object).getRequest();
String url = request.getRequestURI();
// 从Nacos配置中心获取接口白名单列表
List<String> whitelist = NacosConfigUtil.getConfigList("whitelist");
if (whitelist.contains(url)) {
return null;
}
return SecurityConfig.createList("ROLE_USER");
}

@Override
public Collection<ConfigAttribute> getAllConfigAttributes() {
return null;
}

@Override
public boolean supports(Class<?> clazz) {
return FilterInvocation.class.isAssignableFrom(clazz);
}
}

在上面的代码中,NacosConfigUtil是一个工具类,用于从Nacos配置中心获取配置信息。getAttributes()方法获取当前请求URL对应的权限信息,如果该URL在接口白名单中,则返回null,否则返回一个包含ROLE_USER角色的SecurityConfig对象。

  1. 配置Spring Security

在WebSecurityConfigurerAdapter中配置Spring Security,添加自定义的过滤器和授权规则。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

@Autowired
private MyFilterInvocationSecurityMetadataSource myFilterInvocationSecurityMetadataSource;

@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.anyRequest().authenticated()
.withObjectPostProcessor(new ObjectPostProcessor<FilterSecurityInterceptor>() {
@Override
public <O extends FilterSecurityInterceptor> O postProcess(O object) {
object.setSecurityMetadataSource(myFilterInvocationSecurityMetadataSource);
object.setAccessDecisionManager(accessDecisionManager());
return object;
}
})
.and()
.csrf().disable();
}

@Bean
public AccessDecisionManager accessDecisionManager() {
List<AccessDecisionVoter<?>> decisionVoters = Arrays.asList(
new RoleVoter(),
new AuthenticatedVoter(),
new MyAccessDecisionVoter());
return new AffirmativeBased(decisionVoters);
}

}

在上面的代码中,myFilterInvocationSecurityMetadataSource是我们自定义的过滤器。accessDecisionManager()方法用于配置授权决策管理器,其中包含了三个投票器:RoleVoter、AuthenticatedVoter和自定义的MyAccessDecisionVoter。这些投票器用于判断用户是否有权限访问当前请求URL。

  1. 配置接口白名单

在Nacos配置中心创建一个名为 whitelist的配置项,将允许直接访问的URL添加到该配置项中。

例如,如果想要允许访问 /api/public/*下的所有接口,可以在 whitelist配置项中添加以下内容:
121

1
2
3
4
5
6
7
8
9
10
11
12
13

spring:
redis:
  host: 127.0.0.1
  port: 6379
  password: 123456
  database: 0
  lettuce:
    pool: # 连接池
      max-idle: 16
      max-active: 32
      min-idle: 8

1
/api/public/**

以上就是使用Spring Security和Nacos动态配置接口白名单的步骤。

1
dasd 
Prev
2023-05-26 22:16:23
Next