如何使用InMemoryUserDetailsManager发布自动配置?

时间:2019-08-28 08:05:28

标签: spring spring-boot spring-security

在基于Spring Boot的应用程序中-为简单起见,我依靠InMemoryUserDetailsManager通过UserDetailsServiceAutoConfiguration进行Spring Web Security自动配置。

为此,我只是通过properties(.yml)设置了一个用户,如下所示:

spring.security.user:
  name: whatever
  password: xxx
  roles: USER

我想随后通过在InMemoryUserDetailsManagercreateUser(UserDetails user)上调用适当的方法,添加可能从其他来源读取的额外用户(属性或大约-编译时未知的确切值) (从接口UserDetailsManager继承)。基本上在我的@Configuration类bean中:

@Autowired // Spring will inject its newly created InMemoryUserDetailsManager
private UserDetailsManager userDetailsManager;

// Maybe some annotation like @PostConstruct maybe? but should be conditioned to the existence of the above UserDetailsManager - can I do this?
public void loadMyUsers() {
    ...
    Collection<UserDetails> users; // my list of "users"/UserDetails
    users.stream().forEach(userDetailsManager::createUser);
}

我已经看到了这个问题:How can I add users to the inMemoryAuthentication builder after it has been built?,但不幸的是,答案会导致我期望的其他方向,即通过提供一个REST端点来添加用户(第一个答案),或者通过“硬编码”来添加用户(第二个答案)。

可以这样做吗?

1 个答案:

答案 0 :(得分:0)

Spring Boot启动后,您可以使用ApplicationRunner or CommandLineRunner执行一些代码,并在这些运行器中创建用户。

明智的代码,它看起来像:

@SpringBootApplication
public class MyApplication {

    @Autowired 
    private UserDetailsManager userDetailsManager;

    @Bean
    public CommandLineRunner commandLineRunner(ApplicationContext ctx) {
        return args -> {
            User user=new User("Foo", "password", ......);
            userDetailsManager.createUser(user);
        };
    }


    public static void main(String[] args) {
        SpringApplication.run(DangerApplication.class, args);
    }

}