Helfer zur Authentifizierung fuer jdk.httpserver
ulrich
2021-06-15 9aedc9c0c54b7f3971ff025fcd9160b2a22909ee
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 import java.util.logging.Level;
30 import java.util.logging.Logger;
31
32 /**
33  * Eine einfache Implementierung der Schnittstelle Realm, die 
34  * Benutzerinformationen aus einer Datei liest. Die Datei ist dabei 
35  * wie folgt aufgebaut.
36  * 
37  * test=test,testRolle
38  * ulrich=ulrich,testRolle,andereRolle
39  * 
40  * Der erste Eintrag nach dem Gleichheitszeichen ist das Passwort, die restlichen 
9aedc9 41  * Eintraege sind Rollen.
2a4fb8 42  * 
U 43  * @author Ulrich Hilger
44  * @version 1, 03.06.2021
45  */
46 public class SimpleRealm implements Realm {
47   
48   private static final Logger logger = Logger.getLogger(SimpleRealm.class.getName());
49   
50   public static final String LIST_INDICATOR = "=";
51   public static final String ROLE_SEPARATOR = ",";
52   public static final String COMMENT_INDICATOR = "#";
53   
54   private String name;
55   private final Map<String, User> users;
56   private final Map<String, List> userRoles;
57   
9aedc9 58   /**
U 59    * Ein neues Objekt der Klasse SimpleRealm erzeugen
60    */
2a4fb8 61   public SimpleRealm() {
U 62     users = new HashMap<>();
63     userRoles = new HashMap<>();
64   }
65
9aedc9 66   /**
U 67    * Den Namen dieses Realm festlegen
68    * @param name Name des Realms
69    */
2a4fb8 70   public void setName(String name) {
U 71     this.name = name;
72   }
73   
9aedc9 74   /**
U 75    * Nutzerinformationen aus einer Datei lesen
76    * @param file die Datei mit Nutzerinformationen
77    * @throws IOException 
78    */
2a4fb8 79   public void readFromFile(File file) throws IOException {
U 80     BufferedReader r = new BufferedReader(new FileReader(file));
81     String line = r.readLine();
82     while(line != null) {
83       parse(line);
84       line = r.readLine();
85     }
86     r.close();
87   }
88   
9aedc9 89   /**
U 90    * Eine Zeile aus der Datei mit Nutzerinformationen verarbeiten
91    * @param line die Zeile, die verarbeitet werden soll
92    */
2a4fb8 93   private void parse(String line) {
U 94     if(!line.startsWith(COMMENT_INDICATOR)) {
95       String[] teile = line.split(LIST_INDICATOR);
96       String[] rollen = teile[1].split(ROLE_SEPARATOR);
97       String userId = teile[0];
98       User user = new User();
99       user.setName(userId);
100       user.setPassword(rollen[0]);
101       try {
102         Encoder encoder = new Encoder();
103         String hex = encoder.bytesToHex(encoder.encode(rollen[0]));
104         logger.fine(hex);
105       } catch (NoSuchAlgorithmException ex) {
106         logger.log(Level.SEVERE, null, ex);
107       }
108       ArrayList rollenListe = new ArrayList(); 
109       for(int i = 1; i < rollen.length; i++) {
110         rollenListe.add(rollen[i]);
111       }
112       users.put(userId, user);
113       userRoles.put(userId, rollenListe);
114     }
115   }
116   
117   /* ------------ Realm implementation -------------- */
118
9aedc9 119   /**
U 120    * Uberpruefen, ob die Benutzerkennung und das Kennwort gueltig sind.
121    * 
122    * @param userId  der Benutzer
123    * @param password das Kennwort des Benutzers
124    * @return true, wenn die Angaben stimmen, false wenn nicht
125    */  
2a4fb8 126   @Override
9aedc9 127   public boolean isValid(String userId, String password) {
2a4fb8 128     Object o = users.get(userId);
U 129     if(o instanceof User) {
130       User user = (User) o;
9aedc9 131       return user.getPassword().equals(password);
2a4fb8 132     } else {
U 133       return false;
134     }
135   }
136
9aedc9 137   /**
U 138    * Pruefen, ob ein Benutzer eine Rolle hat
139    * 
140    * @param userId der Benutzer
141    * @param roleId die Kennung der Rolle
142    * @return  true, wenn der Benutzer die Rolle hat, false wenn nicht
143    */
2a4fb8 144   @Override
9aedc9 145   public boolean hasRole(String userId, String roleId) {
2a4fb8 146     Object o = userRoles.get(userId);
U 147     if(o instanceof List) {
148       List roles = (List) o;
9aedc9 149       return roles.contains(roleId);
2a4fb8 150     } else {
U 151       return false;
152     }
153   }
154
9aedc9 155   /**
U 156    * Den Namen dieses Realms ermitteln
157    * @return Name des Realms
158    */
2a4fb8 159   @Override
U 160   public String getName() {
161     return name;
162   }
163   
164 }