Java Web Services via REST bereitstellen
ulrich
2015-02-13 40914e052a09892e62f19b2be1e024b796aedace
WaechterRS hinzugefuegt
1 files added
176 ■■■■■ changed files
src/de/uhilger/transit/web/WaechterRS.java 176 ●●●●● patch | view | raw | blame | history
src/de/uhilger/transit/web/WaechterRS.java
New file
@@ -0,0 +1,176 @@
/*
 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 java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
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 WaechterRS 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 {
    HttpServletRequest req = (HttpServletRequest) request;
    String pathInfo = req.getPathInfo();
    String[] elemente = pathInfo.split("/");
    className = elemente[1];
    methodName = elemente[2];
    //className = ((HttpServletRequest) request).getParameter("c");
    //methodName = ((HttpServletRequest) request).getParameter("m");
    userName = getUserName(req);
    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;
  }
}