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