[英]How to implement the basic Authentication in spring boot security for same endpoints for multiple users
我需要幫助來為多個用戶實現相同端點的基本身份驗證
端點:http://localhost:8080/function/id/?user=&id=
用戶是請求參數,應用程序在請求中發送不同的用戶。根據用戶和不同的憑據需要配置。任何人都可以幫我如何實現不同用戶的spring boot實現。
@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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.