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
24 import de.uhilger.baselink.GenericRecord;
25 import de.uhilger.baselink.PersistenceManager;
26 import de.uhilger.baselink.Record;
27
28 import java.util.logging.Level;
29 import java.util.logging.Logger;
30
31 import java.util.regex.Pattern;
32
33 import javax.servlet.ServletRequest;
34 import javax.servlet.ServletResponse;
35
36 /**
37  * Die Klasse RechteDb implementiert die Schnittstelle RechtePruefer 
38  * auf der Grundlage von Benutzerinformationen in einer Datenbank.
39  * 
40  * @author Copyright (c) Ulrich Hilger, http://uhilger.de
41  * @author Published under the terms and conditions of
42  * the <a href="http://www.gnu.org/licenses/agpl-3.0" target="_blank">GNU Affero General Public License</a>
43  * 
44  * @version 1, September 16, 2012
45  */
46 public class RechteDb extends PersistenceManager implements RechtePruefer {
47
48   /** Der Name des Datenbanktreibers, der verwendet werden soll, falls keiner angegeben wurde */
49   public static final String DEFAULT_DRIVER = "org.apache.derby.jdbc.EmbeddedDriver";
50   
51   /**
52    * Ein Objekt der Klasse <code>RechteDb</code> erzeugen.
53    * 
54    * Beim Aufruf dieses Konstruktors muss anschliessend eine der folgenden 
55    * Methoden gerufen werden:
56    * setDatabase(DEFAULT_DRIVER, url);
57    * setDatabase(driverName, url);
58    * setDataSourceName(dsName);
59    */
60   public RechteDb() {
61     super();
62   }
63   
64   /**
65    * Ein Objekt der Klasse <code>RechteDb</code> erzeugen.
66    * 
67    * @param driverName Name des Datenbanktreibers
68    * @param url der Datenbank
69    */
70   public RechteDb(String driverName, String url) {
71     this(driverName, null, url);
72   }
73
74   /**
75    * Ein Objekt der Klasse <code>RechteDb</code> erzeugen.
76    * 
77    * @param dsName  Name der DataSource
78    */
79   public RechteDb(String dsName) {
80     this(null, dsName, null);
81   }
82
83     /**
84    * Ein Objekt der Klasse <code>RechteDb</code> erzeugen.
85      * 
86      * @param driverName
87      *          Name des Datenbanktreibers fuer den Fall dass keine DataSource
88    *          verwendet werden soll, sonst kann dieser Parameter null sein
89    * 
90    * @param dsName
91    *          Name der JDBC DataSource, wie er im Kontext des Servlet Containers 
92    *          erscheint, z.B. jdbc/AuthorityDB
93    *          
94      * @param url
95      *          der JDBC connect string, fuer den Fall dass keine DataSource
96      *          verwendet werden soll, sonst kann dieser Parameter null sein
97      */
98   @SuppressWarnings("rawtypes")
99     private RechteDb(String driverName, String dsName, String url) {
100         //super(productionMode, dsName, url);
101     super();
102     try {
103       if (url != null && !url.isEmpty()) {
104         Logger.getLogger(Logger.GLOBAL_LOGGER_NAME).finest("setting url to " + url);
105         if(driverName == null) {
106           setDatabase(DEFAULT_DRIVER, url);
107         } else {
108           setDatabase(driverName, url);
109         }
110       } else {
111         Logger.getLogger(Logger.GLOBAL_LOGGER_NAME).finest("setting data source to " + dsName);
112         setDataSourceName(dsName);
113       }
114     } catch (Exception ex) {
115       Logger.getLogger(Logger.GLOBAL_LOGGER_NAME).log(Level.SEVERE, ex.getMessage(), ex);
116     }
117     }
118   
119   /*
120   
121     select m.* from app.user_roles as ur, app.methoden_rechte as mr, app.methoden as m
122     where ur.role_name = mr.role_name 
123     and mr.mt_id = m.mt_id
124     and ur.user_name = [name]
125     
126     gibt eine Tabelle mit folgenden Spalten zurueck:
127     mt_id, mt_klasse, mt_name
128     die alle Methoden des Benutzers enthaelt
129   
130   */
131   
132   /**
133    * Die Rechte eines Benutzers ermitteln
134    * 
135    * @param Name des Benutzers
136    * @return eine Liste mit Berechtigungen des Benutzers
137    */
138   @SuppressWarnings("rawtypes")  
139   public List getRechte(String benutzerName) {
140     StringBuffer sql = new StringBuffer();
141     sql.append("select m.* from app.user_roles as ur");
142     sql.append(", app.methoden_rechte as mr, app.methoden as m");
143     sql.append(" where ur.role_name = mr.role_name");
144     sql.append(" and mr.mt_id = m.mt_id");
145     sql.append(" and ur.user_name = '");
146     sql.append(benutzerName);
147     sql.append("'");
148     List rechte = select(sql.toString());
149     return rechte;
150   }
151   
152   /**
153    * Pruefen ob ein Methodenaufruf erlaubt ist
154    * 
155    * @param klasse  vollstaendiger Name der Klasse, die die auszufuehrende Methode enthaelt
156    * @param methode Name der Methode, die ausgefuehrt werden soll
157    * @param benutzerName  Name des Benutzerkontos, dessen Benutzer die Methode ausfuehren moechte
158    * 
159    * @return true, wenn der Benutzer die Methode ausfuehren darf, false wenn nicht
160    */
161   @SuppressWarnings("unchecked")  
162   public boolean istErlaubt(ServletRequest request, ServletResponse response, String klasse, String methode, String benutzerName) {
163     boolean erlaubt = false;    
164     List<Map> rechte = getRechte(benutzerName);
165     if(rechte != null) {
166       for(int i = 0; i < rechte.size() && !erlaubt; i++) {
167         String rKlasse = (String) rechte.get(i).get("MT_KLASSE");
168         String rMethode = (String) rechte.get(i).get("MT_NAME");
169         /*
170           Verwendung von Regular Expressions, ein Muster fuer eine Klasse 
171           ist z.B. de.uhilger..*
172           
173           eine Methode koennte so lauten
174           .*
175           oder
176           get.*
177           
178           Der Punkt steht fuer ein beliebiges Zeichen,
179           das * steht fuer kein Mal oder beliebig oft das davor befindliche Zeichen
180           .* bedeutet 'ab dieser Stelle keinmal oder beliebig oft ein beliebiges Zeichen'
181           
182           + bedeutet stattdessen ein oder mehrmals das davor befindliche Zeichen 
183         */
184         erlaubt = klasse.matches(rKlasse) && methode.matches(rMethode);
185       }
186     }
187     return erlaubt;    
188   }
189   
190 }