当前位置: 首页 > 知识库问答 >
问题:

如何在inMemoryAuthentication生成器生成后向其添加用户?

童铭晨
2023-03-14
public class WebSecurityConfig extends WebSecurityConfigurerAdapter

...

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

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

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

共有1个答案

南门欣怡
2023-03-14

下面的代码将执行您所要求的操作:

@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)
 类似资料:
  • 这是我尝试过的代码,但我得到以下异常: iText。内核PDFEException:“无法在已刷新的页面上绘制元素。” 我需要在最后添加页码,因为在生成pdf的内容后,我生成了一个目录并将其移动到文档的开头。因此,我只知道生成所有页面后的页码。

  • 我正在创建一个这样的表, 但我想增加一列。在原始SQL中看起来是这样的: 如何将其添加到迁移中?我还需要在上面创建一个索引。

  • 我正在使用JOOQ 3.6.4和Java 8从模式生成一组JOOQ记录。 有些表是结构类似的引用数据,比如说它们有ID、CODE和VALUE列(它们可能有其他列,但它们都至少有这些列)。 在我的代码中,不是由JOOQ生成的,我有一个接口“ReferenceData”,它定义了与JOOQ为这三列生成的代码相匹配的访问器。我想告诉JOOQ在它生成的记录对象中添加一个“implements Refere

  • 我创建了一个单独的服务生成器类,如下所示:https://futurestud.io/tutorials/retorfit-2-manage-request-headers-in-okhttp-interceptor apiserviceGenerator.java

  • 我一直在使用 annox 在我的 jaxb 生成的类上添加注释(通过绑定文件),但我找不到直接在包上添加注释的方法(包信息.java)。 我一直在尝试在bindings.xml中这样做: 但是jaxb抱怨说< code>annox:annotate不应该在那里。 还有别的方法吗?

  • 我已经为我的颤振应用程序创建了android版本。 然后我创建了一个内部测试版本。这是一个警告 此应用程序包包含本机代码,您尚未上载调试符号。我们建议您上载一个符号文件,以使崩溃和ANR更易于分析和调试。 基本上我要做的就是添加以下内容来构建。根据链接显示的渐变文件。 我假设它是android/app/build。他们说的是格拉德尔。 不确定我必须在文件中的什么位置添加这一行。 有人能指出在哪里加