Java 如何在不重新启动Spring引导的情况下添加具有Spring安全性的新用户

Java 如何在不重新启动Spring引导的情况下添加具有Spring安全性的新用户,java,spring,spring-boot,spring-security,Java,Spring,Spring Boot,Spring Security,完成启动spring引导后,spring Security的配置无法更新。如何在不重新启动spring boot的情况下添加新用户或更新用户密码或用户角色?因为当我使用新密码登录时,页面被重定向到/login?错误页面 @EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter { @Autowired MemberMapper memberMapper; Lo

完成启动spring引导后,spring Security的配置无法更新。如何在不重新启动spring boot的情况下添加新用户或更新用户密码或用户角色?因为当我使用新密码登录时,页面被重定向到/login?错误页面

@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    MemberMapper memberMapper;

    Logger logger = Logger.getLogger(this.getClass());

    @Override
    protected void configure(HttpSecurity http) throws Exception {

        http.csrf().disable();
        http.addFilterBefore(new loginFilter(), AnonymousAuthenticationFilter.class).
                authorizeRequests().antMatchers("/","/register/**","/log/**").permitAll();



        http.formLogin().loginPage("/log/toLogin") 
                        .loginProcessingUrl("/log/login") 
                        .usernameParameter("memacc")
                        .passwordParameter("mempwd")
                        .failureHandler(new AppsAuthenticationFailureHandler());;





        http.logout().logoutSuccessUrl("/");


    }

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {

        List<Members> allMembers = memberMapper.getAllMembers();

        for (Members members : allMembers){
            String[] roleList = members.getRoleList().split(",");
            auth.inMemoryAuthentication().passwordEncoder(new BCryptPasswordEncoder())
                .withUser(members.getMemacc()).password(new BCryptPasswordEncoder().encode(members.getMempwd())).roles(roleList);
        }

    }
}

执行登录过程时,spring boots会将用户配置文件保存在内存中。 例如,如果为已登录用户添加新角色并保存在数据库中,则内存中的用户配置文件不会更改,因此必须更新此数据

您可以通过以下方式实现:

User user = userService.findById(idUser);
    SecurityContextHolder.getContext().setAuthentication(new UsernamePasswordAuthenticationToken(user, user.getPassword(), user.getRoles()));
使用此命令,您可以在spring security memory中更新用户配置文件。

谢谢大家, 我找到了解决办法

@启用Web安全性

公共类SecurityConfig扩展了WebSecurity配置适配器{

@Autowired
MyUserDetailsService myUserDetailsService;

Logger logger = Logger.getLogger(this.getClass());

@Override
protected void configure(HttpSecurity http) throws Exception {
 
    http.csrf().disable();
    
    http.addFilterBefore(new loginFilter(), AnonymousAuthenticationFilter.class).
            authorizeRequests().antMatchers("/","/register/**","/log/**").permitAll();

    
    http.formLogin().loginPage("/log/toLogin")
                    .loginProcessingUrl("/log/login") 
                    .usernameParameter("memacc")
                    .passwordParameter("mempwd");
    http.logout().logoutSuccessUrl("/");
}
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
    auth.userDetailsService(myUserDetailsService);
}
}

使用类实现UserDetailsService接口。当用户登录时,对该用户进行身份验证

。。。 @服务 公共类MyUserDetailsService实现UserDetailsService{

@Autowired
MemberMapper memberMapper;

@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {

    Members member = memberMapper.getOneMemberByMemacc(username);
    if(member == null)
        throw new UsernameNotFoundException(username + " not found");
    UserDetails userDetails = User.builder()
            .username(member.getMemacc())
            .password("{noop}" + member.getMempwd())
            .roles(member.getRoleList()).build();
    return userDetails;
}
}
…是否有使用inMemoryAuthentication的特定需求?或者可以使用其他类型的身份验证吗?InMemoryAuthentication基本上用于提供静态用户集,可能仅用于测试目的。如果您需要提供动态用户创建支持,则需要提供适当的注册流否,只需要使用简单的方法来处理动态用户创建或更新用户详细信息MemoryAuthentication针对固定用户。我可以使用UserDetailsService动态身份验证吗。我使用您提供的方法解决新的登录问题,但是当用户更改密码然后登录时,它无法处理问题。我不理解您的问题。如果您在数据库中更改了密码,并在Spring security中更改了de user,则您的用户已被更新并记录。您不必什么都不做,这种情况可以工作,但是当用户第一次注销然后登录时,spring security不会对其进行身份验证。