Gestión de usuarios

Resumen

Esta página muestra cómo gestionar usuarios desde una app con los servicios IUserManager e IUserSession: crearlos, modificarlos, obtener sus objetos, iniciar y cerrar sesión, y leer o actualizar los gerentes de un usuario. Está dirigida a quienes desarrollan apps.

Fuente: documentación de Nextcloud, «developer_manual/digging_deeper/users», versión 3ad9158, licencia CC BY 3.0; traducida y adaptada para APS Conecta Gestión.

Los usuarios pueden gestionarse con el servicio IUserManager, que puede inyectarse.

Archivo lib/Service/UserService.php:

<?php

namespace OCA\MyApp\Service;

use OCP\IUserManager;

class UserService {
    private IUserManager $userManager;

    public function __construct(IUserManager $userManager){
        $this->userManager = $userManager;
    }

    public function createUser($userId, $password) {
        return $this->userManager->create($userId, $password);
    }
}

Crear usuarios

Para crear un usuario, se pasan un nombre de usuario y una contraseña al método create:

Archivo lib/Service/UserService.php:

<?php

namespace OCA\MyApp\Service;

class UserService {
    private IUserManager $userManager;

    public function __construct(IUserManager $userManager){
        $this->userManager = $userManager;
    }

    public function create($userId, $password) {
        return $this->userManager->create($userId, $password);
    }
}

Modificar usuarios

Los usuarios pueden modificarse obteniendo un usuario por su userId o mediante un patrón de búsqueda. Los objetos de usuario devueltos pueden usarse después para:

  • Eliminarlos

  • Establecer una nueva contraseña

  • Deshabilitarlos o habilitarlos

  • Obtener su directorio personal

<?php
namespace OCA\MyApp\Service;

class UserService {

    private IUserManager $userManager;

    public function __construct(IUserManager $userManager){
        $this->userManager = $userManager;
    }

    public function delete($userId) {
        return $this->userManager->get($userId)->delete();
    }

    // recoveryPassword is used for the encryption app to recover the keys
    public function setPassword($userId, $password, $recoveryPassword) {
        return $this->userManager->get($userId)->setPassword($password, $recoveryPassword);
    }

    public function disable($userId) {
        return $this->userManager->get($userId)->setEnabled(false);
    }

    public function getHome($userId) {
        return $this->userManager->get($userId)->getHome();
    }
}

Información de la sesión del usuario

Para iniciar sesión, cerrar sesión u obtener el usuario que tiene la sesión iniciada, el servicio IUserSession, que puede inyectarse.

Archivo lib/Service/UserService.php:

<?php

namespace OCA\MyApp\Service;

use OCP\IUserSession;

class UserService {
    private IUserSession $userSession;

    public function __construct(IUserSession $userSession){
        $this->userSession = $userSession;
    }
}

Después, los usuarios pueden iniciar y cerrar sesión con:

Archivo lib/Service/UserService.php:

<?php

namespace OCA\MyApp\Service;

use OCP\IUserSession;

class UserService {
    private IUserSession $userSession;

    public function __construct(IUserSession $userSession){
        $this->userSession = $userSession;
    }

    public function login(string $userId, string $password): void {
        return $this->userSession->login($userId, $password);
    }

    public function logout(): void {
        $this->userSession->logout();
    }
}

Objetos de usuario

Los objetos de usuario pueden obtenerse con el método IUserManager::get.

Archivo lib/Service/UserService.php:

<?php

namespace OCA\MyApp\Service;

use OCP\IUser;
use OCP\IUserManager;

class UserService {
    private IUserManager $userManager;

    public function __construct(IUserManager $userManager) {
        $this->userManager = $userManager;
    }

    public function foo(string $userId): void {
        /** @var IUser|null $user */
        $user = $this->userManager->get($userId);
        if ($user !== null) {
            // User exists
        } else {
            // The user does not exist
        }
    }
}

Gerentes de usuarios

Nuevo en la versión 27.

Los usuarios de APS Conecta Gestión pueden definirse como gerentes de otros usuarios. Se trata de una propiedad informativa y no influye en la autorización. Un gerente de usuario no debe confundirse con los administradores ni con los subadministradores.

Archivo lib/Service/UserService.php:

<?php

namespace OCA\MyApp\Service;

use OCP\IUser;
use OCP\IUserManager;

class UserService {
    private IUserManager $userManager;

    public function __construct(IUserManager $userManager) {
        $this->userManager = $userManager;
    }

    public function updateUserManagers(string $userId): void {
        /** @var IUser|null $user */
        $user = $this->userManager->get('user123');
        if ($user === null) {
            throw \InvalidArgumentException("User $userId does not exist");
        }

        $managerUids = $user->getManagerUids();
        // Turn UIDs into user objects
        $managers = array_map(function(string $uid) {
            return $this->userManager->get($uid);
        }, $managerUids));
        // Remove any managers that no longer exist as users
        $existingManagers = array_filter($managers);
        $user->setManagerUids(array_map(function(IUser $admin) {
            return $admin->getUID();
        }, $existingManagers));
    }
}