User management

Users can be managed using the IUserManager service that can be injected.

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);
    }
}

Creating users

Creating a user is done by passing a username and password to the create method:

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);
    }
}

Modifying users

Users can be modified by getting a user by the userId or by a search pattern. The returned user objects can then be used to:

  • Delete them

  • Set a new password

  • Disable/Enable them

  • Get their home directory

<?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();
    }
}

User session information

To login, logout or getting the currently logged in user, the IUserSession service that can be injected.

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;
    }
}

Then users can be logged in and out by using:

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();
    }
}

User objects

User objects can be acquired from the IUserManager::get method.

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
        }
    }
}

User managers

Added in version 27.

Nextcloud users can be defined as managers of other users. This is an informational property and has no influence on authorization. A user manager is not to confuse with admins or sub admins.

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 and managers that no longer exist as user
        $existingManagers = array_filter($managers);
        $user->setManagerUids(array_map(function(IUser $admin) {
            return $user->getUID();
        }, $existingManagers));
    }
}