```xml
<dependency>
    <groupId>org.noear</groupId>
    <artifactId>solon-security-vault</artifactId>
</dependency>
```

#### 1、描述

安全扩展插件，提供项目的配置脱敏支持（比如，数据库连接的信息）。只是让敏感信息不直接暴露，不能完全的保密。


#### 2、配置示例

```yaml
solon.vault:
  password: "liylU9PhDq63tk1C"
```

密码（默认算法要求 16 位。建议有大小写、有数字），可以通过启动参数传入。或许更安全些，例：

* `java -Dsolon.vault.password=xxx -jar demo.jar`

#### 3、代码应用

* 使用工具类生成密文

```java
public class TestApp {
    public static void main(String[] args) throws Exception{
        Solon.start(TestApp.class, args);

        //打印生成的密文
        System.out.println(VaultUtils.encrypt("root"));
    }
}
```

* 使用生成的密文配置敏感信息，并使用专有注解注入

```yaml
solon.vault:
  password: "liylU9PhDq63tk1C"

test.db1:
  url: "..."
  username: "ENC(xo1zJjGXUouQ/CZac55HZA==)"
  password: "ENC(XgRqh3C00JmkjsPi4mPySA==)"
```


使用 `@VaultInject` 做密文配置的注入:

```java
@Configuration
public class TestConfig {
    @Bean("db2")
    private DataSource db2(@VaultInject("${test.db1}") HikariDataSource ds){
        return ds;
    }
}
```

或者使用 `VaultUtils` 手动处理

```java
//解密一块配置
Props props = Solon.cfg().getProp("test.db1");
VaultUtils.guard(props);
HikariDataSource ds = props.getBean(HikariDataSource.class);

//解密一个配置
String name = VaultUtils.guard(Solon.cfg().get("test.demo.name"));
```


#### 4、定制加密算法（没事儿，不用搞定制）

```java
@Component
public class VaultCoderImpl implements VaultCoder {
    private final String password;
    
    public VaultCoderImpl() {
        //密码的配置键也可以换掉
        this.password = Solon.cfg().get("solon.vault.password");
    }
    
    @Override
    public String encrypt(String str) throws Exception {
        return null;
    }

    @Override
    public String decrypt(String str) throws Exception {
        return null;
    }
}

//或者

@Configuration
public class Config {
    @Bean
    public VaultCoder vaultCoderInit(){
        return new AesVaultCoder();
    } 
}
```

