spring - 在数据库初始化期间以编程方式登录Spring Security

标签 spring spring-boot spring-security

我正在使用 spring security 并有如下方法:

@PreAuthorize("hasRole('ADMIN')")
void createUser(..)

@PreAuthorize("hasRole('ADMIN')")
void createDepartment(..)

@PreAuthorize("hasRole('ADMIN')")
void createProject(..)

只有具有 ADMIN 角色的用户才可以执行这些方法。在该方法内,执行管理员(当前登录的用户)将作为创建者添加到新记录中。

问题: 第一次启动应用程序时,当数据库为空时,我想创建默认用户/部门/项目。

private void init() {
  createUser("admin", "admin");
  createProject("defaultProject");
  ..
}

我考虑让一些具有管理员角色的系统用户应该执行 init()。 我如何才能以编程方式登录为该系统用户以执行 init()?

谢谢!

PS:跳过 @PreAuthorize 检查是不够的,因为我需要在这些方法中登录用户。

最佳答案

您可以在init之前将具有正确角色的自定义Authentication设置为SecurityContextHolder。类似的东西

protected void setSecurityContext() {
        SecurityContext securityContext = new SecurityContextImpl();
        User user = new User("userName", null, null);

        Collection<GrantedAuthority> grantedAuthorities = new ArrayList<GrantedAuthority>();
        grantedAuthorities.add(new SimpleGrantedAuthority("ADMIN"));
        AnonymousAuthenticationToken anonymousAuthenticationToken = new AnonymousAuthenticationToken("test", user, grantedAuthorities);
        securityContext.setAuthentication(anonymousAuthenticationToken);
        SecurityContextHolder.setContext(securityContext);

        // init method
        //...


        // don't forget to clear context
        SecurityContextHolder.clearContext();
    }

关于spring - 在数据库初始化期间以编程方式登录Spring Security,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41706280/

相关文章:

spring - Grails中的域类

java - Spring @Transactional 配置 xml

java - 友好的 URL 映射问题 - Java Spring

java - 事务的 Spring 自注入(inject)

java - Spring - 使用属性占位符加载位于 war 文件或类路径之外但位于文件系统中的属性文件

java - 关于Interceptor中读取POST方法参数

java - 没有设置数据源就无法启动 spring boot 应用程序

spring-security - 我如何为 spring webflux 应用程序配置 oauth2 资源服务器?

java - 如何在 Spring Boot 中重写InternalResourceViewResolver?

java - Spring Security - 为什么要为用户和角色设置单独的类?