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