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

Spring Security动态授权

柴浩大
2023-03-14

im使用spring security和spring boot开发应用程序,使用SecurityConf保护我的api im的特定endpoint,如下所示:

 @Override
public void configure(final AuthenticationManagerBuilder auth) throws Exception {
    auth
    .inMemoryAuthentication()
    .passwordEncoder(passwordEncoder)
    .withUser(username).password(password).roles(ADMIN_ROLE);
}

@Override
protected void configure(final HttpSecurity http) throws Exception {
    http
    .csrf().disable()
    .authorizeRequests()
    .antMatchers("/api/survey/report/**").hasRole(ADMIN_ROLE)
    .and().formLogin()
    .and().logout();
}

密码和用户名从数据库开始加载。

一切似乎都工作正常,但现在我必须实现一个方法来更改管理员的密码,我实现了存储库、服务和控制器方法来使用新的加密密码更改DB,但就目前而言,除非我重新启动它,否则更改不会反映在应用程序中(这会导致类加载新的用户名和密码)。

如何让应用程序从数据库重新加载新的用户名和密码,而不必重新启动它?(在生产环境中,这是一个不会停止运行的应用程序)

这是密码更改方法的控制器:

@RequestMapping(value = "/change", method = RequestMethod.POST)
public ResponseEntity changePassword(@RequestBody Password password) {

    return passwordService.updatePassword(password);
}

这就是服务方法:

public ResponseEntity updatePassword(Password password) {
    Administrator administrator = administratorRepository.findAdministrator();
    if (passwordEncoder.matches(password.getOldPassword(), administrator.getPassword())) {
        String encodePassword = passwordEncoder.encode(password.getNewPassword());
        administrator.setPassword(encodePassword);
        administratorRepository.updateAdministrator(administrator);

        return new ResponseEntity(HttpStatus.OK);
    }
    return new ResponseEntity(HttpStatus.BAD_REQUEST);
}

我使用如下自动连线方法在SecurityConfig类的atributes上加载用户名和密码:

@Autowired
private void initUser() {
    Administrator administrator = administratorRepository.findAdministrator();
    this.password = administrator.getPassword();
    this.username = administrator.getUsername();

}

我的班级定义如下:

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

private static final String ADMIN_ROLE = "ADMIN";

private String username;
private String password;

@Autowired
private PasswordEncoder passwordEncoder;

@Autowired
private AdministratorRepository administratorRepository;

passwordencoder是一个类,我用它来对管理过程进行加密和散列,repo是我保存数据的地方

共有1个答案

安经纶
2023-03-14

使用CustomUserDetailService而不是像这样使用AuthenticationProvider

@Component("userDetailsService")
public class CustomUserDetailsService implements org.springframework.security.core.userdetails.UserDetailsService {


    private static String username;
    private static String password;
    private final Logger log = LoggerFactory.getLogger(CustomUserDetailsService.class);

    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {



        return new User(CustomUserDetailsService.username,CustomUserDetailsService.password,null);
    }

}


@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = true)
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {


    @Inject
    @Qualifier("userDetailsService")
    private UserDetailsService userDetailsService;

    @Inject
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
        auth
            .userDetailsService(userDetailsService);
    }

    @Override
    public void configure(WebSecurity web) throws Exception {

    }

}

然后在里面改密码

public ResponseEntity updatePassword(Password password) {
    Administrator administrator = administratorRepository.findAdministrator();
    if (passwordEncoder.matches(password.getOldPassword(), administrator.getPassword())) {
        String encodePassword = passwordEncoder.encode(password.getNewPassword());
        administrator.setPassword(encodePassword);
        administratorRepository.updateAdministrator(administrator);
        CustomUserDetailsService.password=encodePassword;
        return new ResponseEntity(HttpStatus.OK);
    }
    return new ResponseEntity(HttpStatus.BAD_REQUEST);
}
 类似资料:
  • 我们使用Spring Security OAuth2保护我们的REST服务(用于服务器到服务器通信,不涉及用户)。但是,当您尝试访问浏览器中的受保护资源时,它将显示: 我们希望这是我们自己选择的自定义页面。有办法吗? 设置“拒绝访问”页面不起作用。首先,它需要定义一个登录页面,我们没有,因为这是一个纯服务器到服务器的通信。另一个原因是,这个属性自Spring 3.0..或类似的版本以来就被弃用了。

  • 主要内容:1.入门,2.设置用户名和密码1.入门 1.启动一个SpringBoot项目 2.导入SpringSecurity相关依赖 3.编写Controller TestController.java 用户是user 密码是刚刚的 2.设置用户名和密码 1.在配置文件中设置 2.在配置类中设置 3.自定义实现类 2.1 配置文件中设置 2.2 在配置类中设置 设置用户名为zZZ,密码为root 2.3 自定义实现类 配置类: 业务类:

  • 问题内容: 这是我的情况: 一个Web应用程序对许多应用程序执行某种SSO 登录的用户,而不是单击链接,该应用就会向正确的应用发布包含用户信息(名称,pwd [无用],角色)的帖子 我正在其中一个应用程序上实现SpringSecurity以从其功能中受益(会话中的权限,其类提供的方法等) 因此,我需要开发一个 自定义过滤器 -我猜想-能够从请求中检索用户信息,通过自定义 DetailsUserSe

  • 在WAR的情况下,它试图将请求转发到/error页面,并寻找它的处理程序方法(请参见底部的日志)。 最后我得到以下回应: 我该换什么才能得到401?

  • 1.导入jar包 web.xml spring-security.xml

  • 本文向大家介绍SpringSecurity 测试实战,包括了SpringSecurity 测试实战的使用技巧和注意事项,需要的朋友参考一下 引言 试题管理系统的安全模块使用Spring Security,代码从原华软仓库移植,在移植的过程中,发现原测试编写的不好,遂在新系统中对安全模块测试进行了重构。 Spring 测试 添加@SpringBootTest注解,意为这是一个基于SpringBoot