Nacos怎么做安全校验的?
以下使用nacos2.x
如上图所示, 可以直接访问Nacos的接口来获取用户列表。这说明Nacos的接口被爆露,任何情况下都可以访问,因此安全性得不到保障。
Nacos 使用 spring security 作为安全框架。spring security 使用:
在我们的 spring boot项目的 pom文件中引入:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
<version>2.2.0.RELEASE</version>
</dependency>
启动项目后,访问接口时,必需登录才可以。 否则会弹出内置的登录界面:
记住这个界面,这是 spring security 默认的 内置登录界面。
也可以 添加配置:
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
// @formatter:off
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests(authorizeRequests ->
authorizeRequests
.antMatchers("/css/**", "/index").permitAll()
.antMatchers("/**").hasRole("USER")
)
.formLogin(formLogin ->
formLogin
.loginPage("/login")
.failureUrl("/login-error")
);
}
// @formatter:on
@Bean
public UserDetailsService userDetailsService() {
UserDetails userDetails = User.withDefaultPasswordEncoder()
.username("user")
.password("password")
.roles("USER")
.build();
return new InMemoryUserDetailsManager(userDetails);
}
}
结论: 只要 我们的 项目中引入了 spring security 的start依赖,那么 接口 都是 安全的,除非 指定哪些接口不受限。
问题:为什么 Nacos 使用了spring security,却像是没有引入 spring security一样,接口可以随意被访问呢?
Nacos的spring security的配置中,如果
nacos.core.auth.system.type
为空时,会使用 我们配置的
nacos.security.ignore.urls
属性配置文件中:
Nacos的 属性配置文件中已经明确写了,当前只支持 nacos 和 ldap两种,所以,Nacos 的 spring security 的配置中,会忽略掉所有的请求。这就说明,spring security 不会对任何请求做安全校验了。
Nacos在启动的时候,会注册一个 自定义的 filter 来进行登录校验。
Nacos提供的 filter 逻辑中,判断了 是否开启权限校验,如果没开启,则不校验。 而权限校验开关默认是关闭的。
因此,默认情况下不会对接口做安全校验。 这也就是 为什么 使用了spring security,却像没有使用spring security似的 没对接口做安全校验的原因。
对于有些接口,如/login等,接口逻辑中 增加了 登录校验功能,因此,即使 spring security 将请求放过,接口内部逻辑也能够完成安全校验逻辑。这就是为什么有些接口必须登录,有些接口可以随意访问。
总结:
1. 使用 spring security 可以做安全校验
2. 使用spring security 可以对指定接口进行直接放行
3. 可能spring security的安全校验不符合要求,就自己定义了安全校验功能,将spring security配置成对所有接口放行。那么 此时 安全校验功能 就需要 自己来完成。
4. 有些接口 完全依赖 安全框架的权限校验逻辑,自己不做校验。
5. 也可以在接口中 增加校验逻辑。即使 请求到了接口,那么 接口内部也可以做一些权限校验,而不用依赖安全框架