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.security.*;
22
23 import java.io.IOException;
24
25 import javax.servlet.Filter;
26 import javax.servlet.ServletException;
27 import javax.servlet.ServletRequest;
28 import javax.servlet.ServletResponse;
29 import javax.servlet.FilterChain;
30 import javax.servlet.FilterConfig;
31
32 import javax.servlet.http.HttpServlet;
33 import javax.servlet.http.HttpServletRequest;
34 import javax.servlet.http.HttpServletResponse;
35
36 /**
37  * Ein Filter zur Pruefung von Berechtigungen zum Einsatz in einer 
38  * Java EE konformen Webanwendung. Zum Einbau wird diese Klasse 
39  * im Deployment Desciptor (web.xml) deklariert.
40  * 
41  * @author Copyright (c) Ulrich Hilger, http://uhilger.de
42  * @author Published under the terms and conditions of
43  * the <a href="http://www.gnu.org/licenses/agpl-3.0" target="_blank">GNU Affero General Public License</a>
44  * 
45  * @version 1, September 16, 2012
46  */
47 public class Waechter implements Filter {
48   
49   /** Name, der als Benutzername verwendet wird, wenn kein Benutzer angemeldet ist */
50   public static final String ANONYMER_NUTZER = "anonymous";
51   
52   /** Das Objekt zur Pruefung von Berechtigungen */
53   protected RechtePruefer rechtePruefer;
54   
55   protected String className;
56   protected String methodName;
57   protected String userName;
58   
59   /**
60    * Pruefen, ob der zur Zeit angemeldete Benutzer eine HTTP-Anfrage 
61    * ausfuehren darf, die einen Methodenaufruf der Klassenbibliothek 
62    * Transit enthaelt.
63    * 
64    * Anfragen, die berechtigt sind, werden zur Verarbeitung weiter gereicht. 
65    * Ist eine Anfrage nicht berechtigt, wird die Anfrage nicht weiter 
66    * gereicht und eine Servlet Exception erzeugt.
67    * 
68    * @param request die zu pruefende Anfrage
69    * @param response die Antowrt des Servers
70    * @param chain Filterkette zur Weiterleitung der Anfrage fuer den Fall, dass 
71    * der Benutzer berechtigt ist.
72    */
73   public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException {
74     
75     getParameters(request);
76     
77     if(rechtePruefer == null) {
78       throw new ServletException("RechtePruefer konnte nicht erzeugt werden.");
79     } else {
80       if(rechtePruefer.istErlaubt(request, response, className, methodName, userName)) {
81         chain.doFilter(request, response);
82       } else {
83         throw new ServletException("Der Benutzer " + userName + 
84         " darf die Methode " + className + "." + methodName + " nicht ausfuehren.");
85       }
86     }
87   }
88   
89   protected void getParameters(ServletRequest request) throws ServletException {
90     className = ((HttpServletRequest) request).getParameter("c");
91     methodName = ((HttpServletRequest) request).getParameter("m");
92     userName = getUserName((HttpServletRequest) request);
93     
94     if(className == null) {
95       throw new ServletException("Parameter c fehlt.");
96     } else if(methodName == null) {
97       throw new ServletException("Parameter m fehlt.");      
98     } else if(userName == null) {
99       throw new ServletException("Name des Benutzers konnte nicht ermittelt werden.");      
100     }
101   }
102   
103   /**
104    * Den Namen des angemeldeten Benutzers ermitteln.
105    * 
106    * @param req  die Anfrage, deren Benutzer ermittelt werden soll
107    * @return Name des Benutzers oder <code>anonymous</code>, wenn 
108    * kein Benutzer angemeldet ist
109    */
110   public static String getUserName(HttpServletRequest req) {
111     String userName = null;
112       Principal p = req.getUserPrincipal();
113         if(p != null) {
114             userName = p.getName();
115         }
116         if(userName == null) {
117             userName = ANONYMER_NUTZER;
118         }
119         return userName;
120     }  
121   
122   /**
123    * Diesen Filter initialisieren
124    * 
125    * @param config die Konfiguration, die zur Initialisierung 
126    * verwendet werden soll
127    */
128   public void init(FilterConfig config) {
129     try {
130       String prueferKlassenName = config.getInitParameter("rechtePruefer");
131       if(prueferKlassenName != null) {
132         Class prueferKlasse = Class.forName(prueferKlassenName);
133         if(prueferKlasse != null) {
134           Object p = prueferKlasse.newInstance();
135           if(p != null && p instanceof RechtePruefer) {
136             this.rechtePruefer = (RechtePruefer) p;
137           } else {
138             rechteDbSetzen(config);
139           }
140         } else {
141           rechteDbSetzen(config);
142         }
143       } else {
144         rechteDbSetzen(config);
145       }
146     } catch(Exception e) {}
147   }
148   
149   private void rechteDbSetzen(FilterConfig config) {
150     this.rechtePruefer = new RechteDb(config.getInitParameter("dataSource"));
151   }
152   
153   /**
154    * Diesen Filter vernichten (vom Filter verwendete Ressourcen 
155    * frei geben usw.)
156    */
157   public void destroy() {
158     this.rechtePruefer = null;
159   }
160   
161 }