JSF 2.0 parece ignorar el filtro

Estoy usando JSF para crear alguna autorización/comprobación de usuario antes de ingresar a páginas específicas en el directorio seguro/ pero sin éxito... Intenté tanto con phaselistener como con filter pero aún así... Bueno, cualquier ayuda es muy bienvenida.

Estoy usando Eclipse Juno.

Mi web.xml es el siguiente:

<filter>
<filter-name>AuthorizationFilter</filter-name>
<filter-class>login.security.AuthorizationFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>AuthorizationFilter</filter-name>
<url-pattern>/secure/*</url-pattern>
</filter-mapping> 
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>*.xhtml</url-pattern>
</servlet-mapping>

AuthorizationFilter se ve así:

public class AuthorizationFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain  chain) throws ServletException, IOException {    
HttpServletRequest req = (HttpServletRequest) request;
login.Login_bean login_bean = (login.Login_bean)
req.getSession().getAttribute("username");
if (login_bean != null && login_bean.isLoggedIn()) {
chain.doFilter(request, response);
} else {
HttpServletResponse res = (HttpServletResponse) response;
res.sendRedirect(req.getContextPath() + "/index.xhtml");
}
}

Con destroy() anulado e init. Es copiar/pasar de varios sitios alrededor.

Login_bean está administrado y el ámbito de la sesión y cuando el par de usuario/pase es correcto, tengo esto en ejecución:

if(password.equals(dbpassword)){
FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put("username", username);
FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put("email", email);
this.visibleLogout="true";
this.visibleLogin="false";
return "valid";
}

Y la estructura del directorio se parece a:

WebContent
-> secure
    -> projects.xhtml
-> index.xhtml

index.xhtml donde quiero prohibir el acceso:

<p:menuitem id="projects" value="#{menuBean.projectsValue}" action="#{menuBean.navTo(projects)}" icon="ui-icon-circle-triangle-e" />.

y finalmente menuBean.navTo() es:

public String navTo(String whereTo)
{
return "/secure/projects";
}

Me he topado con una pared de alguna manera... incluso si cambio el patrón de url a /faces/secure/* todavía me reenvían a proyectos.xhtml

caras completas-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_1.xsd"
    version="2.1">


    <managed-bean>
        <managed-bean-name>languageBean</managed-bean-name>
        <managed-bean-class>languageControl.LanguageBean</managed-bean-class>
        <managed-bean-scope>session</managed-bean-scope>
    </managed-bean>

    <managed-bean>
        <managed-bean-name>menuBean</managed-bean-name>
        <managed-bean-class>menuControl.MenuBean</managed-bean-class>
        <managed-bean-scope>session</managed-bean-scope>
    </managed-bean>

    <navigation-rule>
        <description>login_rule</description>
        <from-view-id>/index.xhtml</from-view-id>
        <navigation-case>
            <from-action>#{login_bean.checkValidUser}</from-action>
            <from-outcome>valid</from-outcome>
            <to-view-id>/nav.xhtml</to-view-id>
        </navigation-case>
        <navigation-case>
            <from-action>#{login_bean.checkValidUser}</from-action>
            <from-outcome>invalid</from-outcome>
            <to-view-id>/index.xhtml</to-view-id>
        </navigation-case>
    </navigation-rule>

    <application>
        <locale-config>
            <default-locale>en</default-locale>
            <supported-locale>gr</supported-locale>
        </locale-config>
        <resource-bundle>
            <base-name>languageControl.messages</base-name>
            <var>msg</var>
        </resource-bundle>
    </application>
    <validator>
        <validator-id>passwordValidator</validator-id>
        <validator-class>registration.passwordValidator</validator-class>
    </validator>
    <managed-bean>
        <managed-bean-name>Login_bean</managed-bean-name>
        <managed-bean-class>login.Login_bean</managed-bean-class>
        <managed-bean-scope>session</managed-bean-scope>
    </managed-bean>
    <managed-bean>
        <managed-bean-name>sendMail</managed-bean-name>
        <managed-bean-class>common.sendMail</managed-bean-class>
        <managed-bean-scope>request</managed-bean-scope>
        <!-- <managed-property> <property-name>email</property-name> <value>#{sendMail.email}</value> 
            </managed-property> -->
    </managed-bean>

    <validator>
        <validator-id>EmailValidator</validator-id>
        <validator-class>registration.EmailValidator</validator-class>
    </validator>

    <managed-bean>
        <managed-bean-name>RegistrationBean</managed-bean-name>
        <managed-bean-class>registration.RegistrationBean</managed-bean-class>
        <managed-bean-scope>session</managed-bean-scope>
    </managed-bean>
</faces-config>

web completa.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"
    id="WebApp_ID" version="3.0">
    <display-name>personalSite</display-name>
    <welcome-file-list>
        <welcome-file>index.xhtml</welcome-file>
    </welcome-file-list>
    <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>*.xhtml</url-pattern>
    </servlet-mapping>

<filter>
        <filter-name>AuthorizationFilter</filter-name>
        <filter-class>login.security.AuthorizationFilter</filter-class>
 </filter>
 <filter-mapping>
        <filter-name>AuthorizationFilter</filter-name>
        <url-pattern>/secure/*</url-pattern>
 </filter-mapping> 

</web-app>

preguntado el 28 de julio de 12 a las 11:07

Tal vez haya otra configuración que esté provocando el comportamiento extraño. Todo parece que va a funcionar. Además, ¿qué servidor de aplicaciones está utilizando? -

1 Respuestas

¿Estás ejecutando esto en un depurador? Pondría un punto de interrupción en la parte superior de "doFilter ()" y vería si el filtro se está ejecutando. una vez que descubra si realmente se está ejecutando, revise el código (suponiendo que esté filtrando) y vea por qué la lógica no funciona como se esperaba. si no se dispara, puede apostar que es probable que haya algo falso en la configuración.

Respondido 29 Jul 12, 00:07

Estoy usando Glassfish 3.1.2 y estoy bastante seguro de que el filtro no se está ejecutando, pero no puedo ver por qué. Revisaré su sugerencia de depuración para estar 100% seguro. También limpié el proyecto de eclipse/servidor. Cuando sea posible, le doy web.xml y face-config, tal vez pueda ver una falla que yo no puedo: Panos

Entonces, finalmente, después de una gran cantidad de trabajo ... noté que extraño la anotación de ManagedBean y el filtro funciona de alguna manera. La pregunta surge ahora ... ¿no se supone que el filtro funcione? antes ingresando a projects.xhtml para evitar navegar en xhtml específico y no después? Quiero decir ... cuando hago clic en los botones de comando en proyectos.xhtml, se me redirige al índice como debería y no cuando hago clic en el elemento del menú - Panos

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.