我需要帮助为多个用户实现相同端点的基本身份验证
端点:http://localhost: 8080/功能/id/?用户=和id =
User是请求参数,应用程序在请求中发送不同的用户。根据用户和不同的凭据需要配置。谁能帮助我如何实现不同用户的春季启动实现?
@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
private Environment environment;
@Override
public void configure(HttpSecurity http) throws Exception {
String role =environment.getProperty("role");
http.csrf().disable().authorizeRequests()
.antMatchers("/").permitAll()
.antMatchers("/id/").hasRole(role)
.antMatchers("/login/").hasRole(role)
.and()
.httpBasic();
}
@Bean
public UserDetailsService userDetailsService() {
String username = environment.getProperty("username");
String password =environment.getProperty("password");
String role =environment.getProperty("role");
InMemoryUserDetailsManager manager = new InMemoryUserDetailsManager();
String encodedPassword = passwordEncoder().encode(password);
manager.createUser(User.withUsername(username).password(encodedPassword).roles(role).build());
return manager;
}
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
}
为了能够授权多个用户,您必须在某处存储多个凭据。
通常凭据存储在数据库中。要做到这一点,您必须配置与数据库的连接,然后使用JdbcUserDetailsManager
而不是InMemoryUserDetailsManager
(Spring Doc)。关于如何在Spring Boot中配置数据库连接,有很多参考资料,例如:https://springhow.com/spring-boot-database-connection/。在一个简单的情况下,添加spring-boot-starter-data-jpa
starter,一个连接器(取决于您使用的数据库)和一些配置属性就足够了。
如果您仍然希望使用内存中的用户凭据测试您的应用程序,您也可以这样做。例如,您可以不向用户详细信息管理器提供在应用程序属性中定义的一个用户帐户,而是定义一个包含多个用户名/密码对的映射,并将所有这些映射放在内存中的用户详细信息管理器中(通过为您定义的每个凭据对调用InMemoryUserDetailsManager#createUser
)。
另一件事是授权请求。如果我理解正确的话,您希望使用HTTP基本身份验证。对于基本认证,凭据通常在授权HTTP头中传递。该头的值应该具有以下格式:Basic base64(username:password)
。你可以在这里了解更多。
在Spring Security中有许多选项可以配置您的身份验证流,但是如果您的安全流足够简单,使用UserDetailsManager需要最少的自定义配置。
使用JdbcUserDetailsManager
的示例代码(省略其他片段):
@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
DataSource dataSource;
@Bean
public UserDetailsManager userDetailsManager()
{
JdbcUserDetailsManager jdbcUserDetailsManager = new JdbcUserDetailsManager();
jdbcUserDetailsManager.setDataSource(dataSource);
return jdbcUserDetailsManager;
}
}
您还需要匹配SQL模式来与管理器一起工作:
CREATE TABLE USERS
(
USERNAME VARCHAR(50) NOT NULL,
PASSWORD VARCHAR(68) NOT NULL,
ENABLED TINYINT(1) NOT NULL,
PRIMARY KEY(USERNAME)
);
CREATE TABLE AUTHORITIES
(
USERNAME VARCHAR(50) NOT NULL,
AUTHORITY VARCHAR(68) NOT NULL,
FOREIGN KEY (USERNAME) REFERENCES USERS(USERNAME)
);
注意,您需要使用在PasswordEncoder
bean中配置的相同算法存储加密的密码(在您的示例中为bcrypt)。最好的选择是从Spring应用程序本身创建用户,并使用PasswordEncoder
bean对密码进行编码。
你可以在这里的文章中找到更多细节。
从属性中加载列表
您可以将用户列表存储在属性文件中,并使用Spring Boot将其加载到对象中。
@ConfigurationProperties(prefix = "data")
public class DataProperties {
private List<User> users = new ArrayList<>();
// getters and setters
public static class User {
private String username;
private String password;
private String role;
// getters and setters
}
}
启用配置属性绑定并将它们注入到UserDetailsService
bean定义中:
@Configuration
@EnableConfigurationProperties(DataProperties.class)
public class SecurityConfig extends WebSecurityConfigurerAdapter
{
@Bean
public UserDetailsService userDetailsService(DataProperties properties) {
// load users into user details manager
}
}
属性:
data.users[0].username=john
data.users[0].password=123456
data.users[0].role=admin