簡體   English   中英

如何在 Spring Boot 安全性中為多個用戶的相同端點實現基本身份驗證

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM