Helfer zur Authentifizierung fuer jdk.httpserver
ulrich
2022-01-09 6f74dddb7a2f0f0fc67d07baddc861b620ac15ae
src/de/uhilger/httpserver/auth/realm/SimpleRealm.java
@@ -26,8 +26,6 @@
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
/**
 * Eine einfache Implementierung der Schnittstelle Realm, die 
@@ -38,14 +36,12 @@
 * ulrich=ulrich,testRolle,andereRolle
 * 
 * Der erste Eintrag nach dem Gleichheitszeichen ist das Passwort, die restlichen 
 * Eintrage sind Rollen.
 * Eintraege sind Rollen.
 * 
 * @author Ulrich Hilger
 * @version 1, 03.06.2021
 */
public class SimpleRealm implements Realm {
  private static final Logger logger = Logger.getLogger(SimpleRealm.class.getName());
  
  public static final String LIST_INDICATOR = "=";
  public static final String ROLE_SEPARATOR = ",";
@@ -55,15 +51,27 @@
  private final Map<String, User> users;
  private final Map<String, List> userRoles;
  
  /**
   * Ein neues Objekt der Klasse SimpleRealm erzeugen
   */
  public SimpleRealm() {
    users = new HashMap<>();
    userRoles = new HashMap<>();
  }
  /**
   * Den Namen dieses Realm festlegen
   * @param name Name des Realms
   */
  public void setName(String name) {
    this.name = name;
  }
  
  /**
   * Nutzerinformationen aus einer Datei lesen
   * @param file die Datei mit Nutzerinformationen
   * @throws IOException
   */
  public void readFromFile(File file) throws IOException {
    BufferedReader r = new BufferedReader(new FileReader(file));
    String line = r.readLine();
@@ -74,6 +82,10 @@
    r.close();
  }
  
  /**
   * Eine Zeile aus der Datei mit Nutzerinformationen verarbeiten
   * @param line die Zeile, die verarbeitet werden soll
   */
  private void parse(String line) {
    if(!line.startsWith(COMMENT_INDICATOR)) {
      String[] teile = line.split(LIST_INDICATOR);
@@ -85,9 +97,9 @@
      try {
        Encoder encoder = new Encoder();
        String hex = encoder.bytesToHex(encoder.encode(rollen[0]));
        logger.fine(hex);
        //logger.fine(hex);
      } catch (NoSuchAlgorithmException ex) {
        logger.log(Level.SEVERE, null, ex);
        //logger.log(Level.SEVERE, null, ex);
      }
      ArrayList rollenListe = new ArrayList(); 
      for(int i = 1; i < rollen.length; i++) {
@@ -100,28 +112,46 @@
  
  /* ------------ Realm implementation -------------- */
  /**
   * Uberpruefen, ob die Benutzerkennung und das Kennwort gueltig sind.
   *
   * @param userId  der Benutzer
   * @param password das Kennwort des Benutzers
   * @return true, wenn die Angaben stimmen, false wenn nicht
   */
  @Override
  public boolean isValid(String userId, String kennwort) {
  public boolean isValid(String userId, String password) {
    Object o = users.get(userId);
    if(o instanceof User) {
      User user = (User) o;
      return user.getPassword().equals(kennwort);
      return user.getPassword().equals(password);
    } else {
      return false;
    }
  }
  /**
   * Pruefen, ob ein Benutzer eine Rolle hat
   *
   * @param userId der Benutzer
   * @param roleId die Kennung der Rolle
   * @return  true, wenn der Benutzer die Rolle hat, false wenn nicht
   */
  @Override
  public boolean hasRole(String userId, String rollenId) {
  public boolean hasRole(String userId, String roleId) {
    Object o = userRoles.get(userId);
    if(o instanceof List) {
      List roles = (List) o;
      return roles.contains(rollenId);
      return roles.contains(roleId);
    } else {
      return false;
    }
  }
  /**
   * Den Namen dieses Realms ermitteln
   * @return Name des Realms
   */
  @Override
  public String getName() {
    return name;