Spring Security是一个强大的安全框架,可以帮助开发人员轻松地实现各种安全功能。Nacos是阿里巴巴开源的一个动态服务发现、配置和管理平台。在Spring Security中使用Nacos动态配置接口白名单需要以下步骤:
- 添加Nacos客户端依赖
在pom.xml文件中添加以下依赖:
1 2 3 4
| <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> </dependency>
|
- 配置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}
是配置文件扩展名。
- 创建接口白名单过滤器
创建一个实现 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(); 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对象。
- 配置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。
- 配置接口白名单
在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
|
以上就是使用Spring Security和Nacos动态配置接口白名单的步骤。