我已经设法在应用程序的初始加载期间将所有用户加载到AuthenticationManagerBuilder中,但是我需要在启动后添加用户。
启动:
public class WebSecurityConfig extends WebSecurityConfigurerAdapter ... auth.inMemoryAuthentication().withUser(email).password(password).roles(roles.toArray(new String[roles.size()])).and().passwordEncoder(encoder());
这在某个时间点上效果很好,但是我有一个用例,可以在应用程序运行时添加用户。
我可以通过哪种方法进行启动后(通过控制器/服务)?我想可能是InMemoryUserDetailsManager(它包含createUser()方法),但是我不确定如何引用或配置它。
InMemoryUserDetailsManager
createUser()
以下代码将满足您的要求:
@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
@EnableWebMvcSecurity
@EnableWebSecurity