如何在构建后将用户添加到inMemoryAuthentication构建器?

时间:2014-09-16 12:50:25

标签: spring spring-security spring-boot

我在设备初始加载期间设法将所有用户加载到AuthenticationManagerBuilder中,但我要求在启动后添加用户。

启动:

public class WebSecurityConfig extends WebSecurityConfigurerAdapter

...

auth.inMemoryAuthentication().withUser(email).password(password).roles(roles.toArray(new String[roles.size()])).and().passwordEncoder(encoder());

这适用于某个时间点,但我有一个用例可以在应用程序运行时添加用户。

我可以通过哪种方法在启动后(通过控制器/服务)进行此操作?我认为它可能是InMemoryUserDetailsManager(它包含createUser()方法),但我不确定如何引用或配置它。

2 个答案:

答案 0 :(得分:31)

以下代码将按您的要求执行:

@Configuration
@EnableWebMvcSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        //whatever here
    }

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

    @Bean
    public InMemoryUserDetailsManager inMemoryUserDetailsManager() {
        final Properties users = new Properties();
        users.put("user","pass,ROLE_USER,enabled"); //add whatever other user you need
        return new InMemoryUserDetailsManager(users);
    }

}

使用您在上面配置的InMemoryUserDetailsManager,只需添加并检查用户是否存在的超级简单控制器如下所示:

@RestController
@RequestMapping("user")
public class SimpleSecurityController {

    private final InMemoryUserDetailsManager inMemoryUserDetailsManager;

    @Autowired
    public SimpleSecurityController(InMemoryUserDetailsManager inMemoryUserDetailsManager) {
       this.inMemoryUserDetailsManager = inMemoryUserDetailsManager;
    }

    @RequestMapping("exists/{username}")
    public boolean userExists(@PathVariable("username") String username ) {
        return inMemoryUserDetailsManager.userExists(username);
    }

    @RequestMapping("add/{username}/{password}")
    public String add(@PathVariable("username") String username, @PathVariable("password") String password) {
        inMemoryUserDetailsManager.createUser(new User(username, password, new ArrayList<GrantedAuthority>()));
        return "added";
    }
}

另请注意,如果您使用的是Spring Boot的自动配置,则需要添加

@EnableAutoConfiguration(exclude = SecurityAutoConfiguration.class)

阻止Spring Boot尝试自动配置安全性

<强>更新 正如@AdamMichalik所述,@EnableWebMvcSecurity已被弃用,应由@EnableWebSecurity替换

答案 1 :(得分:2)

我改变了这段代码:

inMemoryUserDetailsManager.createUser(new User(username, password, new ArrayList<GrantedAuthority>()));

来自@ geoend的回答:

inMemoryUserDetailsManager.createUser(User.withUsername(username).password(password).roles("USER").build());

因为默认情况下,新用户没有任何权限。