安全配置接入
这里通过spring security安全框架来实现,引入如下依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
然后在yml配置文件中,添加上默认用户,如下:
spring:
security:
user:
name: admin
password: admin
为什么直接使用默认用户,固定的,而不是像正常的系统那样读数据库用户表,个人选择这样的做法是,第一没有做admin-server更细的权限划分,哪怕有多个用户,权限也是一样的,那还有必要多用户么?第二,如果要求这个监控服务要用系统的用户数据来做登录,那么就学习下spring security的使用,扩展下即可实现数据源登录的操作,第三,如果要求和原有系统做类似单点的功能,作为菜单嵌入在原系统中,那么建议再跳转时,携带token,然后admin-server项目加个拦截器,获取token,然后采用和原系统一样的校验规则,通过说明原系统已经登录了,那么就直接放行,否则重定向到原系统登录页,这种方案此时都不需要维护用户了,只要校验token就好,我反正没做这么复杂,能够保证简单安全即可,如果有朋友需要做这么复杂的话,可以参考下2,3方案的思路。
先增加spring security相关的配置文件,如下:
@EnableWebSecurity
@Configuration(proxyBeanMethods = false)
public class SecuritySecureConfig extends WebSecurityConfigurerAdapter {
private final String adminContextPath;
public SecuritySecureConfig(AdminServerProperties adminServerProperties) {
this.adminContextPath = adminServerProperties.getContextPath();
}
@Override
protected void configure(HttpSecurity http) throws Exception {
SavedRequestAwareAuthenticationSuccessHandler successHandler = new SavedRequestAwareAuthenticationSuccessHandler();
successHandler.setTargetUrlParameter("redirectTo");
successHandler.setDefaultTargetUrl(adminContextPath + "/");
http.authorizeRequests()
.antMatchers(adminContextPath + "/assets/**").permitAll()
.antMatchers(adminContextPath + "/login").permitAll()
.antMatchers(adminContextPath + "/instances/**").permitAll()
.anyRequest().authenticated()
.and()
.formLogin().loginPage(adminContextPath + "/login").successHandler(successHandler).and()
.logout().logoutUrl(adminContextPath + "/logout").and()
.httpBasic().and()
.csrf()
.csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse())
.ignoringAntMatchers(
adminContextPath + "/instances",
adminContextPath + "/actuator/**"
);
}
}
启动admin-server服务,访问页面,此时就会需要先登录了,如下:
问题出现
输入admin/admin后,查看信息,发现一同注册到nacos的服务demo能够正常展示信息,而admin-server服务却不行,如下:
点击进去查看原因,如下:
很明显是401,未认证错误,照理说我们都登录了。 而实际报401的接口是下面这个:
这个接口出问题,导致后续的数据都出不来了。
解决方案
这个接口出问题,这个接口很明显是单独查询某个实例的健康状态的,从30d25be46cc9这个ID就能知道了,做的是单个查询,此时这个接口出不来数据,报401,我并不想去看spring security的源代码,研究为啥都登录了但是还是报401,换个解决思路,我如果把这个接口放行,会不安全么,我感觉是不会的,为啥,因为这个接口得有个ID啊,ID谁知道,而且想知道这个id就得先访问如下接口:
这个接口我们又没放行,那就只有登录后才能访问这个接口拿到具体id,问题是你都能登录了,我还担心这个接口对你放行安不安全么,所以这种带着id的接口放行没关系,因为id不是规则的,猜不了,就能保证这个接口的安全了,但是可能防止不了一直刷这个接口,但是我们做安全是为了防止信息泄漏,一直刷接口的事,要做也不会针对这个监控服务啊,无利可图,就算监控服务给刷蹦了,也不影响主业务,所以无妨。 所以修改下spring security相关的配置文件,增加如下配置:
重启后,发现admin-server正常了,如下:
现在我准备直接访问开放的实例健康接口,如下:
结果如下:
依旧还是需要登录。
所以最坏的情况是想到id不可预测,开放也没事,现在测试后,发现即使开放了,依旧有登录校验,连id真的泄漏或被猜到的情况都不用考虑了,当然了,安全这块了解的很少,这篇只是做个安全配置的做法和问题解决的分享,仅做参考!
|