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