gpt4 book ai didi

java - 无法理解 Spring security 的行为

转载 作者:行者123 更新时间:2023-12-02 03:50:41 31 4
gpt4 key购买 nike

我正在使用带有执行器依赖项的 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请求时

curl -XGET  http://localhost:9797/provisioningService/organizations/all

我能够看到输出。就好像 Spring Security 从未存在过一样。当我启用表单登录时,我会看到 Spring 登录屏幕。我观察到的另一个行为是,如果我将/locations 的用户名和密码与执行器用户名和密码交换,我仍然会得到有效的响应。

我知道表单登录更多的是后备,但我想禁用表单登录(可能我们可能会转向 cas)并仅使用基于 spring security httpBasic 的身份验证和授权。我无法理解我所犯的错误。

我的要求终于是:

1) 仅当用户名密码为“user”和“password”时,才能访问对/organizations 或/locations 等的请求

2) 仅当用户名和密码以及角色与执行器用户名和密码匹配时,才可以访问对/manage(执行器 api)的请求。

3)任何其他API都可以permitAll/表单登录

我该如何实现这一目标?

最佳答案

1) Spring Security有通过Authorities(认证后)过滤来控制访问的功能,但是没有通过登录所需的信息进行过滤的功能。您需要业务逻辑来验证您在登录过程中尝试使用相应的 ID 和密码登录。

2) 如上所述,不提供ID和密码的访问控制。我建议仅为您请求的两个帐户创建权限。

3) .antMatcher("/form").permitAll()

关于java - 无法理解 Spring security 的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56781171/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com