一、写在前面
在yml文件中,经常会配置一些数据库账号密码、加密盐值和端口等等重要信息,从代码安全上考虑,一旦源码泄漏,这些信息都会暴露在外网中。
因此,我希望对于项目中敏感信息可以配置到Linux的环境变量中,这样即使源码泄漏,对方拿到的敏感信息也只是一个占位符(除非对方能攻破服务器拿到环境变量)。
二、yaml配置
在企业项目的使用环境中,一般分为开发环境、测试环境和生产环境,这里为了简单演示效果,我只分为了开发环境和生产环境,yaml的结构目录如下:
开发环境中的yaml配置如下:
# 正式环境
spring:
datasource:
url: jdbc:mysql://127.0.0.1:3306/env_demo?serverTimezone=Asia/Shanghai&characterEncoding=UTF-8&nullCatalogMeansCurrent=true
username: root
password: 123456
driver-class-name: com.mysql.jdbc.Driver
生产环境中的配置如下:
# 正式环境
spring:
datasource:
url: jdbc:mysql://${SERVER_IP}:${DB_PORT}/${PROJECT_NAME}?serverTimezone=Asia/Shanghai&characterEncoding=UTF-8&nullCatalogMeansCurrent=true
username: ${DB_USERNAME}
password: ${DB_PASSWORD}
driver-class-name: com.mysql.jdbc.Driver
在yml主文件中,我们通过spring.profiles.active来控制实际使用哪个配置:
三、linux环境变量的配置
配置Linux环境变量,我们需要修改etc下的profile文件,以下是具体操作:
-
打开文件
vim /etc/profile
-
添加环境变量
- 重新生效文件
这里使用source命令来使我们添加的环境变量生效:
source /etc/profile
- 检查环境变量是否生效
使用命令export来查看环境变量
export
至此,环境变量配置完毕,我们来运行项目,查看是否拿到了环境变量
四、测试
我们这里写个工具类用于环境变量的获取:
@Configuration
@Getter
public class GlobalVariableUtil {
/**
* description 数据库连接地址
*/
@Value("${spring.datasource.url}")
private String dbUrl;
/**
* description 数据库连接用户名
*/
@Value("${spring.datasource.username}")
private String username;
/**
* description 数据库连接密码
*/
@Value("${spring.datasource.password}")
private String password;
}
再写个controller来拿取变量:
@RestController
@AllArgsConstructor
@RequestMapping("/api")
@Slf4j
public class UserController {
private GlobalVariableUtil globalVariableUtil;
/**
* description 获取所有用户
* @return 所有用户
*/
@GetMapping("/test")
public JSONObject getAllUser(){
JSONObject jsonObject = new JSONObject();
jsonObject.put("dbUrl",globalVariableUtil.getDbUrl());
jsonObject.put("username",globalVariableUtil.getUsername());
jsonObject.put("password",globalVariableUtil.getPassword());
return jsonObject;
}
}
- 开发环境
- 生产环境
五、注意事项
1.操作顺序:先新增环境变量,再运行项目
环境变量的新增应该优先于项目的部署,因为项目运行后,会首先从Linux环境中获取变量并加载到容器中,如果项目运行后再去添加环境变量,此时环境变量是拿不到;同理,如果要修改环境变量,在source命令后,仍然需要重启项目,以重新加载