Java 如何在不重新启动Spring引导的情况下添加具有Spring安全性的新用户
完成启动spring引导后,spring Security的配置无法更新。如何在不重新启动spring boot的情况下添加新用户或更新用户密码或用户角色?因为当我使用新密码登录时,页面被重定向到/login?错误页面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
@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不会对其进行身份验证。