[Struts] TilesRequestProcessor - processRoles

Status
Nicht offen für weitere Antworten.

clemson

Bekanntes Mitglied
Hallo!

Folgendes: Ich habe eine Applikation in Struts entwickelt, welche unter anderem mit verschiedenen Benutzer - sprich verschiedene Rollen - umgehen muss. Welche Rollen welche Action sehen dürfen, habe ich in der struts-config.xml festgelegt...

Code:
<action path="/admin"
	type="org.dea.odm.struts.actions.OdmForwardAction"
	roles="admin">
	<forward path="screen.admin" name="success" />
</action>

Neben dieser Rollenverarbeitung arbeite ich außerdom noch mit Tiles - aber das nur nebenbei erwähnt.

Die Rolle eines Benutzers - ein entsprechendes User-Objekt wird in der Session abgelegt - wird in einer Datenbank abgespeichert. Derzeit habe ich die Überprüfung, ob ein Benutzer eine benötigte Rolle besitzt, folgendermaßen implementiert:

den TilesRequestProcessor, und im speziellen die Methode processRoles übesrchrieben
Code:
protected boolean processRoles( HttpServletRequest request,
		HttpServletResponse response, ActionMapping mapping )
		throws IOException, ServletException {

	this.logger.log(Level.INFO, "processRoles");

	// get the role of the current user
	HttpSession session = request.getSession();
	Employee empl = (Employee) session.getAttribute(Constants.USER_SESS_KEY);
	String user_role = (String) session.getAttribute(Constants.USER_ROLE_SESS_KEY);

	// get the authorized roles for this action
	String[] roles = mapping.getRoleNames();
	StringBuffer tmp = new StringBuffer();
	for (int i = 0; i < roles.length; i++) {
		tmp.append("'");
		tmp.append(roles[i]);
		tmp.append("' - ");
	}
	this.logger.log(Level.INFO, "Authorized Roles: " + tmp.toString());

	// if there are no role or the length is less than 1, the user is
	// authorized
	if (null == roles || roles.length < 1) {
		this.logger.log(Level.INFO, "User '" + empl.getUsername()
				+ "' is authorized, because there are no roles!");
		return true;
	}

	for (int i = 0; i < roles.length; i++) {
		// if the user_role equals a quthorized role, the access is garanted
		if (roles[i].equals(user_role)) {
			this.logger.log(Level.INFO, "User '" + empl.getUsername()
					+ "' is authorized, because he has role '" + roles[i]
					+ "'");
			return true;
		}
	}

	this.logger.log(Level.INFO, "User '" + empl.getUsername()
			+ "' is NOT authorized, because he has the unauthorized role '"
			+ user_role + "'!");

	return false;
}

Wenn ein Benutzer eine bestimmte Rolle inne hat, so ist dieser berechtigt, diese Action auszuführen - klappt wunderbar.

Das Problem ist nur, dass ein unauthorisierter Benutzer, welcher eine für ihn nicht authorisierte Action ausführt, auf eine leere Seite weitergeleitet wird...

Quelltext dieser leeren Seite:
Code:
<html><body></body></html>

Meine Frage ist nun: wie bzw. wo kann ich festlegen, auf welche Seite ein unauthorisierter Benutzer weitergeleitet wird, wenn dieser eine nicht authorisierte Action ausführen will. Ich hätte es gerne folgendermaßen gelöst, dass der Benutzer anstatt dass er auf eine leere Seite geforwarded wird, auf eine Seite verwiesen wird, auf welcher eine Information steht, dass der Benutzer diese Rolle nicht besitzt...

Muss ich da irgendeinen globalen forward definieren?? oder kann ich das gar in der processRoles definieren??
 

clemson

Bekanntes Mitglied
Allgemeinere Frage: Wie würdet denn ihr eine Rollen-Verwaltung implementieren mittels Struts? Wohl auch über das roles-Attribut in der struts-config, oder?
 

KSG9|sebastian

Top Contributor
clemson hat gesagt.:
Meine Frage ist nun: wie bzw. wo kann ich festlegen, auf welche Seite ein unauthorisierter Benutzer weitergeleitet wird, wenn dieser eine nicht authorisierte Action ausführen will

Wie läuft die Steuerung ab ?

-> User klickt auf nen Link
-> Link geht gegen eine StrutsAction
-> Action wird verarbeitet
-> Mapping wird returned


Dann würde ich es so machen:

struts-config.xml
Code:
<action path="/admin" 
   type="org.dea.odm.struts.actions.OdmForwardAction" 
   roles="admin"> 
   <forward path="screen.admin" name="success" /> 
   <forward path="/WEB-INF/view/error.jsp" name="error"/>
</action>


ActionKlasse

Code:
public ActionForward execute(Action.......){
  if( hatRechte())
    return mapping.findForward("success");
  else
    return mapping.findFoward("error");
  
}
 

KSG9|sebastian

Top Contributor
andere möglichkeit wäre noch folgende:


Du definierst dir eine Action die nur zum prüfen des Rechte da ist. In die Action packst du dann ein Forward für alle anderen Actions rein. Jeder Link den es gibt geht gegen diese ControllerAction und wird, wenn die Rechte vorhanden sind, zu der eigentlichen Action weitergeleitet.
 

clemson

Bekanntes Mitglied
diese möglichkeit habe ich mir auch schon gedacht. das problem ist nur, dass ich mehrere Action-Klassen besitze, und die Abfrage daher bei jeder Klasse machen müsste...

Dieses Problem habe ich folgendermaßen gelöst:

  • Ich habe eine Klasse OdmAction, welche von der Klasse Action des Struts-Pakets erbt
  • In der Methode final execute(Mapping,Form,Request,Response) der Klasse OdmAction wird die Überprüfung ausgeführt, ob der User die Rechte besitzt oder nicht. Besitzt dieser die Rechte, so wir die abstrakte Methode executeAction aufgerufen
  • Alle "wirklichen" Actions meiner Applikation erben nun von dieser Klasse OdmAction, und müssen daher auch die abstrakte Methode executeAction implementieren

Meine zweite Lösungsmöglichkeit wäre, die Rollen jeder Action, welche ein Benutzer besitzen muss, in der struts-config.xml bei den jeweiligen Actions zu definieren. Um zu überprüfen, ob ein User die vorhandene Rolle besitzt (welche in einer Datenbank gespeichert werden), muss ich die Methode processRoles des TilesRequestProcessors überschreiben...

Und da taucht mein Problem auf: Wenn der User die authorisierte Rolle nicht besitzt, so möchte ich, dass anstatt der internen Fehlerseite eine von mir festgelegte Fehlerseite angezeigt wird. Ich weiss allerdings nicht wie, denn die Methode processRoles hat als Rückgabetyp boolean, und wenn false zurückgegeben wird, so wird diese interne Fehlerseite angezeigt...
 

clemson

Bekanntes Mitglied
hmm, ich könnte bei jeder einen exception parameter angeben...

aber gibt es auch eine möglichkeit, dass ich nicht bei jeder action diese definition machen muss, sondern ich eine globale exception definieren kann??
 

odysseus

Bekanntes Mitglied
ich hab mit den roles in struts noch nicht getan, aber bevor Du in jede Action Klasse in der struts-config.xml ein und die selbe Exception deklarierst, solltest Du eine global exception deklarieren.
 

clemson

Bekanntes Mitglied
odysseus hat gesagt.:
ich hab mit den roles in struts noch nicht getan, aber bevor Du in jede Action Klasse in der struts-config.xml ein und die selbe Exception deklarierst, solltest Du eine global exception deklarieren.

ja, das habe ich auch jetzt gemacht ;)
 

clemson

Bekanntes Mitglied
Folgendes:

Ich habe mir eine Klasse OdmExceptionHandler definiert, welche von ExceptionHandler des apache pakets erbt. diesen odmexceptionhandler habe ich in meiner struts-config folgendermaßen eingetragen:

Code:
<global-exceptions>
	<exception type="java.lang.Exception"
		handler="org.dea.odm.struts.OdmExceptionHandler"
		key="exception.global"
		bundle="err" 
		scope="request"
		path="screen.error" />
</global-exceptions>

Wenn ich jetzt bei meinem OdmRequestProcessor in der Methode processRoles false zurückgebe, dann müsste doch eigentlich eine UserIsNotAuthorizedException von struts geworfen werden, und diese müsste dann von meinem OdmExceptionHandler behandlet werden, oder?? Tut sie aber nicht. Wisst ihr warum bzw. wo mein denkfehler liegt??
 

KSG9|sebastian

Top Contributor
so geht es:

Code:
public boolean processRoles(HttpServletRequest request,
			HttpServletResponse response, ActionMapping mapping)
			throws IOException, ServletException {

		String[] roles = mapping.getRoleNames();
		
		for(int i=0; i<roles.length; i++){
			if(request.isUserInRole(roles[i]))
				return true;
		}
                                //default.do bringt den Benutzer wieder zurück zur Login-Seite
    
		request.getRequestDispatcher("/default.do").include(request, response);

		return false;

	}
 

KSG9|sebastian

Top Contributor
den RequestDispatcher kenn ich von Portlets..daher ist mir das jetzt erst eingefallenk, da ich auch ein paar Sachen mit Struts gemacht hab... ;)
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
S Struts 2 datetimepicker Allgemeines EE 3
W Struts Tutorial für EE Noobs? Allgemeines EE 2
N Struts vs JSF ? Allgemeines EE 7
W Speicher-Problem bei WebApp unter Tomcat, Struts, Hibernate Allgemeines EE 3
Lex Property per html:link schreiben in struts Allgemeines EE 2
Shihan Line Breaks in <br /> umwandeln (Struts) Allgemeines EE 7
S Struts: zwei JSP's nutzen eine Action Allgemeines EE 5
G Struts: ActionMessage value in JSP anzeigen Allgemeines EE 2
S Problem mit Struts und tiles Allgemeines EE 4
S Struts und Session Allgemeines EE 2
K Struts - FormBean mit 2 Listen - Anzeigen und Speichern Allgemeines EE 2
S Probleme mit struts - ActionServlet Allgemeines EE 6
C Struts in iFrame Allgemeines EE 2
Z Struts: Formularfelder initialisieren Allgemeines EE 3
S Struts: Wert in einem iterierten Drop-Down Menü selektieren Allgemeines EE 7
T Struts 2 Allgemeines EE 6
R Struts-Action in JSP abfragen? Allgemeines EE 2
J struts: Bild als submit-button Allgemeines EE 2
J Internationalization mit Struts Allgemeines EE 2
E bei struts inhalte über mehrere seite verteilen Allgemeines EE 6
velaluka Struts- falsches Character-Encoding? Allgemeines EE 3
M URL Darstl. und Struts Allgemeines EE 2
G Struts beans Allgemeines EE 7
D Struts + Table Allgemeines EE 6
L Struts - Action auslösen bei Browser Back Allgemeines EE 2
N Struts - Problem mit <html:link> Action Allgemeines EE 3
netspy Struts, Spring oder ... ? Allgemeines EE 5
S Struts - Direktaufruf eines URL verhindern Allgemeines EE 11
1 Frage zu Struts und findForward Allgemeines EE 4
N Struts Jboss und Filter Allgemeines EE 2
S Fragen zu: Servlets, Struts & Hibernate Allgemeines EE 9
T Struts und Objekte in Comboboxen Allgemeines EE 4
J Probleme mit Struts Allgemeines EE 3
K STRUTS The server encountered an internal error Allgemeines EE 5
F struts logic:iterate Allgemeines EE 5
M STRUTS/Cannot retrieve definition for form bean null on acti Allgemeines EE 4
G struts-config.xml Allgemeines EE 3
H Ich bin sehr verwirrt - struts, jsp, jsf . ? Allgemeines EE 53
P Testen von Struts-Anwendung Allgemeines EE 7
P Struts Form Bean vs. Session Variable Allgemeines EE 6
A Tomcat undeploy unter Windows klappt nicht wegen struts.jar Allgemeines EE 2
B Struts Problem: Array in JSP ausgeben (logic:iterate) Allgemeines EE 12
M Struts Deployment Allgemeines EE 3
R Mehrsprachige Seite mit Struts & Co. ? Allgemeines EE 5
S mehrere Message Resources in Struts ansprechen Allgemeines EE 7
G Values aus DB in Input-Feldern anzeigen (Struts) Allgemeines EE 2
G Exception creating bean of class . (Struts) Allgemeines EE 8
B Verwendung von DynActionForm (Struts) Allgemeines EE 10
K dynamischer Zugriff auf .properties (Struts) Allgemeines EE 2
K Struts html:messages tag Allgemeines EE 2
M Struts File Upload problem Allgemeines EE 6
G Validierung mittels Struts. Benötige Hilfe. Allgemeines EE 7
J Buchempfehlung: Servlets, JSP, Struts, JSTL Allgemeines EE 3
P struts "beliebige motive in der datenbank finden" Allgemeines EE 6
P Struts und Frames Allgemeines EE 13
L jfreechart und Struts / JSPs Allgemeines EE 3
P struts Hibernate MySQL Select Statement Allgemeines EE 24
P keine verbindung vom struts framework zu mysql Allgemeines EE 2
R Vernünftige Session-Verwaltung mit Struts Allgemeines EE 4
P Struts Anwendung- FormBean Tabelle mit input type=text Allgemeines EE 2
G Probleme mit Validierung (Struts, validation.xml) Allgemeines EE 4
M Struts - ActionForward Allgemeines EE 9
clemson gesplittete struts-config mittels ant zusammenbauen Allgemeines EE 2
J Struts Textfeld Allgemeines EE 10
M Struts shale Allgemeines EE 7
M Struts - jsp site - werte formatieren Allgemeines EE 6
clemson mehrere Mail Attachments - JSP Struts Allgemeines EE 7
T JSTL + Struts (inkl.Hibernate) -> forEach Problem Allgemeines EE 6
R Struts FormBean Allgemeines EE 4
S Struts 1.1 download einer Datei Allgemeines EE 4
R Use bean in scriptlet in struts Allgemeines EE 4
S reagieren auf select events in jsp-struts seiten Allgemeines EE 5
P Struts - Text formatieren Allgemeines EE 6
C Grafische Komponenten unter Struts jsp (Liste) Allgemeines EE 4
P Struts - Abarbeitung Allgemeines EE 3
P J2EE Struts - Database connection failed - Hilfe?:( Allgemeines EE 6
P J2EE Struts Allgemeines EE 2
R struts 1.0.2 Checkbox-Property bleibt immer false Allgemeines EE 3
TRunKX Werteübergabe von einer *.jsp in eine *.java ohne struts Allgemeines EE 4
clemson [Struts] Validierung server-seitig bringt StackOverflowError Allgemeines EE 5
clemson [Struts] HTML-Checkbox Tag ID Allgemeines EE 2
clemson [Struts] Einer Action Parameter übergeben Allgemeines EE 2
clemson [Struts] Innerhalb Action auf form zugreifen Allgemeines EE 4
G In einer JSP auf Struts-Elemente "reagieren" Allgemeines EE 4
clemson [Struts] struts-config.xml parsen Allgemeines EE 2
clemson [Struts] Parameter an ActionForward anhängen Allgemeines EE 3
F Struts Allgemeines EE 9
G Struts-Write Anweisungen in Hyperlink einbauen Allgemeines EE 3
G Struts-Form: in validate- oder reset-Methode umleiten. Allgemeines EE 3
G Listenfeld mit Struts und Beans realisieren Allgemeines EE 4
L Anfänger: suche Tutorials zu Struts/EJB Allgemeines EE 6
G Struts - dynamisches FormBean Allgemeines EE 3
R struts und Mapped Properties Allgemeines EE 2
A Javadocs zu struts Allgemeines EE 5
A Kolloquium J2EE / Struts Allgemeines EE 16
A Expression Language in Struts? Allgemeines EE 6
A Form Validierung mit Struts? Allgemeines EE 2
A struts: html:form-tag das Attribut "name" ersetzen Allgemeines EE 7
B struts - beginnerproblem Allgemeines EE 3
B Struts DBCP Allgemeines EE 4

Ähnliche Java Themen

Neue Themen


Oben