Java Web Services via REST bereitstellen
ulrich@undisclosed
2020-05-02 1177762340ebc0e7bee444ae2d7c119f697cbdbb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
/*
    Transit - Remote procedure calls made simple
    Copyright (c) 2012  Ulrich Hilger
 
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU Affero General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU Affero General Public License for more details.
 
    You should have received a copy of the GNU Affero General Public License
    along with this program.  If not, see <http://www.gnu.org/licenses/>.
*/
 
package de.uhilger.transit.web;
 
import java.util.List;
import java.util.Map;
import java.util.HashMap;
import java.util.ArrayList;
 
 
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
 
/**
 * Die Klasse RechteMap implementiert die Schnittstelle RechtePruefer 
 * auf der Grundlage von Benutzerinformationen in einer Map.
 * 
 * @author Copyright (c) Ulrich Hilger, http://uhilger.de
 * @author Published under the terms and conditions of
 * the <a href="http://www.gnu.org/licenses/agpl-3.0" target="_blank">GNU Affero General Public License</a>
 * 
 * @version 1, September 16, 2012
 */
public class RechteMap implements RechtePruefer {
  
  public static final String RECHT_KLASSE = "MT_KLASSE";
  public static final String RECHT_METHODE = "MT_NAME";
  
  protected List<Map<String, String>> rechte;
 
  /**
   * Ein Objekt der Klasse <code>RechteMap</code> erzeugen.
   */
  public RechteMap() {
    super();
    rechte = new ArrayList<Map<String, String>>();
  }
  
  /**
   * Die Rechte eines Benutzers ermitteln
   * 
   * Diese Methode ist in dieser Klasse leer und fuehrt damit  dazu 
   * dass dieser RechtePruefer alle Methodenaufrufe ablehnt.
   * 
   * Klassen, die von dieser Klasse abgeleitet sind, koennen 
   * die Methode getRechte ueberschreiben, um eine beliebige 
   * Menge von Methoden zu erlauben. Hart codiert koennte 
   * eine implementierung z.B. wie folgt aussehen
   * 
   * <pre>
   * List rechte = new ArrayList();
   * rechte.add(rechtBilden("de.uhilger.netzspeicher.persistenz.DocStore", "eintragArchiv"));
   * rechte.add(rechtBilden("de.uhilger.netzspeicher.persistenz.PublicStore", "getMonthDocs"));
   * return rechte;
   * </pre>
   * 
   * @param benutzerName des Benutzers
   * @return eine Liste mit Berechtigungen des Benutzers
   */
  @SuppressWarnings("unchecked")  
  public List<Map<String, String>> getRechte(String benutzerName) {
    return rechte;
  }
  
  /**
   * Ein Berechtigungsobjekt bestehend aus Klassen- und Methodenname 
   * zusammensetzen
   * @param klassenName  Name der Klasse
   * @param methodenName Name der Methode
   * @return das Berechtigungsobjekt als Map
   */
  protected Map<String, String> rechtBilden(String klassenName, String methodenName) {
    Map<String, String> m = new HashMap<String, String>();
    m.put(RECHT_KLASSE, klassenName);
    m.put(RECHT_METHODE, methodenName);
    return m;    
  }
  
  /**
   * Pruefen ob ein Methodenaufruf erlaubt ist
   * 
   * @param klasse  vollstaendiger Name der Klasse, die die auszufuehrende Methode enthaelt
   * @param methode Name der Methode, die ausgefuehrt werden soll
   * @param benutzerName  Name des Benutzerkontos, dessen Benutzer die Methode ausfuehren moechte
   * 
   * @return true, wenn der Benutzer die Methode ausfuehren darf, false wenn nicht
   */
  @SuppressWarnings("unchecked")  
  public boolean istErlaubt(ServletRequest request, ServletResponse response, String klasse, String methode, String benutzerName) {
    boolean erlaubt = false;    
    List<Map<String, String>> rechte = getRechte(benutzerName);
    if(rechte != null) {
      for(int i = 0; i < rechte.size() && !erlaubt; i++) {
        String rKlasse = rechte.get(i).get(RECHT_KLASSE);
        String rMethode = rechte.get(i).get(RECHT_METHODE);
        /*
          Verwendung von Regular Expressions, ein Muster fuer eine Klasse 
          ist z.B. de.uhilger..*
          
          eine Methode koennte so lauten
          .*
          oder
          get.*
          
          Der Punkt steht fuer ein beliebiges Zeichen,
          das * steht fuer kein Mal oder beliebig oft das davor befindliche Zeichen
          .* bedeutet 'ab dieser Stelle keinmal oder beliebig oft ein beliebiges Zeichen'
          
          + bedeutet stattdessen ein oder mehrmals das davor befindliche Zeichen 
        */
        erlaubt = klasse.matches(rKlasse) && methode.matches(rMethode);
      }
    }
    return erlaubt;    
  }
  
}