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