Helfer zur Authentifizierung fuer jdk.httpserver
ulrich
2022-01-09 6f74dddb7a2f0f0fc67d07baddc861b620ac15ae
commit | author | age
2a4fb8 1 /*
U 2   http-realm - Authentication Extensions to jdk.httpserver
3   Copyright (C) 2021  Ulrich Hilger
4
5   This program is free software: you can redistribute it and/or modify
6   it under the terms of the GNU Affero General Public License as
7   published by the Free Software Foundation, either version 3 of the
8   License, or (at your option) any later version.
9
10   This program is distributed in the hope that it will be useful,
11   but WITHOUT ANY WARRANTY; without even the implied warranty of
12   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13   GNU Affero General Public License for more details.
14
15   You should have received a copy of the GNU Affero General Public License
16   along with this program.  If not, see <https://www.gnu.org/licenses/>.
17  */
18 package de.uhilger.httpserver.auth.realm;
19
20 import java.io.BufferedReader;
21 import java.io.File;
22 import java.io.FileReader;
23 import java.io.IOException;
24 import java.security.NoSuchAlgorithmException;
25 import java.util.ArrayList;
26 import java.util.HashMap;
27 import java.util.List;
28 import java.util.Map;
29
30 /**
31  * Eine einfache Implementierung der Schnittstelle Realm, die 
32  * Benutzerinformationen aus einer Datei liest. Die Datei ist dabei 
33  * wie folgt aufgebaut.
34  * 
35  * test=test,testRolle
36  * ulrich=ulrich,testRolle,andereRolle
37  * 
38  * Der erste Eintrag nach dem Gleichheitszeichen ist das Passwort, die restlichen 
9aedc9 39  * Eintraege sind Rollen.
2a4fb8 40  * 
U 41  * @author Ulrich Hilger
42  * @version 1, 03.06.2021
43  */
44 public class SimpleRealm implements Realm {
45   
46   public static final String LIST_INDICATOR = "=";
47   public static final String ROLE_SEPARATOR = ",";
48   public static final String COMMENT_INDICATOR = "#";
49   
50   private String name;
51   private final Map<String, User> users;
52   private final Map<String, List> userRoles;
53   
9aedc9 54   /**
U 55    * Ein neues Objekt der Klasse SimpleRealm erzeugen
56    */
2a4fb8 57   public SimpleRealm() {
U 58     users = new HashMap<>();
59     userRoles = new HashMap<>();
60   }
61
9aedc9 62   /**
U 63    * Den Namen dieses Realm festlegen
64    * @param name Name des Realms
65    */
2a4fb8 66   public void setName(String name) {
U 67     this.name = name;
68   }
69   
9aedc9 70   /**
U 71    * Nutzerinformationen aus einer Datei lesen
72    * @param file die Datei mit Nutzerinformationen
73    * @throws IOException 
74    */
2a4fb8 75   public void readFromFile(File file) throws IOException {
U 76     BufferedReader r = new BufferedReader(new FileReader(file));
77     String line = r.readLine();
78     while(line != null) {
79       parse(line);
80       line = r.readLine();
81     }
82     r.close();
83   }
84   
9aedc9 85   /**
U 86    * Eine Zeile aus der Datei mit Nutzerinformationen verarbeiten
87    * @param line die Zeile, die verarbeitet werden soll
88    */
2a4fb8 89   private void parse(String line) {
U 90     if(!line.startsWith(COMMENT_INDICATOR)) {
91       String[] teile = line.split(LIST_INDICATOR);
92       String[] rollen = teile[1].split(ROLE_SEPARATOR);
93       String userId = teile[0];
94       User user = new User();
95       user.setName(userId);
96       user.setPassword(rollen[0]);
97       try {
98         Encoder encoder = new Encoder();
99         String hex = encoder.bytesToHex(encoder.encode(rollen[0]));
6f74dd 100         //logger.fine(hex);
2a4fb8 101       } catch (NoSuchAlgorithmException ex) {
6f74dd 102         //logger.log(Level.SEVERE, null, ex);
2a4fb8 103       }
U 104       ArrayList rollenListe = new ArrayList(); 
105       for(int i = 1; i < rollen.length; i++) {
106         rollenListe.add(rollen[i]);
107       }
108       users.put(userId, user);
109       userRoles.put(userId, rollenListe);
110     }
111   }
112   
113   /* ------------ Realm implementation -------------- */
114
9aedc9 115   /**
U 116    * Uberpruefen, ob die Benutzerkennung und das Kennwort gueltig sind.
117    * 
118    * @param userId  der Benutzer
119    * @param password das Kennwort des Benutzers
120    * @return true, wenn die Angaben stimmen, false wenn nicht
121    */  
2a4fb8 122   @Override
9aedc9 123   public boolean isValid(String userId, String password) {
2a4fb8 124     Object o = users.get(userId);
U 125     if(o instanceof User) {
126       User user = (User) o;
9aedc9 127       return user.getPassword().equals(password);
2a4fb8 128     } else {
U 129       return false;
130     }
131   }
132
9aedc9 133   /**
U 134    * Pruefen, ob ein Benutzer eine Rolle hat
135    * 
136    * @param userId der Benutzer
137    * @param roleId die Kennung der Rolle
138    * @return  true, wenn der Benutzer die Rolle hat, false wenn nicht
139    */
2a4fb8 140   @Override
9aedc9 141   public boolean hasRole(String userId, String roleId) {
2a4fb8 142     Object o = userRoles.get(userId);
U 143     if(o instanceof List) {
144       List roles = (List) o;
9aedc9 145       return roles.contains(roleId);
2a4fb8 146     } else {
U 147       return false;
148     }
149   }
150
9aedc9 151   /**
U 152    * Den Namen dieses Realms ermitteln
153    * @return Name des Realms
154    */
2a4fb8 155   @Override
U 156   public String getName() {
157     return name;
158   }
159   
160 }