在Spring boot中默认创建管理员帐户
我有一个用户实体: User.java在Spring boot中默认创建管理员帐户,spring,spring-mvc,spring-boot,Spring,Spring Mvc,Spring Boot,我有一个用户实体: User.java @Entity public class user { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private long id; @NotNull @NotBlank private String firstname; ... 当我第一次部署应用程序时,它将在我的数据库中创建此表 我的问题:是否有任何方法可以在创建表user时创建名为firstname的管理员用户?实际上显示了一种
@Entity
public class user {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;
@NotNull
@NotBlank
private String firstname;
...
当我第一次部署应用程序时,它将在我的数据库中创建此表
我的问题:是否有任何方法可以在创建表user
时创建名为firstname的管理员用户?实际上显示了一种更好的方法,应该是公认的方法
您可以在
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将自动获取它,如果它位于正确的目录中,则将其用于数据库初始化
根据,在Spring Boot 2.x中,您必须添加以下配置才能工作:
spring.datasource.initialization-mode=always
我宁愿总是避免使用sql脚本,所以我使用CommandLineRunner接口。
这是一个使用spring数据的示例,它不是工作代码:
@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);
}
}
在应用程序启动之前,该类将被执行。是的,您应该在属性文件中添加spring.datasource.data=data.sql
,并使用您想要的sql语句。您可以提供一个示例@hadij,并在每次启动时尝试再次创建/合并,这听起来是错误的。是的,这听起来是错误的,因为您每次都需要调用create/merge(这是我们不需要的额外电话)您的解决方案可行,但有一个更好的+1作为答案此方法优于普通SQL脚本,因为脚本不知道您的db架构更改,需要手动更改。使用实体,您将能够在编译器时跟踪错误。是的,我同意,这比使用SQL脚本(如果密码为我+1)要好如果是加密或加密的,并且散列逻辑在Java应用程序中,这种方法会变得有点尴尬,因为要插入的密码值未知。有没有办法解决这个问题?