【问题标题】:How can I add users to the inMemoryAuthentication builder after it has been built?构建后如何将用户添加到 inMemoryAuthentication 构建器?
【发布时间】:2014-11-10 05:33:54
【问题描述】:

我已经设法在应用程序的初始加载期间将所有用户加载到 AuthenticationManagerBuilder 中,但我需要在启动后添加用户。

启动:

public class WebSecurityConfig extends WebSecurityConfigurerAdapter

...

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

这在某个时间点上效果很好,但我有一个用例,可以在应用程序运行时添加用户。

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

【问题讨论】:

    标签: spring spring-security spring-boot


    【解决方案1】:

    以下代码将满足您的要求:

    @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

    【讨论】:

      【解决方案2】:

      我更改了这段代码:

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

      来自@geoend 的回答:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-12-07
        • 1970-01-01
        • 2019-08-14
        • 2022-01-01
        • 1970-01-01
        相关资源
        最近更新 更多