WebHU - Programozási kérdések és válaszok

jsf szűrő úgy tűnik nem működik

Megpróbáltam létrehozni egy biztonságos bejelentkezési oldalt jsf segítségével, és ezeket a kódrészleteket használtam megoldásként, amelyek a következő helyen találhatók: ezt a kérdést. A problémám az, hogy bejelentkezés nélkül elérhetem a /restricted/secret.xhtml-t, nincs átirányítás, olyan, mintha nem alkalmazták volna a szűrőt, mert ha közvetlenül a /restricted/secret.xhtml-re megyek, akkor a #{user.loggedIn } értéke false, és továbbra is meg tudom nézni az oldalt. Íme a kódom:

AuthFilter.java

public class AuthFilter implements Filter {

private FilterConfig config;

@Override
public void destroy() {
    this.config = null;
}

@Override
public void doFilter(ServletRequest req, ServletResponse resp,
        FilterChain ch) throws IOException, ServletException {

    HttpSession s =  ((HttpServletRequest) req).getSession();
    if (s.getAttribute(UserBean.CREDENTIAL)==null)
    {
        ((HttpServletResponse) resp).sendRedirect("/login.faces");
    }else
    {
        ch.doFilter(req, resp);
    }
}
@Override
public void init(FilterConfig config) throws ServletException {
    this.config = config;
}
}

UserBean.java

@ManagedBean(name="user")
@SessionScoped
public class UserBean implements Serializable {

private String name;
private String password;
protected static final String CREDENTIAL = "ontherun";

private static final long serialVersionUID = 1L;

public String getName()
{
    return this.name;
}

public void setName(String newName)
{
    this.name = newName;
}

public String getPassword()
{
    return this.password;
}

public void setPassword(String newPassword)
{
    this.password = newPassword;
}

public boolean isLoggedIn()
{
    return FacesContext.getCurrentInstance().getExternalContext()
            .getSessionMap().get(CREDENTIAL) != null;
}

public String logout() {
    FacesContext.getCurrentInstance().getExternalContext().getSessionMap().remove(CREDENTIAL);
    return null;
}


public String login()
{
    FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put(CREDENTIAL, this.name);
    return "secret";
}
}

Itt van a login.xhtml ; az oldal megfelelően működik, így nincs probléma a sablonfájllal.

<!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:ui="http://java.sun.com/jsf/facelets"
    xmlns:h="http://java.sun.com/jsf/html">
<head><title>IGNORED</title></head>

<body>
<ui:composition template="/templates/masterLayoutTemplate.xhtml">
 <ui:define name="windowTitle">
             #{msgs.window_title}
 </ui:define>

 <ui:define name="header">
    <ui:include src="/sections/login/header.xhtml"></ui:include>
 </ui:define>

 <ui:define name="footer">
    <ui:include src="/sections/login/footer.xhtml"></ui:include>
 </ui:define>

 <ui:define name="content">
        <h:form>
            <h:panelGrid columns="2">
                #{msgs.namePrompt}
            <h:inputText id="name" value="#{user.name}"/>
                #{msgs.passwordPrompt}
            <h:inputSecret id="password" value="#{user.password}"/>
            </h:panelGrid>
            <p>
            <h:commandButton value="#{msgs.loginButtonText}" action="#{user.login }"/>
            </p>
            <p>
                You are logged in : #{user.loggedIn} 
            </p>
            <p>
            <h:commandButton value="logout" action="#{user.logout }"/>
            </p>
        </h:form>
 </ui:define>
 </ui:composition>
</body>
</html>

Itt van a secret.xhtml, amely állítólag korlátozott:

<!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:ui="http://java.sun.com/jsf/facelets"
    xmlns:h="http://java.sun.com/jsf/html">
<head><title>IGNORED</title></head>

<body>
<ui:composition template="/templates/masterLayoutTemplate.xhtml">
 <ui:define name="windowTitle">
     #{msgs.window_title}
 </ui:define>


 <ui:define name="content">
        <h:head></h:head>
        <h:body>
            <p>You are #{user.loggedIn}</p>
        </h:body>


 </ui:define>
 </ui:composition>
</body>
</html>

És itt vannak a konfigurációs fájljaim: web.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_3_0.xsd" version="3.0">
<display-name>OnTheRun</display-name>

<servlet>
    <servlet-name>Faces Servlet</servlet-name>
    <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>Faces Servlet</servlet-name>
    <url-pattern>/faces/*</url-pattern>
</servlet-mapping>

<welcome-file-list>
    <welcome-file>faces/index.xhtml</welcome-file>
</welcome-file-list>

<filter>
        <filter-name>AuthFilter</filter-name>
        <filter-class>on.run.AuthFilter</filter-class>
 </filter>
 <filter-mapping>
        <filter-name>AuthFilter</filter-name>
        <url-pattern>/restricted/*</url-pattern>
 </filter-mapping>

<context-param>
    <param-name>javax.faces.PROJECT_STAGE</param-name>
    <param-value>Development</param-value>
</context-param>

</web-app>

és faces-config.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">
<application>
    <resource-bundle>
        <base-name>on.run.messages</base-name>
        <var>msgs</var>
    </resource-bundle>
</application>



<navigation-rule>
        <from-view-id>/index.xhtml</from-view-id>
    <navigation-case>
        <from-outcome>login</from-outcome>
        <to-view-id>/profile.xhtml</to-view-id>
        <redirect/>
    </navigation-case>
</navigation-rule>

<navigation-rule>
        <from-view-id>/login.xhtml</from-view-id>
    <navigation-case>
        <from-outcome>secret</from-outcome>
        <to-view-id>/restricted/secret.xhtml</to-view-id>
        <redirect/>
    </navigation-case>
</navigation-rule>
</faces-config>

A címtárszerkezetem így néz ki: dirStruct 2


Válaszok:


1

A FacesServlet térképet a *.xhtml helyett a /faces/* webhelyen helyezte el. Tehát minden JSF-kérelem /faces előtagot tartalmaz az URL-ben. De az AuthFilter-et a /restricted/*-ra képezte le a /faces/restricted/* helyett, így soha nem fog beindulni a /faces/* URL-eken.

Ezt 2 módon oldhatja meg:

  1. Térkép FacesServlet a *.xhtml helyén a /faces/* helyett. Ennek az a további előnye, hogy a végfelhasználó soha nem fogja látni a nyers JSF-forráskódot, amikor a végfelhasználó szándékosan eltávolítja a /faces elérési utat a böngésző címsorában található URL-ből.

  2. A AuthFilter térkép a /faces/restricted/* helyén a /restricted/* helyett.

Én személy szerint az első utat ajánlom. Rövidebb és szebb URL-t kap, és azonnal megakadályozza a JSF forráskód kiszivárgását.

07.06.2012
  • Köszönöm a segítségedet. A szűrőben módosítanom kellett a ../login.xhtml címre történő átirányítási útvonalat is. Van erre valami elegánsabb mód› Úgy értem, hogyan tudom beállítani a projektkönyvtár betöltésének elérési útját? Az én esetemben, ha csak a login.xhtml-t vagy a /login.xhtml-t írom, akkor a localhost/login.xhtml-re irányít át, nem a localhost/ProjectName/login.xhtml-re. 07.06.2012
  • Használja a String loginURL = request.getContextPath() + "/login.xhtml";. 07.06.2012
  • Új anyagok

    A rádiógomb ellenőrzött eseményének használata a jQueryben
    Ebben a cikkben látni fogjuk, hogyan kell dolgozni a jquery választógombbal ellenőrzött eseményeivel. A választógombok HTML gombok, amelyek segítenek kiválasztani egyetlen értéket egy csoportból...

    Körkörös függőségek megoldása terraformban adatforrásokkal – lépésről lépésre
    Mi az a körkörös függőségek Dolgozzunk egy egyszerű eseten, amikor az SQS-sor és az S3-vödör közötti körkörös függőség problémája van egy egymástól függő címkeérték miatt. provider..

    Miért érdemes elkezdeni a kódolást 2023-ban?
    01100011 01101111 01100100 01100101 — beep boop beep boop Világunk folyamatosan fejlődik a technológia körül, és naponta fejlesztenek új technológiákat a valós problémák megoldására. Amint..

    🎙 Random Noise #2  – Örökbefogadás és hit
    az analitika íratlan világának gondozása Szeretné, hogy ezek a frissítések a postaládájába kerüljenek? Iratkozzon fel itt . "Ha önvezető autókat gyártanak, akkor mi miért ne..

    A legrosszabb politika és prediktív modellek májátültetésre jelöltek számára az Egyesült Államokban
    A máj (vagy óangolul lifer) az emberi test legnehezebb belső szervére utal, amely csendesen működik a nap 24 órájában. Mit csinál a máj? 500 feladatot hajt végre a szervezet egészségének..

    5 webhely, amely 2022-ben fejleszti front-end fejlesztői készségeit
    Frontendmentor.io A tényleges projektek létrehozásával a Frontendmentor.io segítséget nyújt a front-end kódolási képességeinek fejlesztésében. A kódolást azután kezdheti meg, hogy..

    Mikor kell használni a Type-t az interfészhez képest a TypeScriptben?
    A TypeScript a JavaScript gépelt szuperkészlete, amely statikus gépelést ad a nyelvhez. Ez megkönnyíti a robusztus és karbantartható kód írását azáltal, hogy a hibákat a fordítási időben..