我正在使用带有执行器依赖项的Spring Boot 2.1.4。我想为执行器和我的应用程序配置单独的身份验证和授权机制。我阅读了Multiple HttpSecurity并按如下方式配置了WebSecurityAdapter:
@Configuration
public class ProvisioningServiceSecurityConfiguration {
@Value("${actuator.user.name}")
private String actuatorUserName;
@Value("${actuator.password}")
private String actuatorPassword;
@Value("${actuator.role}")
private String actuatorRole;
@Bean
public UserDetailsService userDetailsService() throws Exception {
// ensure the passwords are encoded properly
UserBuilder users = User.withDefaultPasswordEncoder();
InMemoryUserDetailsManager manager = new InMemoryUserDetailsManager();
manager.createUser(users.username("user").password("password").roles("ADMIN").build());
manager.createUser(
users.username(actuatorUserName).password(actuatorPassword).roles(actuatorRole).build());
return manager;
}
@Configuration
@Order(1)
public static class ApiWebSecurityConfigurationAdapter extends WebSecurityConfigurerAdapter {
protected void configure(HttpSecurity http) throws Exception {
http
.antMatcher("/locations/**")
.antMatcher("/organizations/**")
.antMatcher("/productTypes/**")
.authorizeRequests()
.anyRequest().hasRole("ADMIN")
.and()
.httpBasic();
}
}
@Configuration
@Order(2)
public static class ActuatorWebSecurityConfigurationAdapter extends WebSecurityConfigurerAdapter {
protected void configure(HttpSecurity http) throws Exception {
http
.antMatcher("/manage/**")
.authorizeRequests()
.anyRequest().hasRole("ACTUATOR_ADMIN")
.and()
.httpBasic();
}
}
/*@Configuration
public static class FormLoginWebSecurityConfigurerAdapter extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.anyRequest().authenticated()
.and()
.formLogin();
}
}*/
}
注意:我已禁用表单临时登录
当我执行卷曲请求
curl -XGET http://localhost:9797/provisioningService/organizations/all
我能够看到输出。好像弹簧安全性从未存在过。启用表单登录后,将显示spring登录屏幕。我观察到的另一个行为是,如果将/ locations的用户名和密码与执行器的用户名和密码互换,我仍然会收到有效的响应。
我知道表单登录更多的是回退,但是我想禁用表单登录(可能我们可能会改用cas),并且仅基于Spring Security httpBasic使用身份验证和授权。我无法理解我正在犯的错误。
我的要求终于是:
1)仅当用户名密码为“ user”和“ password”时,才可以访问对/ organizations或/ locations等的请求
2)仅当用户名和密码以及角色与执行器用户名和密码相匹配时,才可以访问作为执行器api的对/ manage的请求。
3)任何其他API都可以被允许使用all /表单登录
我该如何实现这一目标?
答案 0 :(得分:0)
1)Spring Security具有通过权限(在身份验证之后)进行过滤来控制访问的功能,但是没有用于对登录所需信息进行过滤的功能。您需要业务逻辑来验证您是否在登录期间尝试使用相应的ID和密码登录。
2)如上所述,未提供具有ID和密码的访问控制。 我建议仅为您请求的两个帐户创建“单位”。
3).antMatcher("/form").permitAll()