JSF Komisches Verhalten nach Login per Realm

Willi2793

Aktives Mitglied
Hallo,

ich versuche gerade einen Login per JDBCRealm zu realisieren. Im Prinzip funktioniert es auch. Soll heissen: nach einer falschen UID/PWD Eingabe erscheint die Fehler-Seite. Allerdings ist die Reaktion nach einer gültigen Kombi für mich merkwürdig. Ich zeige erstmal die relevanten Code-Teile:

web.xml:
[XML] <welcome-file-list>
<welcome-file>/home.xhtml</welcome-file>
</welcome-file-list>
<security-constraint>
<display-name>userConstraint</display-name>
<web-resource-collection>
<web-resource-name>all</web-resource-name>
<description/>
<url-pattern>/*</url-pattern>
</web-resource-collection>
<auth-constraint>
<description/>
<role-name>user</role-name>
<role-name>admin</role-name>
</auth-constraint>
</security-constraint>
<login-config>
<auth-method>FORM</auth-method>
<realm-name>twiburealm</realm-name>
<form-login-config>
<form-login-page>/faces/login.xhtml</form-login-page>
<form-error-page>/faces/loginError.xhtml</form-error-page>
</form-login-config>
</login-config>
<security-role>
<description/>
<role-name>user</role-name>
</security-role>
<security-role>
<description/>
<role-name>admin</role-name>
</security-role>[/XML]

login.xhtml:
HTML:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:f="http://java.sun.com/jsf/core"
      xmlns:c="http://java.sun.com/jsp/jstl/core"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:ui="http://java.sun.com/jsf/facelets">
    <body>
        <ui:composition template="/template.xhtml">
            <ui:define name="title">
                <h:outputText value="TWiBu - Login"/>
            </ui:define>
            <ui:define name="header">
            <c:set target="#{flash}" property="keepMessages" value="true" />
            </ui:define>
            <ui:define name="content">
                <f:view>
                    <form method="post" action="j_security_check" name="loginForm">
                        <p/>Bitte melden Sie sich
                        <p/>mit Ihrer Userid und
                        <p/>Ihrem Passwort an:
                        <p/>
                        <h:outputLabel value="Userid:"/>
                        <h:inputText id="j_username"/>
                        <br/>
                        <h:outputLabel value="Passwort:"/>
                        <h:inputSecret id="j_password"/>
                        <p/>
                        <h:commandButton value="Login" id="loginid"/>
                        <p/>
                        <h:message for="loginid"/>
                    </form>
                </f:view>
            </ui:define>
        </ui:composition>
    </body>
</html>

template.xhtml:
HTML:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:c="http://java.sun.com/jsp/jstl/core"
    xmlns:ui="http://java.sun.com/jsf/facelets">
    <h:head>
        <meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate" /> 
        <meta http-equiv="Pragma" content="no-cache" /> 
        <meta http-equiv="Expires" content="0" /> 
        <h:outputStylesheet library="style" name="twibu.css"/>
        <link rel="shortcut icon" type="image/x-icon" href="#{request.contextPath}/resources/images/icon.ico" />
        <link rel="icon" type="image/x-icon" href="#{request.contextPath}/resources/images/icon.ico" />
        <title><ui:insert name="title">TWiBu - Standard-Titel</ui:insert></title>
        <ui:insert name="header"/>
    </h:head>
    <h:body>
        <ui:insert name="content"/>
    </h:body>
</html>

Die interessante Zeile ist in template.xhtml. Und zwar setze ich da ja einen link für eine CSS-Datei:

Code:
<link rel="shortcut icon" type="image/x-icon" href="#{request.contextPath}/resources/images/icon.ico" />

Wenn diese Zeile da ist wird nach erfolgreichem Login diese CSS-Datei im Editor geöffnet. Ist die Zeile nicht da kommt die gewünschte Seite home.xhtml. Ich habe keine Idee woran das liegen könnte.

Grüße,
Willi

P.S.: Das Ganze unter GlassFish 3.1.2 unter windows
 
Zuletzt bearbeitet:
ist relativ einfach zu erklären, der Browser versucht die Zeile zu laden, was er jedoch nicht darf, da du noch nicht eingeloggt bist.
Sobald du dich dann einloggst, wirst du wahrscheinlich die CSS Datei sehen. (Ist aber glaub ich nicht bei jedem Browser so).
Um dem entgegen zu wirken, kannst du mal folgendes versuchen:
[XML]
<security-constraint>
<web-resource-collection>
<web-resource-name>All Access</web-resource-name>
<url-pattern>/resources/style/*</url-pattern> <!-- bin ich mir nicht zu 100% sicher 😀 -->
<http-method>DELETE</http-method>
<http-method>PUT</http-method>
<http-method>HEAD</http-method>
<http-method>OPTIONS</http-method>
<http-method>TRACE</http-method>
<http-method>GET</http-method>
<http-method>POST</http-method>
</web-resource-collection>
<user-data-constraint>
<transport-guarantee>NONE</transport-guarantee>
</user-data-constraint>
</security-constraint>
[/XML]

Viel mehr infos findest du auch hier:
Understanding Web Security Using web.xml Via Use Cases | Javalobby

Edit:
Was als info noch fehlt 🙂 der obere Teil der XML bedeutet dann, dass man auf "/resources/style/*" ohne login zugreifen darf...

Gruß
 
Danke, das war es zwar noch nicht ganz, aber ich habe jetzt eine Idee in welche Richtign ich suchen kann/muss. Warum Dein Vorschlag noch nicht ganz zum Ziel führte: Diese Definition definiert "unchecked access". Also für jeden authentifizierten User. Aber beim anzeigen der Login-Seite ist er ja noch nicht authentifiziert 😉

Ich suche mal weiter, hindere aber natürlich niemanden weiter Ansätze zu liefern. 😀

Grüße,
Willi
 
Jetzt klappt's.

Das Problem war, das ich noch den URL-Pattern "/*" definiert hatte auf den nur User mit einer Rolle Zugriff hatten. Darunter fielen dann auch die URLs "/resources/*". Ich habe nun alle Seiten ausser login, loginError und template in ein user-Verzeichnis verschoben und dies in dem Pattern definiert. Dadurch sind auch die resoureces nicht mehr geschützt.

Vielen Dank für den Denkanstoss. Jetzt habe ich nur noch ein Problem mit dem "favicon". Aber das ist ein anderes Thema und wenn ich nicht weiter komme eröffne ich einen andere Thread.

Grüße,
Willi
 

Neue Themen


Zurück
Oben