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