+
This commit is contained in:
@ -1,128 +0,0 @@
|
|||||||
|
|
||||||
Загрузить в HashiCorp Vault настройки можно так:
|
|
||||||
|
|
||||||
```sh
|
|
||||||
vault kv put secret/org-ccalm-jwt \
|
|
||||||
jwt.secret=my-secret-value \
|
|
||||||
db.user=admin \
|
|
||||||
db.pass=123456
|
|
||||||
```
|
|
||||||
|
|
||||||
Разбор параметров:
|
|
||||||
1. vault kv put – команда для записи ключей и значений в KV-хранилище Vault.
|
|
||||||
2. secret/org-ccalm-jwt – путь к секрету.
|
|
||||||
* secret/ – это backend-хранилище (оно должно быть включено в Vault).
|
|
||||||
* org-ccalm-jwt – имя секрета, под которым сохраняются параметры.
|
|
||||||
3. jwt.secret=my-secret-value – ключ jwt.secret со значением my-secret-value.
|
|
||||||
4. db.user=admin – ключ db.user со значением admin.
|
|
||||||
5. db.pass=123456 – ключ db.pass со значением 123456.
|
|
||||||
|
|
||||||
|
|
||||||
# 🚀 Установка и настройка HashiCorp Vault на Windows
|
|
||||||
|
|
||||||
## 📌 1. Установка HashiCorp Vault
|
|
||||||
|
|
||||||
1. **Скачайте Vault CLI** с официального сайта:
|
|
||||||
🔗 [https://developer.hashicorp.com/vault/downloads](https://developer.hashicorp.com/vault/downloads)
|
|
||||||
2. Распакуйте архив и **добавьте путь к `vault.exe` в `PATH`**:
|
|
||||||
- Кликните **ПКМ → Этот компьютер → Свойства → Дополнительные параметры системы**.
|
|
||||||
- В **Переменные среды** добавьте путь к папке с `vault.exe`.
|
|
||||||
3. Откройте **cmd** или **PowerShell** и проверьте установку командой:
|
|
||||||
```sh
|
|
||||||
vault --version
|
|
||||||
```
|
|
||||||
Если всё ОК, увидите версию Vault. Примерно такую: Vault v1.18.4 (503be623a3697e8c10c254dc87d26492c46753e1), built 2025-01-29T13:57:54Z
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 📌 2. Запуск Vault-сервера (разработческий режим)
|
|
||||||
|
|
||||||
Чтобы локально запустить Vault в **dev-режиме** (без авторизации), выполните:
|
|
||||||
```sh
|
|
||||||
vault server -dev
|
|
||||||
```
|
|
||||||
После запуска он покажет **root-токен** (сохраните его!):
|
|
||||||
```plaintext
|
|
||||||
Unseal Key: 9OSMJSPNCs9IT/H5OzLz17jW/vogeCAWQbXy2K7LRPQ=
|
|
||||||
Root Token: hvs.JDIyKgDMagA0WyIhLFQ4mAjZ
|
|
||||||
```
|
|
||||||
|
|
||||||
Теперь Vault работает по адресу:
|
|
||||||
```
|
|
||||||
http://127.0.0.1:8200
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 📌 3. Экспорт токена (чтобы не вводить каждый раз)
|
|
||||||
|
|
||||||
Откройте **PowerShell** и выполните:
|
|
||||||
```sh
|
|
||||||
$env:VAULT_ADDR="http://127.0.0.1:8200"
|
|
||||||
$env:VAULT_TOKEN="hvs.JDIyKgDMagA0WyIhLFQ4mAjZ"
|
|
||||||
```
|
|
||||||
(Замените `hvs.JDIyKgDMagA0WyIhLFQ4mAjZ` на свой токен.)
|
|
||||||
|
|
||||||
Теперь можно работать с Vault без ввода токена каждый раз.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 📌 4. Запись значений в Vault на Windows
|
|
||||||
|
|
||||||
Если нужно с версионированием то Используйте команду:
|
|
||||||
```sh
|
|
||||||
vault kv put secret/org-ccalm-jwt jwt.secret=my-secret-value db.user=admin db.pass=123456
|
|
||||||
```
|
|
||||||
Если у вас **KV v1**, используйте:
|
|
||||||
```sh
|
|
||||||
vault write secret/org-ccalm-jwt jwt.secret=my-secret-value db.user=admin db.pass=123456
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 📌 5. Проверка сохранённых данных
|
|
||||||
|
|
||||||
Чтобы посмотреть, что записано в Vault:
|
|
||||||
```sh
|
|
||||||
vault kv get secret/org-ccalm-jwt
|
|
||||||
```
|
|
||||||
Если всё настроено правильно, вы увидите примерно такой вывод:
|
|
||||||
```plaintext
|
|
||||||
====== Metadata ======
|
|
||||||
Key Value
|
|
||||||
--- -----
|
|
||||||
created_time 2025-02-24T12:00:00Z
|
|
||||||
version 1
|
|
||||||
|
|
||||||
====== Data ======
|
|
||||||
Key Value
|
|
||||||
--- -----
|
|
||||||
db.pass 123456
|
|
||||||
db.user admin
|
|
||||||
jwt.secret my-secret-value
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 📌 6. Удаление данных из Vault
|
|
||||||
|
|
||||||
Удаление данных:
|
|
||||||
```sh
|
|
||||||
vault kv delete secret/org-ccalm-jwt
|
|
||||||
```
|
|
||||||
Полное уничтожение (без возможности восстановления):
|
|
||||||
```sh
|
|
||||||
vault kv destroy -versions=1 secret/org-ccalm-jwt
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 🎯 Итог
|
|
||||||
✅ Установили Vault CLI
|
|
||||||
✅ Запустили Vault сервер (`vault server -dev`)
|
|
||||||
✅ Экспортировали `VAULT_ADDR` и `VAULT_TOKEN`
|
|
||||||
✅ Записали настройки в Vault
|
|
||||||
✅ Проверили данные
|
|
||||||
|
|
||||||
Теперь можно интегрировать Vault в Spring Boot 🚀
|
|
||||||
|
|
||||||
@ -9,8 +9,8 @@ Refresh token токен действует 12 часов и за эти 12 ча
|
|||||||
|
|
||||||
vault kv put secret/org-ccalm-jwt jwt.secret=my-secret-value db.user=admin db.pass=123456
|
vault kv put secret/org-ccalm-jwt jwt.secret=my-secret-value db.user=admin db.pass=123456
|
||||||
|
|
||||||
|
В базе есть поля такие как e_iin и они записываются так: pgp_sym_encrypt('Мои данные', 'пароль')
|
||||||
|
Читаются так: select pgp_sym_decrypt(e_name, 'пароль') from main.drivers;
|
||||||
|
|
||||||
|
|
||||||
____
|
____
|
||||||
|
|||||||
@ -468,7 +468,7 @@ public class MainController implements ServletContextAware {
|
|||||||
|
|
||||||
String sql = """
|
String sql = """
|
||||||
select
|
select
|
||||||
name1
|
name
|
||||||
from
|
from
|
||||||
main.get_access_list(:user_id)
|
main.get_access_list(:user_id)
|
||||||
where
|
where
|
||||||
@ -648,7 +648,7 @@ public class MainController implements ServletContextAware {
|
|||||||
//parameters.addValue("phone",);
|
//parameters.addValue("phone",);
|
||||||
parameters.addValue("email",newUserModel.getEmail());
|
parameters.addValue("email",newUserModel.getEmail());
|
||||||
parameters.addValue("e_iin",newUserModel.getIin()); //Для ЭЦП это поле обязательно
|
parameters.addValue("e_iin",newUserModel.getIin()); //Для ЭЦП это поле обязательно
|
||||||
parameters.addValue("key",newUserModel.getIin());
|
parameters.addValue("key",personal_data_key);
|
||||||
parameters.addValue("password",password);
|
parameters.addValue("password",password);
|
||||||
|
|
||||||
ret = jdbcTemplate.query(sql, parameters, new DBTools.JsonRowMapper());
|
ret = jdbcTemplate.query(sql, parameters, new DBTools.JsonRowMapper());
|
||||||
@ -847,7 +847,7 @@ public class MainController implements ServletContextAware {
|
|||||||
}catch (DataAccessException ex){
|
}catch (DataAccessException ex){
|
||||||
String uuid = UUID.randomUUID().toString();
|
String uuid = UUID.randomUUID().toString();
|
||||||
logger.error(uuid,ex);
|
logger.error(uuid,ex);
|
||||||
throw new CustomException(10000, trt.trt("Error_executing_SQL_query"),uuid);
|
throw new CustomException(10000, trt.trt("Internal_Server_Error"),uuid);
|
||||||
}
|
}
|
||||||
if(json==null) {
|
if(json==null) {
|
||||||
String msg = trt.trt("Invalid_username_and_or_password");
|
String msg = trt.trt("Invalid_username_and_or_password");
|
||||||
@ -1063,8 +1063,8 @@ public class MainController implements ServletContextAware {
|
|||||||
}
|
}
|
||||||
}catch (DataAccessException ex){
|
}catch (DataAccessException ex){
|
||||||
java.lang.String uuid = UUID.randomUUID().toString();
|
java.lang.String uuid = UUID.randomUUID().toString();
|
||||||
logger.error("Error executing SQL query", uuid, ex);
|
logger.error(uuid, ex);
|
||||||
throw new CustomException(10000, trt.trt("Error_executing_SQL_query"),uuid);
|
throw new CustomException(10000, trt.trt("Internal_Server_Error"),uuid);
|
||||||
}catch (Exception e) {
|
}catch (Exception e) {
|
||||||
String uuid = UUID.randomUUID().toString();
|
String uuid = UUID.randomUUID().toString();
|
||||||
logger.error(uuid,e);
|
logger.error(uuid,e);
|
||||||
@ -1240,12 +1240,8 @@ public class MainController implements ServletContextAware {
|
|||||||
@RequestMapping(value = "/logout",method = {RequestMethod.POST,RequestMethod.GET},produces = "application/json;charset=utf-8")
|
@RequestMapping(value = "/logout",method = {RequestMethod.POST,RequestMethod.GET},produces = "application/json;charset=utf-8")
|
||||||
@ResponseBody
|
@ResponseBody
|
||||||
public String logout(HttpServletResponse response,HttpServletRequest request) {
|
public String logout(HttpServletResponse response,HttpServletRequest request) {
|
||||||
|
|
||||||
//Устанавливает куки
|
|
||||||
setAccessCookie(response,"");
|
setAccessCookie(response,"");
|
||||||
|
|
||||||
setRefreshCookie(response, request, "");
|
setRefreshCookie(response, request, "");
|
||||||
|
|
||||||
return createStrJSONError(0,"",(String)null,(String)null);
|
return createStrJSONError(0,"",(String)null,(String)null);
|
||||||
}
|
}
|
||||||
//------------------------------------------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------------------------------------------
|
||||||
@ -1634,20 +1630,7 @@ public class MainController implements ServletContextAware {
|
|||||||
throw new CustomException(10000, Collections.singletonList(trt.trt("Please_log_in")),null);
|
throw new CustomException(10000, Collections.singletonList(trt.trt("Please_log_in")),null);
|
||||||
}
|
}
|
||||||
UserDetails userDetails = (UserDetails) authentication.getPrincipal();
|
UserDetails userDetails = (UserDetails) authentication.getPrincipal();
|
||||||
/*if(jwt_a.isEmpty() || countOccurrences(jwt_a, '.')!=2)
|
|
||||||
{
|
|
||||||
throw new CustomException(10000, Collections.singletonList(trt.trt("Please_log_in")),null);
|
|
||||||
}
|
|
||||||
//Checking the token signature
|
|
||||||
Jws<Claims> claims = null;
|
|
||||||
try {
|
|
||||||
claims = Jwts.parserBuilder()
|
|
||||||
.setSigningKey(getPublicKey()) //.setSigningKey(key_a)
|
|
||||||
.build()
|
|
||||||
.parseClaimsJws(jwt_a);
|
|
||||||
} catch (Exception e) {
|
|
||||||
throw new CustomException(10000, Arrays.asList(trt.trt("Please_log_in"), trt.trt("JWT_token_verification_error")),null);
|
|
||||||
}*/
|
|
||||||
//If this is a repeat authorization, then we inform the client about it
|
//If this is a repeat authorization, then we inform the client about it
|
||||||
String result=null;
|
String result=null;
|
||||||
try(Cache cache = new Cache(redis_host,redis_port,redis_password)) {
|
try(Cache cache = new Cache(redis_host,redis_port,redis_password)) {
|
||||||
|
|||||||
@ -51,7 +51,7 @@ public class SecurityConfig {
|
|||||||
protected boolean shouldNotFilter(HttpServletRequest request) throws ServletException {
|
protected boolean shouldNotFilter(HttpServletRequest request) throws ServletException {
|
||||||
String path = request.getRequestURI();
|
String path = request.getRequestURI();
|
||||||
System.out.println(path); // https://127.0.0.1:8082/logout
|
System.out.println(path); // https://127.0.0.1:8082/logout
|
||||||
return path.equals("/") || path.equals("/login") || path.equals("/logout") || path.equals("/create");
|
return path.equals("/") || path.equals("/login") || path.equals("/logout") || path.equals("/create") || path.equals("/reset");
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@ -12,7 +12,6 @@ import java.io.IOException;
|
|||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
import java.util.Properties;
|
import java.util.Properties;
|
||||||
|
|
||||||
|
|
||||||
public class Cache implements AutoCloseable {
|
public class Cache implements AutoCloseable {
|
||||||
|
|
||||||
private static final Logger logger = LogManager.getLogger(Cache.class);
|
private static final Logger logger = LogManager.getLogger(Cache.class);
|
||||||
@ -60,4 +59,4 @@ public class Cache implements AutoCloseable {
|
|||||||
public void delete(String key) {
|
public void delete(String key) {
|
||||||
jedis.del(key.getBytes());
|
jedis.del(key.getBytes());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user