Авторификация работает и тест авторификации проходит.

(создание пользователя, два этапа создания сессии и рефреш сессии)
This commit is contained in:
AidarKC
2025-12-09 20:04:18 +03:00
parent 2ed4f6d666
commit 888bb1595f
12 changed files with 723 additions and 372 deletions
@@ -5,7 +5,11 @@ import shine.db.entities.ActiveSession;
import java.sql.*;
/** Здесь мы храним данные об активных сессиях пользователя (для wss соединений). */
/**
* DAO для таблицы active_sessions.
*
* Здесь мы храним данные об активных сессиях пользователя (для wss-соединений).
*/
public final class ActiveSessionsDAO {
private static volatile ActiveSessionsDAO instance;
@@ -25,18 +29,21 @@ public final class ActiveSessionsDAO {
return instance;
}
/**
* Вставка новой сессии.
*/
public void insert(ActiveSession session) throws SQLException {
String sql = """
INSERT INTO active_sessions (
sessionId,
loginId,
session_pwd,
storage_pwd,
session_created_ms,
last_auth_ms,
push_endpoint,
push_p256dh_key,
push_auth_key
sessionPwd,
storagePwd,
sessionCreatedAtMs,
lastAuthirificatedAtMs,
pushEndpoint,
pushP256dhKey,
pushAuthKey
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
""";
@@ -50,22 +57,26 @@ public final class ActiveSessionsDAO {
ps.setString(7, session.getPushEndpoint());
ps.setString(8, session.getPushP256dhKey());
ps.setString(9, session.getPushAuthKey());
ps.executeUpdate();
}
}
/**
* Получить сессию по sessionId.
*/
public ActiveSession getBySessionId(String sessionId) throws SQLException {
String sql = """
SELECT
sessionId,
loginId,
session_pwd,
storage_pwd,
session_created_ms,
last_auth_ms,
push_endpoint,
push_p256dh_key,
push_auth_key
sessionPwd,
storagePwd,
sessionCreatedAtMs,
lastAuthirificatedAtMs,
pushEndpoint,
pushP256dhKey,
pushAuthKey
FROM active_sessions
WHERE sessionId = ?
""";
@@ -81,6 +92,23 @@ public final class ActiveSessionsDAO {
}
}
/**
* Обновить только lastAuthirificatedAtMs для конкретной сессии.
*/
public void updateLastAuthirificatedAtMs(String sessionId, long lastAuthMs) throws SQLException {
String sql = """
UPDATE active_sessions
SET lastAuthirificatedAtMs = ?
WHERE sessionId = ?
""";
try (PreparedStatement ps = db.getConnection().prepareStatement(sql)) {
ps.setLong(1, lastAuthMs);
ps.setString(2, sessionId);
ps.executeUpdate();
}
}
/**
* Удаление записи по sessionId.
* Если записи нет — просто ничего не удалит (0 строк).
@@ -94,42 +122,24 @@ public final class ActiveSessionsDAO {
}
}
/**
* Обновить поле last_auth_ms (lastAuthirificatedAtMs) для конкретной сессии.
* Остальные поля записи не меняются.
*/
public void updateLastAuthirificatedAtMs(String sessionId, long newTimeMs) throws SQLException {
String sql = """
UPDATE active_sessions
SET last_auth_ms = ?
WHERE sessionId = ?
""";
try (PreparedStatement ps = db.getConnection().prepareStatement(sql)) {
ps.setLong(1, newTimeMs);
ps.setString(2, sessionId);
ps.executeUpdate();
}
}
private ActiveSession mapRow(ResultSet rs) throws SQLException {
String sessionId = rs.getString("sessionId");
long loginId = rs.getLong("loginId");
String sessionPwd = rs.getString("session_pwd");
String storagePwd = rs.getString("storage_pwd");
long sessionCreatedMs = rs.getLong("session_created_ms");
long lastAuthMs = rs.getLong("last_auth_ms");
String pushEndpoint = rs.getString("push_endpoint");
String pushP256dhKey = rs.getString("push_p256dh_key");
String pushAuthKey = rs.getString("push_auth_key");
String sessionPwd = rs.getString("sessionPwd");
String storagePwd = rs.getString("storagePwd");
long sessionCreatedAtMs = rs.getLong("sessionCreatedAtMs");
long lastAuthirificatedAtMs = rs.getLong("lastAuthirificatedAtMs");
String pushEndpoint = rs.getString("pushEndpoint");
String pushP256dhKey = rs.getString("pushP256dhKey");
String pushAuthKey = rs.getString("pushAuthKey");
return new ActiveSession(
sessionId,
loginId,
sessionPwd,
storagePwd,
sessionCreatedMs,
lastAuthMs,
sessionCreatedAtMs,
lastAuthirificatedAtMs,
pushEndpoint,
pushP256dhKey,
pushAuthKey
@@ -7,8 +7,17 @@ import java.sql.*;
import java.util.ArrayList;
import java.util.List;
/** Здесь храним данные об пользователях - локальная копия того что есть в солане */
/**
* SolanaUsersDAO — локальная таблица пользователей из Solana.
*
* Колонки:
* - login TEXT
* - loginId INTEGER (PK)
* - bchId INTEGER
* - loginKey TEXT
* - deviceKey TEXT
* - bchLimit INTEGER (может быть NULL)
*/
public final class SolanaUsersDAO {
private static volatile SolanaUsersDAO instance;
@@ -29,7 +38,7 @@ public final class SolanaUsersDAO {
public void insert(SolanaUser user) throws SQLException {
String sql = """
INSERT INTO solana_users (login, loginId, bchId, pubkey0, pubkey1, bchLimit)
INSERT INTO solana_users (login, loginId, bchId, loginKey, deviceKey, bchLimit)
VALUES (?, ?, ?, ?, ?, ?)
""";
@@ -37,8 +46,8 @@ public final class SolanaUsersDAO {
ps.setString(1, user.getLogin());
ps.setLong(2, user.getLoginId());
ps.setLong(3, user.getBchId());
ps.setString(4, user.getPubkey0());
ps.setString(5, user.getPubkey1());
ps.setString(4, user.getLoginKey());
ps.setString(5, user.getDeviceKey());
if (user.getBchLimit() != null) {
ps.setInt(6, user.getBchLimit());
@@ -52,7 +61,7 @@ public final class SolanaUsersDAO {
public SolanaUser getByLoginId(long loginId) throws SQLException {
String sql = """
SELECT login, loginId, bchId, pubkey0, pubkey1, bchLimit
SELECT login, loginId, bchId, loginKey, deviceKey, bchLimit
FROM solana_users
WHERE loginId = ?
""";
@@ -69,7 +78,7 @@ public final class SolanaUsersDAO {
public SolanaUser getByLogin(String login) throws SQLException {
String sql = """
SELECT login, loginId, bchId, pubkey0, pubkey1, bchLimit
SELECT login, loginId, bchId, loginKey, deviceKey, bchLimit
FROM solana_users
WHERE LOWER(login) = LOWER(?)
""";
@@ -86,7 +95,7 @@ public final class SolanaUsersDAO {
public List<SolanaUser> searchByLoginPrefix(String prefix) throws SQLException {
String sql = """
SELECT login, loginId, bchId, pubkey0, pubkey1, bchLimit
SELECT login, loginId, bchId, loginKey, deviceKey, bchLimit
FROM solana_users
WHERE LOWER(login) LIKE ?
ORDER BY login
@@ -111,8 +120,8 @@ public final class SolanaUsersDAO {
rs.getLong("loginId"),
rs.getString("login"),
rs.getLong("bchId"),
rs.getString("pubkey0"),
rs.getString("pubkey1"),
rs.getString("loginKey"),
rs.getString("deviceKey"),
rs.getObject("bchLimit") != null ? rs.getInt("bchLimit") : null
);
}