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