Hallo,
ich verwende für eine JSF - Anwendung container managed security - CMS (Umgebung: glassfish 3.1, eclipse). Dabei wird eine index.html aufgerufen, welche einen Link auf eine JSF - Datei in einem geschützten Bereich enthält. Diese soll die Daten einer UserBean anzeigen (welche in login.html eingegeben wurden). Aufgrund der CMS wird bei Aufruf des Links in index.html automatisch eine login.html angezeigt. Nach Eingabe der Authentifizierungsdaten wird dann auf welcome.xhtml im geschützten Bereich weitergeleitet.
Nun habe ich eine Logout-Funktion in der UserBean geschrieben, welche den security session beendet (session.invalidate()) und einen redirect auf die index.html macht.
Problem: Wenn man ausloggt und wieder auf der index.html landet, und anschließend wieder auf den Link in den geschützten Bereich klickt, wird nicht die login.html angezeigt, sondern direkt die welcome.xhtml des geschützten Bereichs. Dabei ist zwar die Bean dahinter (welche die Daten für die Anzeige in welcome.xhtml enthält) leer, aber warum wird nicht direkt die login.html angezeigt?
Ich bekomme beim Start der Anwendung eine "WARNUNG: JSF1015: Anforderungspfad '/faces/protected/welcome.xhtml' beginnt mit einem oder mehreren Vorkommen der FacesServlet-Präfix-Pfad-Zuordnung '/faces'.", aber wenn im Link von index.html das faces weglasse, dann wird welcome.xhtml ja nicht als JSF-Seite interpretiert.
Wie kann ich den Logout machen, so daß man nicht mehr in den geschützten Bereich kommt? Geht das durh eine Änderung der Konfiguration oder Programmierung?
index.html
web.xml
[XML]<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
version="2.5">
<servlet>
<servlet-name>Faces Servlet</servlet-name>
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>/faces/*</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
</welcome-file-list>
<context-param>
<param-name>javax.faces.PROJECT_STAGE</param-name>
<param-value>Development</param-value>
</context-param>
<security-constraint>
<web-resource-collection>
<web-resource-name>Protected Pages</web-resource-name>
<url-pattern>/faces/protected/*</url-pattern>
<url-pattern>/protected/*</url-pattern>
</web-resource-collection>
<auth-constraint>
<role-name>alloweduser</role-name>
</auth-constraint>
</security-constraint>
<login-config>
<auth-method>FORM</auth-method>
<realm-name>LoginContainerRealm</realm-name>
<form-login-config>
<form-login-page>/login.html</form-login-page>
<form-error-page>/errorpages/noauth.html</form-error-page>
</form-login-config>
</login-config>
<security-role>
<role-name>alloweduser</role-name>
</security-role>
</web-app>[/XML]
faces-config.xml
[XML]<?xml version="1.0" encoding="UTF-8"?>
<faces-config xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_2_0.xsd"
version="2.0">
<navigation-rule>
<from-view-id>/protected/welcome.xhtml</from-view-id>
<navigation-case>
<from-outcome>logout</from-outcome>
<to-view-id>/index.html</to-view-id>
<redirect />
</navigation-case>
</navigation-rule>
</faces-config>[/XML]
UserBean
welcome.xhtml
[XML]<h:body>
<h:form>
<hutputText value="#{user.name}" />
<hutputText value="#{user.inRole}" />
</h:form>
</h:body>
</html>[/XML]
Danke,
Raphalon
ich verwende für eine JSF - Anwendung container managed security - CMS (Umgebung: glassfish 3.1, eclipse). Dabei wird eine index.html aufgerufen, welche einen Link auf eine JSF - Datei in einem geschützten Bereich enthält. Diese soll die Daten einer UserBean anzeigen (welche in login.html eingegeben wurden). Aufgrund der CMS wird bei Aufruf des Links in index.html automatisch eine login.html angezeigt. Nach Eingabe der Authentifizierungsdaten wird dann auf welcome.xhtml im geschützten Bereich weitergeleitet.
Nun habe ich eine Logout-Funktion in der UserBean geschrieben, welche den security session beendet (session.invalidate()) und einen redirect auf die index.html macht.
Problem: Wenn man ausloggt und wieder auf der index.html landet, und anschließend wieder auf den Link in den geschützten Bereich klickt, wird nicht die login.html angezeigt, sondern direkt die welcome.xhtml des geschützten Bereichs. Dabei ist zwar die Bean dahinter (welche die Daten für die Anzeige in welcome.xhtml enthält) leer, aber warum wird nicht direkt die login.html angezeigt?
Ich bekomme beim Start der Anwendung eine "WARNUNG: JSF1015: Anforderungspfad '/faces/protected/welcome.xhtml' beginnt mit einem oder mehreren Vorkommen der FacesServlet-Präfix-Pfad-Zuordnung '/faces'.", aber wenn im Link von index.html das faces weglasse, dann wird welcome.xhtml ja nicht als JSF-Seite interpretiert.
Wie kann ich den Logout machen, so daß man nicht mehr in den geschützten Bereich kommt? Geht das durh eine Änderung der Konfiguration oder Programmierung?
index.html
HTML:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Start page</title>
</head>
<body>
<p>Click <a href="faces/protected/welcome.xhtml">this link</a> to access protected
information.</p>
<p><a href="faces/adminarea/change.xhtml">admin area</a></p>
</body>
</html>
[XML]<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
version="2.5">
<servlet>
<servlet-name>Faces Servlet</servlet-name>
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>/faces/*</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
</welcome-file-list>
<context-param>
<param-name>javax.faces.PROJECT_STAGE</param-name>
<param-value>Development</param-value>
</context-param>
<security-constraint>
<web-resource-collection>
<web-resource-name>Protected Pages</web-resource-name>
<url-pattern>/faces/protected/*</url-pattern>
<url-pattern>/protected/*</url-pattern>
</web-resource-collection>
<auth-constraint>
<role-name>alloweduser</role-name>
</auth-constraint>
</security-constraint>
<login-config>
<auth-method>FORM</auth-method>
<realm-name>LoginContainerRealm</realm-name>
<form-login-config>
<form-login-page>/login.html</form-login-page>
<form-error-page>/errorpages/noauth.html</form-error-page>
</form-login-config>
</login-config>
<security-role>
<role-name>alloweduser</role-name>
</security-role>
</web-app>[/XML]
faces-config.xml
[XML]<?xml version="1.0" encoding="UTF-8"?>
<faces-config xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_2_0.xsd"
version="2.0">
<navigation-rule>
<from-view-id>/protected/welcome.xhtml</from-view-id>
<navigation-case>
<from-outcome>logout</from-outcome>
<to-view-id>/index.html</to-view-id>
<redirect />
</navigation-case>
</navigation-rule>
</faces-config>[/XML]
UserBean
Java:
@Named("user")
@SessionScoped
public class UserBean implements Serializable {
final static Logger logger = Logger.getLogger(UserBean.class);
private String name;
private String role;
public String getName() {
if (name == null)
getUserData();
return name == null ? "" : name;
}
public String getRole() {
return role == null ? "" : role;
}
public void setRole(String newValue) {
role = newValue;
}
public boolean isInRole() {
ExternalContext context = FacesContext.getCurrentInstance()
.getExternalContext();
Object requestObject = context.getRequest();
if (!(requestObject instanceof HttpServletRequest)) {
return false;
}
HttpServletRequest request = (HttpServletRequest) requestObject;
return request.isUserInRole(role);
}
private void getUserData() {
ExternalContext context = FacesContext.getCurrentInstance()
.getExternalContext();
Object requestObject = context.getRequest();
if (!(requestObject instanceof HttpServletRequest)) {
return "error";
}
HttpServletRequest request = (HttpServletRequest) requestObject;
name = request.getRemoteUser();
}
public String logout() {
ExternalContext context = FacesContext.getCurrentInstance()
.getExternalContext();
Object sessionObject = context.getSession(false);
if (!(sessionObject instanceof HttpSession)) {
return "error";
}
HttpSession session = (HttpSession) sessionObject;
session.invalidate();
return "logout";
}
}
welcome.xhtml
[XML]<h:body>
<h:form>
<hutputText value="#{user.name}" />
<hutputText value="#{user.inRole}" />
</h:form>
</h:body>
</html>[/XML]
Danke,
Raphalon