# Gérer les utilisateurs

### Se connecter à PostgreSQL

```shell
psql -h localhost -p 5432 -U <username> -W
```

Il est possible que la commande psql vous sorte une erreur de type : `commande inconnue`.

Dans ce cas vous allez devoir vous connecter sur l'utilisateur Linux possédant les droits d'utilisation de la commande psql.

```shell
su - postgres
```

### Lister les utilisateurs 

Dans l'interface de psql :

```SQL
\du
```

### Créer un utilisateur

Il existe deux commandes différentes pour réaliser cette action.

```SQL
CREATE USER <username>;
```

ou

```SQL
CREATE ROLE <username> WITH LOGIN;
```

#### Créer un utilisateur avec l'utilitaire

La création interactive d'un utilisateur est une option pratique disponible uniquement pour l'utilitaire client. Pour créer un utilisateur de manière interactive, exécutez la commande suivante :

```shell
sudo -u postgres createuser --interactive
```

####   


#### Créer un super utilisateur

<p class="callout danger">Un super utilisateur de base de données contourne toutes les vérifications, ce qui est dangereux du point de vue de la sécurité. Utilisez cette action avec précaution et évitez de travailler avec un compte super utilisateur sauf en cas de nécessité absolue.</p>

Sur PostgreSQL le "super user" est `postgres` mais dans certain cas il est possible de vouloir créer son propre super user.

Pour créer un super utilisateur :

```SQL
CREATE USER <username> SUPERUSER;
```

Si cet utilisateur doit avoir un mot de passe :

```SQL
CREATE USER <username> WITH SUPERUSER PASSWORD 'passwordstring';
```

##### Mot de passe

Dans le cas ou vous avez créé un utilisateur sans mot de passe il possible de lui rajouter le mot de passe via la commande suivante.

```SQL
ALTER USER <username> WITH PASSWORD '<password>';
```

#### Créer un utilisateur avec des droits

```SQL
CREATE USER <name> WITH <option>;
```

<table border="1" id="bkmrk-option-syntax-psql-e" style="border-collapse: collapse; width: 100%;"><tbody><tr><th class="has-text-align-center" data-align="center" style="width: 33.3745%;">**Option Syntax**</th><th class="has-text-align-center" data-align="center" style="width: 33.3745%;">**PSQL**</th><th style="width: 33.3745%;">**Explanation**</th></tr><tr><td class="has-text-align-center" data-align="center" style="width: 33.3745%;">**`-s`**  
**`--superuser`**</td><td class="has-text-align-center" data-align="center" style="width: 33.3745%;">**`SUPERUSER`**</td><td style="width: 33.3745%;">Add the superuser privilege.</td></tr><tr><td class="has-text-align-center" data-align="center" style="width: 33.3745%;">**`-S`**  
**`--no-superuser`**</td><td class="has-text-align-center" data-align="center" style="width: 33.3745%;">**`NOSUPERUSER`**</td><td style="width: 33.3745%;">No superuser privilege (default).</td></tr><tr><td class="has-text-align-center" data-align="center" style="width: 33.3745%;">**`-d`**  
**`--createdb`**</td><td class="has-text-align-center" data-align="center" style="width: 33.3745%;">**`CREATEDB`**</td><td style="width: 33.3745%;">Allows the user to create databases.</td></tr><tr><td class="has-text-align-center" data-align="center" style="width: 33.3745%;">**`-D`**  
**`--no-createdb`**</td><td class="has-text-align-center" data-align="center" style="width: 33.3745%;">**`NOCREATEDB`**</td><td style="width: 33.3745%;">Not allowed to create databases (default).</td></tr><tr><td class="has-text-align-center" data-align="center" style="width: 33.3745%;">**`-r`**  
**`--createrole`**</td><td class="has-text-align-center" data-align="center" style="width: 33.3745%;">**`CREATEROLE`**</td><td style="width: 33.3745%;">Allows the user to make new roles.</td></tr><tr><td class="has-text-align-center" data-align="center" style="width: 33.3745%;">**`-R`**  
**`--no-createrole`**</td><td class="has-text-align-center" data-align="center" style="width: 33.3745%;">**`NOCREATEROLE`**</td><td style="width: 33.3745%;">Not allowed to create roles (default).</td></tr><tr><td class="has-text-align-center" data-align="center" style="width: 33.3745%;">**`-i`**  
**`--inherit`**</td><td class="has-text-align-center" data-align="center" style="width: 33.3745%;">**`INHERIT`**</td><td style="width: 33.3745%;">Automatically inherit the privileges of roles (default).</td></tr><tr><td class="has-text-align-center" data-align="center" style="width: 33.3745%;">**`-I`**  
**`--no-inherit`**</td><td class="has-text-align-center" data-align="center" style="width: 33.3745%;">**`NOINHERIT`**</td><td style="width: 33.3745%;">Do not inherit privileges of roles.</td></tr><tr><td class="has-text-align-center" data-align="center" style="width: 33.3745%;">**`-l`**  
**`--login`**</td><td class="has-text-align-center" data-align="center" style="width: 33.3745%;">**`LOGIN`**</td><td style="width: 33.3745%;">Allows the user to log into a session with the role name (default).</td></tr><tr><td class="has-text-align-center" data-align="center" style="width: 33.3745%;">**`-L`**  
**`--no-login`**</td><td class="has-text-align-center" data-align="center" style="width: 33.3745%;">**`NOLOGIN`**</td><td style="width: 33.3745%;">Not allowed to log into a session with the role name.</td></tr><tr><td class="has-text-align-center" data-align="center" style="width: 33.3745%;">**`--replication`**</td><td class="has-text-align-center" data-align="center" style="width: 33.3745%;">**`REPLICATION`**</td><td style="width: 33.3745%;">Allows initiating streaming replication and activating/deactivating backup mode.</td></tr><tr><td class="has-text-align-center" data-align="center" style="width: 33.3745%;">**`--no-replication`**</td><td class="has-text-align-center" data-align="center" style="width: 33.3745%;">**`NOREPLICATION`**</td><td style="width: 33.3745%;">Not allowed to initiate streaming replication or backup mode (default).</td></tr><tr><td class="has-text-align-center" data-align="center" style="width: 33.3745%;">**`-P`**  
**`--pwprompt`**</td><td class="has-text-align-center" data-align="center" style="width: 33.3745%;">**`PASSWORD '<password>'`**</td><td style="width: 33.3745%;">Initiates password creation prompt or adds provided password to the user. Avoid using this option to create a passwordless user.</td></tr><tr><td class="has-text-align-center" data-align="center" style="width: 33.3745%;">/</td><td class="has-text-align-center" data-align="center" style="width: 33.3745%;">**`PASSWORD NULL`**</td><td style="width: 33.3745%;">Specifically sets the password to null. Every password authentication fails for this user.</td></tr><tr><td class="has-text-align-center" data-align="center" style="width: 33.3745%;">**`-c <number>`**  
**`--connection-limit=<number>`**</td><td class="has-text-align-center" data-align="center" style="width: 33.3745%;">**`CONNECTION LIMIT <number>`**</td><td style="width: 33.3745%;">Sets the maximum number of connections for user. Default is without limit.</td></tr></tbody></table>

### Changer les droits d'un utilisateur

Par exemple pour donner les droits de création d'une base de donnée a un utilisateur :

```SQL
ALTER USER <username> CREATEDB;
```

Dans le même ordre d'idée on peux donner les droits super utilisateur :

```SQL
ALTER USER <username> WITH SUPERUSER;
```

Mais aussi les enlever :

```SQL
ALTER USER <username> WITH NOSUPERUSER;
```

### Changer le mot de passe d'un utilisateur

```sql
ALTER USER user_name WITH PASSWORD 'new_password';
```

### Supprimer un utilisateur

```SQL
DROP USER [IF EXISTS] <username>;
```

Si l'utilisateur que vous essayez de supprimer possède des dépendances, la suppression échouera.

Vous allez devoir transférer les dépendances a un autre utilisateur.

1\) Par exemple, pour transférer les objets appartenant à myuser à postgres, exécutez :

```SQL
REASSIGN OWNED BY <old_user> TO <new_user>;
```

 2) Supprimer les connexions de l'objet de la base de données à l'utilisateur avec :

```SQL
DROP OWNED BY <username>;
```

3\) Maintenant vous pouvez supprimer l'utilisateur

### Supprimer un rôle 

```SQL
DROP ROLE [IF EXISTS] <name>;
```

### Donner l'accès à une BDD à un utilisateur

```SQL
GRANT ALL PRIVILEGES ON DATABASE <db_name> TO <username>;
```