JSF Überprüfen der Session ID in JSF und JAVA

Dominik1986

Mitglied
Hallo alle zusammen,

Ich arbeite zur Zeit etwas mit JSF und bin dabei eine Login-Page zu entwerfen. Ich prüfe hierbei ob Benutzername und Passwort korrekt sind, wenn ja kommt der Benutzer auf die nächste Seite, wenn nicht wird ihm eine Error-Page angezeigt.
Meine Frage ist nun, wie ich die Seite auf die ich mittels erfolgreichen Login schützen kann? Also zum Beispiel Link kopieren und dann in einem neuen Fenster reinkopieren soll den Nutzer dann wieder auf die Login-Page leiten.
Wie kann man das am Einfachsten bewerkstelligen?

Danke und Gruß,

Dominik
 
Die Anwendung in unterschiedliche Bereiche bzw. Ordner einteilen (public/private) -> entweder was eigenes

viewexpiredexception

access-control-using-phaselistener.html

oder

Shiro

Greetz


Danke für die Links. Die gezeigten Beispiele sind allerdings Anwendungen wo ich auf die Gruppe des Nutzers schaue, und je nachdem zu welcher Gruppe er gehört zeig ich ihn Seiten an oder nicht. Ich möchte das allerdings über die Session ID machen.
Also ich bekomme ja eine Session ID sobald ich mich in die Anwendung einlogge, dann kopier ich den Link im Browser und logge mich auch, hier soll dann die Session wieder gekillt werden. Wenn ich dann den kopierten Link wieder in den Browser einfüge, dann möchte ich, dass der Nutzer nicht zu dem Fenster kommt wo er nach der Anmeldung war, sondern er soll zum Login-Fenster gelangen.
 
Danke für die Links. Die gezeigten Beispiele sind allerdings Anwendungen wo ich auf die Gruppe des Nutzers schaue, und je nachdem zu welcher Gruppe er gehört zeig ich ihn Seiten an oder nicht. Ich möchte das allerdings über die Session ID machen.
Also ich bekomme ja eine Session ID sobald ich mich in die Anwendung einlogge, dann kopier ich den Link im Browser und logge mich auch, hier soll dann die Session wieder gekillt werden. Wenn ich dann den kopierten Link wieder in den Browser einfüge, dann möchte ich, dass der Nutzer nicht zu dem Fenster kommt wo er nach der Anmeldung war, sondern er soll zum Login-Fenster gelangen.

Session beenden:
Java:
FacesContext.getCurrentInstance().getExternalContext().invalidateSession();
// weiter leiten zur login Seite.

sondern er soll zum Login-Fenster gelangen.

Genau das wird in den Beispielen beschrieben. Anstatt der Session Id würde ich in die Session mit einem Token-Namen etwas eindeutiges ablegen Bsp: die User id. Existiert zu dem Token Bsp: eine User id-> ist der User angemeldet ansonsten nicht (umleiten zur Login-Seite).

Ablegen:
Java:
FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put("security-token",userId);

Anfragen:
Java:
boolean login = FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("security-token") != null;
 
Vielen Dank für die Antwort. Ich hab jetzt nur ein Problem mit dem Logout-Button, und zwar reagiert er beim Drücken nicht, und ich weiß jetzt auch ehrlich gesagt nicht, woran es liegt, hier mal der Code:

HTML:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"  
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:f="http://java.sun.com/jsf/core"
      xmlns:h="http://java.sun.com/jsf/html">  
   <h:head>
      <title>#{msgs.title}</title>
      <link rel="stylesheet" type="text/css" href="css/basic.css"/>	  
   </h:head>
   <h:body>      
      <div align="left" style="float: left;">
   	  	<img src="images/klug_neu.gif"/>
   	  </div>
   	  <div align="right">
   	  	<img src="images/klug_neu.gif"/>
   	  </div>
   	  <div align="center">
   	  	<h1>#{msgs.title}</h1>
   	  </div>
   	  <div>   	  	
	   	  <ul id="navigation">
	   	  	<li><a href="passwordmanagement.xhtml">#{msgs.accesses}</a></li>
	   	  	<li><a href="userManagement.xhtml">#{msgs.userManagement}</a></li>
	   	  </ul>
	   	  <h:commandButton value="#{msgs.logout}" action="#{user.logout}"/>	   	  
   	  </div>   	  
   </h:body>
</html>

Java:
import java.io.Serializable;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;

@ManagedBean
@SessionScoped
public class User implements Serializable {		
	
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	public User() {
		
	}
	
	public User(String userName, String password) {		
		this.userName = userName;
		this.password = password;
	}

	private String userName;
	private String password;
	
	public String getUserName() {
		return userName;
	}

	public void setUserName(String userName) {
		this.userName = userName;
	}

	public String getPassword() {
		return password;
	}

	public void setPassword(String password) {
		this.password = password;
	}
	
	/**
	 * Gibt zurück ob sich der Benutzer am Active Directory anmelden konnte, je nachdem kommt er dann
	 * entweder in die Seite hinein oder gelangt zur error-Page
	 * @return String
	 */
	public String checkAD() {		
		ADAuthenticator auth = new ADAuthenticator();
		if (auth.authenticate(userName, password)) {
			login();
			return "true";
		} else {
			return "false";
		}
	}

	private void login() {
		
	}
	
	public void logout() {
		System.out.println("logout");
	}
}
 
Warum das alles selber bauen? In JEE gibt es Standardwege zur Implementierung von Sicherheitsmechanismen. Entweder per web.xml (security-constraint etc.) oder seit neuestem bestimmt auch mit Annotationen.

Wenn schon selbst implementiert, dann sicher nicht mit einer Prüfmethode in jeder ManagedBean sondern wenigstens mit (Servlet-)Filter...
 
Warum das alles selber bauen? In JEE gibt es Standardwege zur Implementierung von Sicherheitsmechanismen. Entweder per web.xml (security-constraint etc.) oder seit neuestem bestimmt auch mit Annotationen.

Wenn schon selbst implementiert, dann sicher nicht mit einer Prüfmethode in jeder ManagedBean sondern wenigstens mit (Servlet-)Filter...


Das ist mir durch aus bewußt -> d.h. auch die Links die ich weiter oben gepostet habe:

@Dominik1986
Die Prüfung in eine PhaseListener einbauen - nicht in eine ManagedBean

viewexpiredexception
statt

Java:
// JAAS
   final boolean login = facescontext.getExternalContext().getRemoteUser() != null;

das

Java:
boolean login = facescontext.getExternalContext().getSessionMap().get("security-token") != null;


Das wäre die einfachste von den Möglichkeiten:

1. Phaselistener (Besser als ServletFilter)
2. Apache Shiro
3. oder JAAS + Schnittstellen des Containers/App-Server verwenden.


Greetz
 

Zurück
Oben