Implement enhanced login functionality with JWT, role-based permissions, and frontend integration
Added JWT-based login dialog with form validation and secure token handling on the frontend. Updated backend with role-based access control, privilege management, and refined security configurations. Extended database schema for user privileges and permissions.
This commit is contained in:
@@ -0,0 +1,16 @@
|
||||
package com.alttd.altitudeweb.database.web_db;
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Data;
|
||||
import lombok.NoArgsConstructor;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
@Data
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
public class PrivilegedUser {
|
||||
private int id;
|
||||
private String uuid;
|
||||
private List<String> permissions;
|
||||
}
|
||||
+102
@@ -0,0 +1,102 @@
|
||||
package com.alttd.altitudeweb.database.web_db;
|
||||
|
||||
import org.apache.ibatis.annotations.*;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public interface PrivilegedUserMapper {
|
||||
|
||||
/**
|
||||
* Retrieves a user by their UUID along with their permissions
|
||||
* @param uuid The UUID of the user to retrieve
|
||||
* @return The PrivilegedUser with their permissions, or null if not found
|
||||
*/
|
||||
@Select("""
|
||||
SELECT privileged_users.id, privileged_users.uuid, privileges.privileges as permission
|
||||
FROM privileged_users
|
||||
LEFT JOIN privileges ON privileged_users.id = privileges.user_id
|
||||
WHERE privileged_users.uuid = #{uuid}
|
||||
""")
|
||||
@Results({
|
||||
@Result(property = "id", column = "id"),
|
||||
@Result(property = "uuid", column = "uuid"),
|
||||
@Result(property = "permissions", column = "id", javaType = List.class,
|
||||
many = @Many(select = "getPermissionsForUser"))
|
||||
})
|
||||
PrivilegedUser getUserByUuid(@Param("uuid") String uuid);
|
||||
|
||||
/**
|
||||
* Retrieves all privileged users with their permissions
|
||||
* @return List of all privileged users with their permissions
|
||||
*/
|
||||
@Select("""
|
||||
SELECT id, uuid
|
||||
FROM privileged_users
|
||||
""")
|
||||
@Results({
|
||||
@Result(property = "id", column = "id"),
|
||||
@Result(property = "uuid", column = "uuid"),
|
||||
@Result(property = "permissions", column = "id", javaType = List.class,
|
||||
many = @Many(select = "getPermissionsForUser"))
|
||||
})
|
||||
List<PrivilegedUser> getAllUsers();
|
||||
|
||||
/**
|
||||
* Gets all permissions for a specific user
|
||||
* @param userId The ID of the user
|
||||
* @return List of permission strings
|
||||
*/
|
||||
@Select("""
|
||||
SELECT privileges
|
||||
FROM privileges
|
||||
WHERE user_id = #{userId}
|
||||
""")
|
||||
List<String> getPermissionsForUser(@Param("userId") int userId);
|
||||
|
||||
/**
|
||||
* Adds a new privileged user
|
||||
* @param user The PrivilegedUser object to add
|
||||
* @return The number of rows affected
|
||||
*/
|
||||
@Insert("""
|
||||
INSERT INTO privileged_users (uuid)
|
||||
VALUES (#{user.uuid})
|
||||
""")
|
||||
@Options(useGeneratedKeys = true, keyProperty = "user.id", keyColumn = "id")
|
||||
int addUser(@Param("user") PrivilegedUser user);
|
||||
|
||||
/**
|
||||
* Deletes a privileged user by their UUID
|
||||
* @param uuid The UUID of the user to delete
|
||||
* @return The number of rows affected
|
||||
*/
|
||||
@Delete("""
|
||||
DELETE FROM privileged_users
|
||||
WHERE uuid = #{uuid}
|
||||
""")
|
||||
int deleteUserByUuid(@Param("uuid") String uuid);
|
||||
|
||||
/**
|
||||
* Adds a permission to a user
|
||||
* @param userId The ID of the user
|
||||
* @param permission The permission to add
|
||||
* @return The number of rows affected
|
||||
*/
|
||||
@Insert("""
|
||||
INSERT INTO privileges (user_id, privileges)
|
||||
VALUES (#{userId}, #{permission})
|
||||
""")
|
||||
int addPermissionToUser(@Param("userId") int userId, @Param("permission") String permission);
|
||||
|
||||
/**
|
||||
* Removes a permission from a user
|
||||
* @param userId The ID of the user
|
||||
* @param permission The permission to remove
|
||||
* @return The number of rows affected
|
||||
*/
|
||||
@Delete("""
|
||||
DELETE FROM privileges
|
||||
WHERE user_id = #{userId} AND privileges = #{permission}
|
||||
""")
|
||||
int removePermissionFromUser(@Param("userId") int userId, @Param("permission") String permission);
|
||||
}
|
||||
@@ -5,6 +5,7 @@ import com.alttd.altitudeweb.database.web_db.KeyPairMapper;
|
||||
import com.alttd.altitudeweb.database.web_db.SettingsMapper;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.apache.ibatis.session.SqlSession;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import java.sql.SQLException;
|
||||
import java.sql.Statement;
|
||||
@@ -21,11 +22,13 @@ public class InitializeWebDb {
|
||||
.runQuery(SqlSession -> {
|
||||
createSettingsTable(SqlSession);
|
||||
createKeyTable(SqlSession);
|
||||
createPrivilegedUsersTable(SqlSession);
|
||||
createPrivilegesTable(SqlSession);
|
||||
});
|
||||
log.debug("Initialized WebDb");
|
||||
}
|
||||
|
||||
private static void createSettingsTable(SqlSession sqlSession) {
|
||||
private static void createSettingsTable(@NotNull SqlSession sqlSession) {
|
||||
String query = """
|
||||
CREATE TABLE IF NOT EXISTS db_connection_settings
|
||||
(
|
||||
@@ -45,7 +48,7 @@ public class InitializeWebDb {
|
||||
}
|
||||
}
|
||||
|
||||
private static void createKeyTable(SqlSession sqlSession) {
|
||||
private static void createKeyTable(@NotNull SqlSession sqlSession) {
|
||||
String query = """
|
||||
CREATE TABLE IF NOT EXISTS key_pair (
|
||||
id int NOT NULL AUTO_INCREMENT PRIMARY KEY,
|
||||
@@ -61,4 +64,37 @@ public class InitializeWebDb {
|
||||
}
|
||||
}
|
||||
|
||||
private static void createPrivilegedUsersTable(@NotNull SqlSession sqlSession) {
|
||||
String query = """
|
||||
CREATE TABLE IF NOT EXISTS privileged_users (
|
||||
id int NOT NULL AUTO_INCREMENT PRIMARY KEY,
|
||||
uuid VARCHAR(36) NOT NULL
|
||||
);
|
||||
""";
|
||||
try (Statement statement = sqlSession.getConnection().createStatement()) {
|
||||
statement.execute(query);
|
||||
} catch (SQLException e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
|
||||
private static void createPrivilegesTable(@NotNull SqlSession sqlSession) {
|
||||
String query = """
|
||||
CREATE TABLE IF NOT EXISTS privileges (
|
||||
id int NOT NULL AUTO_INCREMENT PRIMARY KEY,
|
||||
user_id int NOT NULL,
|
||||
privileges VARCHAR(36) NOT NULL,
|
||||
CONSTRAINT fk_privileges_user FOREIGN KEY (user_id)
|
||||
REFERENCES privileged_users(id)
|
||||
ON DELETE CASCADE
|
||||
ON UPDATE CASCADE
|
||||
);
|
||||
""";
|
||||
try (Statement statement = sqlSession.getConnection().createStatement()) {
|
||||
statement.execute(query);
|
||||
} catch (SQLException e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user