Пользователь-администратор по умолчанию в конфигурации и другие пользователи из базы данных - PullRequest
0 голосов
/ 26 мая 2020

Я использую пружинный ботинок с пружинной защитой и jpa. Я хотел бы иметь администратора в конфигурации и других пользователей в базе данных. Проблема в том, что когда я добавил UserDetailsService, пользователь admin из application.properties перестает работать.

application.properties:

spring.security.user.name=admin
spring.security.user.password={bcrypt}$2a$10$7F7xGm8iuzafFA7RPS8gzeKJm9qNBwtejT4hSuBKXMNlc/4NxOy1G
spring.security.user.roles=admin

Класс конфигурации Spring Security:

@Configuration
@EnableWebSecurity
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {

    @Qualifier("myUserDetailsService")
    @Autowired
    private UserDetailsService userDetailsService;

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.userDetailsService(userDetailsService).passwordEncoder(encodePWD());
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
                .csrf().disable()
                .authorizeRequests()
                .requestMatchers(PathRequest.toStaticResources().atCommonLocations()).permitAll()
                .antMatchers("/").permitAll()
                .antMatchers("/uzytkownik/pacjent/rejestracja").anonymous()
                .anyRequest().hasRole("admin")
                .and().formLogin().permitAll()
                ;


    }

    @Bean
    public BCryptPasswordEncoder encodePWD() {
        return new BCryptPasswordEncoder();
    }

}

1 Ответ

1 голос
/ 26 мая 2020

Без какой-либо конфигурации Spring Security по умолчанию читает пользователя из файла свойств. Но если вы добавите UserDetailsService, это означает, что вы хотите читать пользователей, используя метод интерфейса loadUserByUsername. Этот метод может быть реализован, например, для чтения пользователей из базы данных

. Если вы хотите, чтобы ваш администратор из application.properties считался пользователем, вы можете создать его в своей реализации UserDetailsService:

import org.springframework.beans.factory.annotation.Value;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.stereotype.Service;

@Service
public class MyUserDetailsService implements UserDetailsService {

    @Value("${spring.security.user.name}")
    private String adminUserName;

    @Value("${spring.security.user.password}")
    private String adminPassword;

    @Value("${spring.security.user.roles}")
    private String adminRole;

    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        if(username.equals(adminPassword)) {
            return User.builder().username(adminUserName).password(adminPassword).roles(adminRole).build();
        }

        //return your other users from database here
        return null;
    }
}
...