【问题标题】:Create admin account by default in Spring bootSpring boot默认创建admin账号
【发布时间】:2019-02-21 12:53:57
【问题描述】:

我有一个用户实体:

User.java

@Entity
public class user {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;
@NotNull
@NotBlank
private String firstname;
...

当我第一次部署应用程序时,它将在我的数据库中创建此表。

我的问题:有没有办法在创建时创建一个带有名字的管理员用户以及表user

【问题讨论】:

  • 是的,你应该用你想要的sql语句在属性文件中添加spring.datasource.data=data.sql
  • 你能举个例子吗@HadiJ

标签: spring spring-mvc spring-boot


【解决方案1】:

我更喜欢总是避免使用 sql 脚本,所以我使用 CommandLineRunner 接口。 这是一个使用弹簧数据的例子,它不是一个工作代码:

@Component    
public class CommandLineAppStartupRunner implements CommandLineRunner {
    @Autowired
    UserRepository userRepository;

    @Override
    public void run(String...args) throws Exception {
        User admin = new user(firstName);
        userRepository.save(admin);
    }
}

在应用启动之前,这个类将被执行。

【讨论】:

  • 并尝试在每次启动时再次创建 /merge,这听起来不对。
  • 是的,这听起来不对,因为您每次都需要调用 create/merge(这是我们不需要的额外调用)您的解决方案有效,但有一个更好的 +1 答案跨度>
  • 这种方法比普通的 SQL 脚本更好,因为脚本不知道您的数据库架构更改,需要手动更改。使用实体,您将能够在编译器时跟踪错误。
  • 是的,我同意,这比使用 SQL 脚本更好
【解决方案2】:

This answer 实际上展示了一种更好的方法,应该被接受。


你可以在src/main/resources/data.sql

INSERT INTO users (firstname, password, enabled)
SELECT 'admin', 'secret', TRUE
WHERE NOT EXISTS (SELECT * FROM users WHERE firstname='admin');

假设您使用 PostgreSQL 作为数据库后端。

由于我不知道您使用的数据库架构,您必须修改此查询以匹配您的架构,但它应该为您提供基本概念。

我认为您甚至不需要为此添加任何配置,因为 Spring 会自动拾取它并将其用于数据库初始化(如果它位于正确的目录中)。

根据another answer to a similar question,在 Spring Boot 2.x 中,您必须添加以下配置才能使其工作:

spring.datasource.initialization-mode=always

【讨论】:

  • 如果密码被加密或加盐并且哈希逻辑在Java应用程序中,这种方法会变得有点尴尬,因为要插入的密码值是未知的。有什么办法可以解决这个问题?
猜你喜欢
  • 1970-01-01
  • 2019-05-01
  • 2018-09-21
  • 1970-01-01
  • 1970-01-01
  • 2017-06-13
  • 2020-11-28
  • 1970-01-01
相关资源
最近更新 更多