/* 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 . */ package de.uhilger.transit.web; import java.util.List; import java.util.Map; import java.util.HashMap; import java.util.ArrayList; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; /** * Die Klasse RechteMap implementiert die Schnittstelle RechtePruefer * auf der Grundlage von Benutzerinformationen in einer Map. * * @author Copyright (c) Ulrich Hilger, http://uhilger.de * @author Published under the terms and conditions of * the GNU Affero General Public License * * @version 1, September 16, 2012 */ public class RechteMap implements RechtePruefer { public static final String RECHT_KLASSE = "MT_KLASSE"; public static final String RECHT_METHODE = "MT_NAME"; protected List> rechte; /** * Ein Objekt der Klasse RechteMap erzeugen. */ public RechteMap() { super(); rechte = new ArrayList>(); } /** * Die Rechte eines Benutzers ermitteln * * Diese Methode ist in dieser Klasse leer und fuehrt damit dazu * dass dieser RechtePruefer alle Methodenaufrufe ablehnt. * * Klassen, die von dieser Klasse abgeleitet sind, koennen * die Methode getRechte ueberschreiben, um eine beliebige * Menge von Methoden zu erlauben. Hart codiert koennte * eine implementierung z.B. wie folgt aussehen * *
   * List rechte = new ArrayList();
   * rechte.add(rechtBilden("de.uhilger.netzspeicher.persistenz.DocStore", "eintragArchiv"));
   * rechte.add(rechtBilden("de.uhilger.netzspeicher.persistenz.PublicStore", "getMonthDocs"));
   * return rechte;
   * 
* * @param benutzerName des Benutzers * @return eine Liste mit Berechtigungen des Benutzers */ @SuppressWarnings("unchecked") public List> getRechte(String benutzerName) { return rechte; } /** * Ein Berechtigungsobjekt bestehend aus Klassen- und Methodenname * zusammensetzen * @param klassenName Name der Klasse * @param methodenName Name der Methode * @return das Berechtigungsobjekt als Map */ protected Map rechtBilden(String klassenName, String methodenName) { Map m = new HashMap(); m.put(RECHT_KLASSE, klassenName); m.put(RECHT_METHODE, methodenName); return m; } /** * Pruefen ob ein Methodenaufruf erlaubt ist * * @param klasse vollstaendiger Name der Klasse, die die auszufuehrende Methode enthaelt * @param methode Name der Methode, die ausgefuehrt werden soll * @param benutzerName Name des Benutzerkontos, dessen Benutzer die Methode ausfuehren moechte * * @return true, wenn der Benutzer die Methode ausfuehren darf, false wenn nicht */ @SuppressWarnings("unchecked") public boolean istErlaubt(ServletRequest request, ServletResponse response, String klasse, String methode, String benutzerName) { boolean erlaubt = false; List> rechte = getRechte(benutzerName); if(rechte != null) { for(int i = 0; i < rechte.size() && !erlaubt; i++) { String rKlasse = rechte.get(i).get(RECHT_KLASSE); String rMethode = rechte.get(i).get(RECHT_METHODE); /* Verwendung von Regular Expressions, ein Muster fuer eine Klasse ist z.B. de.uhilger..* eine Methode koennte so lauten .* oder get.* Der Punkt steht fuer ein beliebiges Zeichen, das * steht fuer kein Mal oder beliebig oft das davor befindliche Zeichen .* bedeutet 'ab dieser Stelle keinmal oder beliebig oft ein beliebiges Zeichen' + bedeutet stattdessen ein oder mehrmals das davor befindliche Zeichen */ erlaubt = klasse.matches(rKlasse) && methode.matches(rMethode); } } return erlaubt; } }