콘텐츠로 이동

그룹 시스템

XOOPS 그룹 시스템은 사용자를 구성하고 집합적 권한을 관리하기 위한 계층적 프레임워크를 제공합니다. 이 문서에서는 기본 그룹, 사용자 정의 그룹 생성, 계층 구조 및 실제 구현을 다룹니다.

XOOPS에는 시스템 설치 중에 생성되는 세 가지 기본 그룹이 포함되어 있습니다.

웹마스터 그룹은 전체 시스템 액세스 권한을 가진 사이트 관리자를 나타냅니다.

특성:

  • 그룹ID : 1
  • 가장 높은 권한 수준
  • 삭제할 수 없습니다.
  • 모든 모듈 및 기능에 대한 전체 액세스 권한
  • 관리 패널에 대한 액세스
<?php
/**
* Check if user is webmaster
*/
$groupHandler = xoops_getHandler('group');
$group = $groupHandler->getGroup(1);
$webmasterUsers = $groupHandler->getUsersByGroup(1);
if ($xoopsUser instanceof XoopsUser) {
$groups = $xoopsUser->getGroups();
if (in_array(1, $groups)) {
// User is a webmaster
echo "Welcome, Site Administrator!";
}
}

등록된 사용자 그룹에는 익명이 아닌 인증된 모든 사용자가 포함됩니다.

특성:

  • 그룹ID : 2
  • 신규 등록 시 기본 그룹
  • 사용자별 기능에 액세스할 수 있습니다.
  • 그룹 기반 권한이 적용됩니다.
  • 표준 사용자 기능에 맞게 사용자 정의 가능
<?php
/**
* Check if user is registered (not anonymous)
*/
if ($xoopsUser instanceof XoopsUser) {
// User is logged in
$groups = $xoopsUser->getGroups();
if (in_array(2, $groups)) {
// User is in registered group
echo "Welcome, registered user!";
}
}

익명 그룹은 사이트에 대한 인증되지 않은 방문자를 나타냅니다.

특성:

  • 그룹ID : 3
  • 로그인하지 않은 사용자를 위한 기본 그룹
  • 일반적으로 제한된 읽기 전용 액세스
  • 내용을 수정할 수 없습니다.
  • 공개 시청 권한
<?php
/**
* Check if user is anonymous
*/
if (!$xoopsUser instanceof XoopsUser) {
// User is not logged in
echo "Public content only";
}
// Alternative using group check
$anonymousUsers = xoops_getHandler('group')->getUsersByGroup(3);
CREATE TABLE xoops_groups (
group_id INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
group_name VARCHAR(255) NOT NULL UNIQUE,
group_description TEXT,
group_type TINYINT(1) NOT NULL DEFAULT 0,
group_active TINYINT(1) NOT NULL DEFAULT 1,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
CREATE TABLE xoops_group_users (
group_id INT(11) NOT NULL,
uid INT(11) NOT NULL,
PRIMARY KEY (group_id, uid),
FOREIGN KEY (group_id) REFERENCES xoops_groups(group_id) ON DELETE CASCADE,
FOREIGN KEY (uid) REFERENCES xoops_users(uid) ON DELETE CASCADE
);
class XoopsGroup
{
protected $group_id;
protected $group_name;
protected $group_description;
protected $group_type;
protected $group_active;
protected $created_at;
protected $updated_at;
}
graph TD
ROOT["XOOPS System"]
ROOT --> G1["Webmasters<br/>Group 1<br/>Admin Access"]
ROOT --> G2["Registered Users<br/>Group 2<br/>Standard Access"]
ROOT --> G3["Anonymous<br/>Group 3<br/>Public Access"]
ROOT --> GC["Custom Groups"]
G1 --> P1["Full System Access"]
G1 --> P2["Module Management"]
G1 --> P3["User Administration"]
G1 --> P4["Permission Control"]
G2 --> Q1["Profile Management"]
G2 --> Q2["Content Submission"]
Q2 --> Q2A["Edit Own Content"]
Q2 --> Q2B["Delete Own Content"]
G2 --> Q3["Forum Participation"]
G3 --> R1["View Public Content"]
G3 --> R2["No Modifications"]
G3 --> R3["Limited Features"]
GC --> C1["Department Groups"]
GC --> C2["Role-Based Groups"]
GC --> C3["Project Groups"]
C1 --> C1A["Marketing Team"]
C1 --> C1B["Development Team"]
C1 --> C1C["Support Team"]
sequenceDiagram
participant System as XOOPS System
participant User as User
participant Groups as User Groups
participant Perms as Permissions Engine
System->>User: Identify User
User->>Groups: Retrieve Member Groups
Groups-->>Perms: Group List
Perms->>Perms: Collect Group Permissions
Perms->>Perms: Merge Permissions
Perms->>Perms: Apply Hierarchy
Perms-->>System: Final Permission Set
System->>System: Grant/Deny Access
<?php
/**
* Custom Group Management
*/
class GroupManager
{
private $groupHandler;
private $permissionHandler;
public function __construct()
{
$this->groupHandler = xoops_getHandler('group');
$this->permissionHandler = xoops_getHandler('permission');
}
/**
* Create new group
*
* @param array $data Group data
* @return XoopsGroup|false New group or false
*/
public function createGroup(array $data)
{
// Validate input
if (empty($data['group_name'])) {
throw new Exception('Group name is required');
}
if (strlen($data['group_name']) < 3 || strlen($data['group_name']) > 255) {
throw new Exception('Group name must be between 3 and 255 characters');
}
// Check if group already exists
$existing = $this->groupHandler->getByName($data['group_name']);
if ($existing) {
throw new Exception('Group already exists');
}
// Create group object
$group = $this->groupHandler->create();
$group->setVar('group_name', $data['group_name']);
$group->setVar('group_description', $data['group_description'] ?? '');
$group->setVar('group_type', $data['group_type'] ?? 0);
$group->setVar('group_active', $data['group_active'] ?? 1);
// Save group
if ($this->groupHandler->insert($group)) {
return $group;
}
return false;
}
/**
* Update group
*
* @param int $groupId Group ID
* @param array $data Update data
* @return bool Success status
*/
public function updateGroup(int $groupId, array $data): bool
{
$group = $this->groupHandler->get($groupId);
if (!$group) {
return false;
}
// Prevent modification of default groups
if (in_array($groupId, [1, 2, 3])) {
if (isset($data['group_name']) && $data['group_name'] !== $group->getVar('group_name')) {
throw new Exception('Cannot rename default groups');
}
}
if (isset($data['group_name'])) {
$group->setVar('group_name', $data['group_name']);
}
if (isset($data['group_description'])) {
$group->setVar('group_description', $data['group_description']);
}
if (isset($data['group_active']) && !in_array($groupId, [1, 2, 3])) {
$group->setVar('group_active', (int)$data['group_active']);
}
if (isset($data['group_type'])) {
$group->setVar('group_type', (int)$data['group_type']);
}
return $this->groupHandler->insert($group);
}
/**
* Add user to group
*
* @param int $uid User ID
* @param int $groupId Group ID
* @return bool Success status
*/
public function addUserToGroup(int $uid, int $groupId): bool
{
return $this->groupHandler->addUser($uid, $groupId);
}
/**
* Remove user from group
*
* @param int $uid User ID
* @param int $groupId Group ID
* @return bool Success status
*/
public function removeUserFromGroup(int $uid, int $groupId): bool
{
return $this->groupHandler->removeUser($uid, $groupId);
}
/**
* Get group members
*
* @param int $groupId Group ID
* @return array Array of user objects
*/
public function getGroupMembers(int $groupId): array
{
return $this->groupHandler->getUsersByGroup($groupId);
}
/**
* Get user groups
*
* @param int $uid User ID
* @return array Array of group objects
*/
public function getUserGroups(int $uid): array
{
return $this->groupHandler->getGroupsByUser($uid);
}
/**
* Delete group
*
* @param int $groupId Group ID
* @return bool Success status
*/
public function deleteGroup(int $groupId): bool
{
// Prevent deletion of default groups
if (in_array($groupId, [1, 2, 3])) {
throw new Exception('Cannot delete default groups');
}
// Remove all group users first
$db = XoopsDatabaseFactory::getDatabaseConnection();
$db->query("DELETE FROM xoops_group_users WHERE group_id = ?", array($groupId));
// Delete group permissions
$db->query("DELETE FROM xoops_group_permission WHERE group_id = ?", array($groupId));
// Delete group
return $this->groupHandler->delete($groupId);
}
}
<?php
/**
* Group Permission Assignment
*/
class GroupPermissionAssignment
{
private $permissionHandler;
private $groupHandler;
private $moduleHandler;
public function __construct()
{
$this->permissionHandler = xoops_getHandler('groupperm');
$this->groupHandler = xoops_getHandler('group');
$this->moduleHandler = xoops_getHandler('module');
}
/**
* Grant module permission to group
*
* @param int $groupId Group ID
* @param string $permission Permission name
* @param int $moduleId Module ID
* @param array $itemIds Item IDs (optional)
* @return bool Success status
*/
public function grantModulePermission(
int $groupId,
string $permission,
int $moduleId,
array $itemIds = []
): bool
{
if (empty($itemIds)) {
// Grant module-level permission
return $this->permissionHandler->addRight(
$permission,
$groupId,
$moduleId
);
} else {
// Grant item-level permissions
foreach ($itemIds as $itemId) {
$this->permissionHandler->addRight(
$permission,
$groupId,
$moduleId,
$itemId
);
}
return true;
}
}
/**
* Revoke module permission from group
*
* @param int $groupId Group ID
* @param string $permission Permission name
* @param int $moduleId Module ID
* @param array $itemIds Item IDs (optional)
* @return bool Success status
*/
public function revokeModulePermission(
int $groupId,
string $permission,
int $moduleId,
array $itemIds = []
): bool
{
if (empty($itemIds)) {
return $this->permissionHandler->deleteRight(
$permission,
$groupId,
$moduleId
);
} else {
foreach ($itemIds as $itemId) {
$this->permissionHandler->deleteRight(
$permission,
$groupId,
$moduleId,
$itemId
);
}
return true;
}
}
/**
* Check if group has permission
*
* @param int $groupId Group ID
* @param string $permission Permission name
* @param int $moduleId Module ID
* @param int $itemId Item ID (optional)
* @return bool Permission status
*/
public function hasPermission(
int $groupId,
string $permission,
int $moduleId,
int $itemId = 0
): bool
{
return $this->permissionHandler->checkRight(
$permission,
$groupId,
$moduleId,
$itemId
);
}
/**
* Get all permissions for group in module
*
* @param int $groupId Group ID
* @param int $moduleId Module ID
* @return array Permission list
*/
public function getGroupModulePermissions(
int $groupId,
int $moduleId
): array
{
return $this->permissionHandler->getGroupPermissions(
$groupId,
$moduleId
);
}
/**
* Assign multiple permissions at once
*
* @param int $groupId Group ID
* @param array $permissions Permission data
* @return bool Success status
*/
public function assignBulkPermissions(int $groupId, array $permissions): bool
{
try {
foreach ($permissions as $perm) {
$this->grantModulePermission(
$groupId,
$perm['permission'],
$perm['module_id'],
$perm['item_ids'] ?? []
);
}
return true;
} catch (Exception $e) {
return false;
}
}
}
<?php
/**
* Example: Setting up department groups
*/
$groupManager = new GroupManager();
$permissionAssigner = new GroupPermissionAssignment();
// Create Marketing Department group
$marketingGroup = $groupManager->createGroup([
'group_name' => 'Marketing Department',
'group_description' => 'Marketing team members',
'group_type' => 1,
'group_active' => 1
]);
$marketingId = $marketingGroup->getVar('group_id');
// Create Development Department group
$devGroup = $groupManager->createGroup([
'group_name' => 'Development Department',
'group_description' => 'Development team members',
'group_type' => 1,
'group_active' => 1
]);
$devId = $devGroup->getVar('group_id');
// Add users to groups
$groupManager->addUserToGroup(5, $marketingId);
$groupManager->addUserToGroup(6, $marketingId);
$groupManager->addUserToGroup(7, $devId);
$groupManager->addUserToGroup(8, $devId);
// Assign permissions
// Marketing can view and submit articles
$permissionAssigner->grantModulePermission(
$marketingId,
'module_view',
2 // Article module
);
$permissionAssigner->grantModulePermission(
$marketingId,
'module_submit',
2
);
// Dev can access all development tools
$permissionAssigner->grantModulePermission(
$devId,
'module_view',
4 // Developer module
);
$permissionAssigner->grantModulePermission(
$devId,
'module_admin',
4
);
<?php
/**
* Example: Checking user group membership
*/
$groupManager = new GroupManager();
$xoopsUser = $GLOBALS['xoopsUser'];
if ($xoopsUser instanceof XoopsUser) {
$userGroups = $groupManager->getUserGroups($xoopsUser->getVar('uid'));
// Check specific group membership
$isInMarketing = false;
foreach ($userGroups as $group) {
if ($group->getVar('group_name') === 'Marketing Department') {
$isInMarketing = true;
break;
}
}
if ($isInMarketing) {
echo "Welcome to Marketing!";
}
// Get group names
$groupNames = array_map(function($g) {
return $g->getVar('group_name');
}, $userGroups);
echo "You are member of: " . implode(", ", $groupNames);
}
<?php
/**
* Example: Assigning user to multiple groups
*/
$groupManager = new GroupManager();
// Get group IDs
$groupHandler = xoops_getHandler('group');
$marketingGroup = $groupHandler->getByName('Marketing Department');
$writerGroup = $groupHandler->getByName('Writers');
// Add user to multiple groups
$userId = 12;
$groupManager->addUserToGroup($userId, $marketingGroup->getVar('group_id'));
$groupManager->addUserToGroup($userId, $writerGroup->getVar('group_id'));
// User now has combined permissions from both groups
  1. 명확한 이름 지정: 설명적이고 명확한 그룹 이름을 사용하세요.
  2. 문서화: 문서 그룹 목적 및 권한
  3. 최소 권한의 원칙: 최소한의 필수 권한을 부여합니다.
  4. 정기 감사: 그룹 멤버십 및 권한을 정기적으로 검토합니다.
  5. 기본 그룹: 기본 그룹 유지(웹마스터, 등록, 익명)
<?php
/**
* Best practice: Permission audit function
*/
class GroupAudit
{
/**
* Audit group permissions
*
* @param int $groupId Group ID
* @return array Audit report
*/
public function auditGroupPermissions(int $groupId): array
{
$permissionHandler = xoops_getHandler('groupperm');
$groupHandler = xoops_getHandler('group');
$moduleHandler = xoops_getHandler('module');
$group = $groupHandler->get($groupId);
if (!$group) {
return ['error' => 'Group not found'];
}
$modules = $moduleHandler->getList();
$report = [
'group_name' => $group->getVar('group_name'),
'members_count' => count($groupHandler->getUsersByGroup($groupId)),
'permissions_by_module' => []
];
foreach ($modules as $moduleId => $moduleName) {
$perms = $permissionHandler->getGroupPermissions($groupId, $moduleId);
if (!empty($perms)) {
$report['permissions_by_module'][$moduleName] = $perms;
}
}
return $report;
}
}
  • 사용자 관리.md
  • 권한 시스템.md -인증.md -../../보안/보안-Guidelines.md

#그룹 #그룹 관리 #권한 #액세스 제어 #사용자 조직 #계층