All Downloads are FREE. Search and download functionalities are using the official Maven repository.

de.svws_nrw.db.Benutzer Maven / Gradle / Ivy

Go to download

Diese Bibliothek regelt den Zugriff auf Datenbanken für die Schulverwaltungssoftware in NRW

The newest version!
package de.svws_nrw.db;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import javax.crypto.SecretKey;

import de.svws_nrw.base.crypto.AES;
import de.svws_nrw.base.crypto.AESAlgo;
import de.svws_nrw.base.crypto.AESException;
import de.svws_nrw.core.types.benutzer.BenutzerKompetenz;
import de.svws_nrw.core.types.lehrer.LehrerLeitungsfunktion;
import de.svws_nrw.ext.jbcrypt.BCrypt;


/**
 * Diese Klasse repräsentiert u.a. bei einem OpenAPI-Zugriff den angemeldeten Benutzer
 * bei einer SVWS-Datenbank. Für den Datenbankzugriff wird intern eine Instanz der Klasse
 * {@link DBEntityManager} verwendet.
 */
public final class Benutzer {

	/** Der Benutzername des angemeldeten Benutzers. */
	private String _username;

	/** Das Kennwort des angemeldeten Benutzers */
	private String _password;

	/** Das AES-Objekt, passend zum angemeldeten Benutzer. */
	private AES _aes;

	/** Enthält bei einem Open-API-Zugriff die Datenbank-ID des zugehörigen SVWS-Benutzers. */
	private Long _id = null;

	/** Die verwendete Datenbank-Konfiguration {@link DBConfig} */
	private final DBConfig _config;

	/** Der Manager für die Datenbank-Verbindungen */
	public final ConnectionManager connectionManager;

	/** Enthält bei einem Open-API-Zugriff die Datenbank-ID des zugehörigen Lehrers, falls der Benutzer ein Lehrer ist*/
	private Long _idLehrer = null;


	/**
	 * Enthält die Information welche Kompetenzen der Benutzer in Bezug auf den Datenbankzugriff hat.
	 * Die Kompetenzen erlauben die Zuordnung von OpenAPI-Methode zu einzelnen Kompetenzbereichen, welche
	 * dann einem Datenbankbenutzer administrativ zugewiesen werden. Diese Zuordnung ist in der SVWS-Datenbank
	 * gespeichert.
	 */
	private List _kompetenzen = new ArrayList<>();

	/**
	 * Die Menge der bei der Operation verwendeten Benutzerkompetenzen, sofern nicht die Admin-Kompetenz verwendet
	 * wurde oder keine Kompetenz notwendig war.
	 */
	private final Set _kompetenzenVerwendet = new HashSet<>();

	/**
	 * Enthält die IDs zu den Klassen, bei welchen der Benutzer einen vollständigen Zugriff bei
	 * funktionsbezogenenen Operationen erhält. Dies kann z.B. durch die Tätigkeit als Klassenlehrer oder
	 * auch durch die Tätigkeit als Abteilungsleiter erfolgen.
	 */
	private final Set _idsKlassen = new HashSet<>();

	/**
	 * Enthält die aktuellen Leitungsfunktionen des Benutzers, falls es sich um einen Lehrer
	 * handelt. Diese sind normalerweise in Bezug auf das aktuelle Datum des Servers gesetzt.
	 */
	private final Set _leitungsfunktionen = new HashSet<>();

	/**
	 * Enthält die Abiturjahrgänge, in welchen der Benutzer, wenn es sich um einen Lehrer handelt,
	 * als Beratungslehrer eingetragen ist.
	 */
	private final Set _abiturjahrgaenge = new HashSet<>();


	/**
	 * Erzeugt einen neuen Datenbank-Benutzer, wobei die für den Datenbankzugriff zu
	 * verwendende {@link DBConfig} angegeben wird.
	 *
	 * @param config   die Datenbank-Konfiguration
	 *
	 * @throws DBException wenn die Authentifizierung fehlschlägt
	 */
	private Benutzer(final DBConfig config) throws DBException {
		this._username = "niemand";
		this._password = "keines";
		this._aes = null;
		this._config = config;
		this.connectionManager = ConnectionManager.get(config);
	}


	/**
	 * Erstellt basierend auf der übergebenen Datenbank-Konfiguration {@link DBConfig}
	 * einen neuen Datenbank-{@link Benutzer}.
	 *
	 * @param config   die Datenbank-Konfiguration.
	 *
	 * @return die neue Instanz des {@link Benutzer}
	 *
	 * @throws DBException wenn die Authentifizierung fehlschlägt
	 */
	public static Benutzer create(final DBConfig config) throws DBException {
		return new Benutzer(config);
	}


	/**
	 * Erstellt eine neue Verbindung mit den gleichen Verbindungsinformationen, aber zu
	 * einem anderen Schema.
	 * Anmerkung: ein identischer Schema-Name wird als Sonderfall auch zugelassen.
	 *
	 * @param schema   der name des Schemas für die neue Verbindung
	 *
	 * @return der Benutzer für den Datenbankzugriff, oder null im Fehlerfall
	 *
	 * @throws DBException wenn die Authentifizierung fehlschlägt
	 */
	public Benutzer connectTo(final String schema) throws DBException {
		return create(_config.switchSchema(schema));
	}


	/**
	 * Erstellt zu dem angegeben Kennwort einen Passwort-Hash mit dem
	 * BCrypt-Algorithmus. Dabei wird ein zufälliger Wert für den Salt verwendet.
	 *
	 * @param password   das Kennwort im Klartext.
	 *
	 * @return der Hash des Kennwortes
	 */
	public static String erstellePasswortHash(final String password) {
		if ((password == null) || ("".equals(password)))
			return null;
		return BCrypt.hashpw(password, BCrypt.gensalt());
	}


	/**
	 * Prüft, ob dem Benutzer eine der übergeben Kompetenzen eingeräumt wurde oder nicht.
	 * Hierbei findet keine Prüfung auf einen Admin-Benutzer mit vollen Rechten statt.
	 *
	 * @param kompetenzen   die zu prüfenden Kompetenzen oder BenutzerKompetenz.KEINE
	 *
	 * @return true, im Falle von BenutzerKompetenz.KEINE als zu prüfende Kompetenz
	 *         oder wenn der Benutzer einer der übergebenen Kompetenzen besitzt. Anonsten
	 *         wird false zurückgegeben.
	 */
	private boolean hatKompetenz(final Set kompetenzen) {
		if (kompetenzen == null)
			return false;
		if (kompetenzen.contains(BenutzerKompetenz.KEINE))
			return true;
		_kompetenzenVerwendet.clear();
		for (final BenutzerKompetenz kompetenz : kompetenzen)
			if (this._kompetenzen.contains(kompetenz))
				_kompetenzenVerwendet.add(kompetenz);
		return !_kompetenzenVerwendet.isEmpty();
	}


	/**
	 * Prüft, ob die übergebene Kompetenz bei der Anmeldung verwendet wurde oder nicht.
	 *
	 * @param kompetenz   die auf Verwendung zu prüfende Kompetenz
	 *
	 * @return true, wenn die Kompetenz verwendet wurde und ansonsten false
	 */
	public boolean hatVerwendeteKompetenz(final BenutzerKompetenz kompetenz) {
		return _kompetenzenVerwendet.contains(kompetenz);
	}


	/**
	 * Prüft, ob es sich bei dem Benutzer um einen Admin-Benutzer mit
	 * allen Kompetenzen handelt.
	 *
	 * @return true, falls es sich um einen Admin-Benutzer mit allen Kompetenzen
	 *         handelt und ansonsten false
	 */
	public boolean istAdmin() {
		return (_kompetenzen != null) && _kompetenzen.contains(BenutzerKompetenz.ADMIN);
	}


	/**
	 * Prüft, ob der Benutzer eine der übergeben Kompetenz eingeräumt wurde oder nicht.
	 * Hierbei findet zunächst eine Prüfung auf einen Admin-Benutzer mit vollen Rechten
	 * statt. Ist dies ein Admin-Benutzer, so hat er die Kompetenz ohne dass weiter
	 * geprüft werden muss.
	 *
	 * @param kompetenzen   die zu prüfenden Kompetenzen oder BenutzerKompetenz.KEINE
	 *
	 * @return true, im Falle von BenutzerKompetenz.KEINE als zu prüfende Kompetenz
	 *         oder wenn der Benutzer die übergebene Kompetenz besitzt. Anonsten
	 *         wird false zurückgegeben.
	 */
	public boolean pruefeKompetenz(final BenutzerKompetenz... kompetenzen) {
		final Set tmp = new HashSet<>(Arrays.asList(kompetenzen));
		return istAdmin() || hatKompetenz(tmp);
	}


	/**
	 * Prüft, ob der Benutzer eine der übergeben Kompetenz eingeräumt wurde oder nicht.
	 * Hierbei findet zunächst eine Prüfung auf einen Admin-Benutzer mit vollen Rechten
	 * statt. Ist dies ein Admin-Benutzer, so hat er die Kompetenz ohne dass weiter
	 * geprüft werden muss.
	 *
	 * @param kompetenzen   die zu prüfenden Kompetenzen oder BenutzerKompetenz.KEINE
	 *
	 * @return true, im Falle von BenutzerKompetenz.KEINE als zu prüfende Kompetenz
	 *         oder wenn der Benutzer die übergebene Kompetenz besitzt. Anonsten
	 *         wird false zurückgegeben.
	 */
	public boolean pruefeKompetenz(final Set kompetenzen) {
		return istAdmin() || hatKompetenz(kompetenzen);
	}


	/**
	 * Gibt im Falle eines Open-API-Zugriffs die Datenbank-ID des angemeldeten
	 * SVWS-Benutzers zurück.
	 *
	 * @return die Datenbank-ID des Benutzer oder null
	 */
	public Long getId() {
		return _id;
	}


	/**
	 * Setzt die Datenbank-ID des angemeldeten SVWS-Benutzers.
	 *
	 * @param id   die ID des SVWS-Benutzers
	 */
	public void setId(final Long id) {
		this._id = id;
	}


	/**
	 * Gibt den Benutzernamen zurück.
	 *
	 * @return der Benutzername
	 */
	public String getUsername() {
		return _username;
	}


	/**
	 * Setzt den Benutzernamen diese Benutzers.
	 *
	 * @param username   der zu setzende Benutzername
	 */
	public void setUsername(final String username) {
		this._username = username;
	}


	/**
	 * Gibt das Kennwort dieses Benutzers zurück.
	 *
	 * @return das Kennwort
	 */
	public String getPassword() {
		return _password;
	}


	/**
	 * Setzt das Kennwort dieses Benutzers.
	 *
	 * @param password   das zu setzende Kennwort
	 */
	public void setPassword(final String password) {
		this._password = password;
	}


	/**
	 * Gibt das AES-Objekt zur Verschlüsselung von Benutzerspezifischen
	 * Daten zurück.
	 *
	 * @return das AES-Verschlüsselungsobjekt
	 */
	public AES getAES() {
		return _aes;
	}


	/**
	 * Setzt das AES-Objekt zur Verschlüsselung von Benuterspezifischen Daten
	 * in Bezug auf den aktuellen Benutzernamen und seinem Kennwort.
	 */
	public void setAES() {
		this._aes = getAESInstance(_username, _password);
	}


	/**
	 * Erzeugt eine Instanz für die AES-Verschlüsselung basierend auf dem Benutzernamen und dem
	 * Kennwort des angemeldeten Benutzers.
	 *
	 * @param username   der Benutzername
	 * @param password   das Anmeldekennwort
	 *
	 * @return das AES-Verschlüsselungsobjekt
	 */
	public static AES getAESInstance(final String username, final String password) {
		try {
			final SecretKey key = AES.getKey256(password, username);
			return new AES(AESAlgo.CBC_PKCS5PADDING, key);
		} catch (@SuppressWarnings("unused") final AESException e) {
			return null;
		}
	}


	/**
	 * Gibt die Liste der zugeorndeten Komptenzen zurück.
	 *
	 * @return die Liste der Benutzer-Kompetenzen
	 */
	public List getKompetenzen() {
		return _kompetenzen;
	}


	/**
	 * Ordnet die übergebenen Kompetenzen diesem Benutzer zu.
	 *
	 * @param kompetenzen   die Kompetenzen, die diesem Benutzer zugeordnet werden.
	 */
	public void setKompetenzen(final List kompetenzen) {
		this._kompetenzen = kompetenzen;
	}


	/**
	 * Gibt eine neue Instanz des {@link DBEntityManager} zurück, die diesem Benutzer
	 * für den Datenbank-Zugriff zugeordnet ist. Diese repräsentiert gleichzeitig
	 * eine neue Verbindung.
	 *
	 * @return die Instanz des {@link DBEntityManager}
	 */
	public DBEntityManager getEntityManager() {
		try {
			return new DBEntityManager(this, _config);
		} catch (@SuppressWarnings("unused") final IllegalStateException e) {
			// TODO error handling
			return null;
		}
	}


	/**
	 * Gibt die Lehrer-ID des angemeldeten Benutzers zurück, sofern
	 * ein Lehrer angemeldet ist.
	 *
	 * @return die Lehrer-ID oder null, falls der angemeldete Benutzer kein Lehrer ist
	 */
	public Long getIdLehrer() {
		return _idLehrer;
	}


	/**
	 * Setzt die Lehrer-ID des angemeldeten Benutzers
	 *
	 * @param idLehrer   die Lehrer-ID oder null, falls der angemeldete Benutzer kein Lehrer ist
	 */
	public void setIdLehrer(final Long idLehrer) {
		this._idLehrer = idLehrer;
	}


	/**
	 * Setzt die IDs der Klassen, bei welchen der Benutzer einen vollständigen Zugriff bei
	 * funktionsbezogenenen Operationen erhält. Dies kann z.B. durch die Tätigkeit als Klassenlehrer
	 * oder auch durch die Tätigkeit als Abteilungsleiter erfolgen.
	 *
	 * @param idsKlassen   die IDs der Klassen
	 */
	public void setKlassenIDs(final Collection idsKlassen) {
		this._idsKlassen.clear();
		this._idsKlassen.addAll(idsKlassen);
	}


	/**
	 * Gibt die IDs der Klasse zurück, bei welchen der Benutzer einen vollständigen Zugriff bei
	 * funktionsbezogenenen Operationen erhält. Dies kann z.B. durch die Tätigkeit als Klassenlehrer
	 * oder auch durch die Tätigkeit als Abteilungsleiter erfolgen.
	 *
	 * @return die IDs der Klassen
	 */
	public Set getKlassenIDs() {
		return new HashSet<>(this._idsKlassen);
	}


	/**
	 * Setzt die aktuellen Leitungsfunktionen, welche dem Benutzer zugeordnet sind.
	 *
	 * @param funktionen   die Leitungsfunktionen
	 */
	public void setLeitungsfunktionen(final Collection funktionen) {
		this._leitungsfunktionen.clear();
		this._leitungsfunktionen.addAll(funktionen);
	}


	/**
	 * Gibt die aktuellen Leitungsfunktionen zurück, welche dem Benutzer zugeordnet sind.
	 *
	 * @return die Leitungsfunktionen
	 */
	public Set getLeitungsfunktionen() {
		return new HashSet<>(this._leitungsfunktionen);
	}


	/**
	 * Setzt die Abiturjahrgänge, in welchen der Benutzer Beratungslehrer ist.
	 *
	 * @param abijahrgaenge   die Abiturjahrgänge
	 */
	public void setAbiturjahrgaenge(final Collection abijahrgaenge) {
		this._abiturjahrgaenge.clear();
		this._abiturjahrgaenge.addAll(abijahrgaenge);
	}


	/**
	 * Gibt die Abiturjahrgänge, in welchen der Benutzer Beratungslehrer ist.
	 *
	 * @return die Abiturjahrgänge
	 */
	public Set getAbiturjahrgaenge() {
		return new HashSet<>(this._abiturjahrgaenge);
	}

}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy