Filtr, próba stworzenia blokady bezpieczeństwa.

0
package app.authentication.filter;

import java.io.IOException;
import javax.servlet.DispatcherType;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

@WebFilter(filterName = "AuthFilter", urlPatterns = {})
public class AuthorizationFilter implements Filter
{
    //private AccessControl accessControl;
    
    public AuthorizationFilter() {
    }
 
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
 
    }
 
    @Override
    public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain) throws IOException, ServletException {
        try {
 
            HttpServletRequest requestInit = (HttpServletRequest) request;
            HttpServletResponse responseInit = (HttpServletResponse) response;
            HttpSession sessionInit = requestInit.getSession(false);
 
            String requestURI = requestInit.getRequestURI();
            if (requestURI.indexOf("/login.xhtml") >= 0
                    || (sessionInit != null && sessionInit.getAttribute("login") != null)
                    || requestURI.indexOf("/public/") >= 0
                    || requestURI.contains("javax.faces.resource"))
                chain.doFilter(request, response);
            else
                responseInit.sendRedirect(requestInit.getContextPath() + "/faces/login.xhtml");
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
    }

    @Override
    public void destroy() {
 
    }
}

Moim celem jest by przed zalogowaniem, filtr nie blokował wszystkich stron a tylko te w określonym folderze - urlPatterns = {"/admin"}, nic nie daje. Strasznie mnie to męczy bo problem wydaje się trywialny

0

Dobra widzę, że dalej się męczysz więc spróbujmy. Jakiego frameworka używasz ? Jeżeli czystego JSF i nie chcesz niczego innego zaprzęgać to z tego co widzę spróbuj zrobić coś takiego @WebFilter("/admin/*")

0

Standardowym sposobem zabezpieczania zasobów w webowej javie (specyfikacja servletów) są wpisy "security-constraint" w web.xml, np:

<security-constraint>
    <web-resource-collection>
        <web-resource-name>adminPanel</web-resource-name>
        <url-pattern>/admin/*</url-pattern>
    </web-resource-collection>
    <auth-constraint>
        <role-name>admin</role-name>
    </auth-constraint>
</security-constraint>

lub odpowiadająca im adnotacja @ServletSecurity, ale np. w JSF bardzo Ci ona nie pomoże.

0
Lukasz_ napisał(a):

Dobra widzę, że dalej się męczysz więc spróbujmy. Jakiego frameworka używasz ? Jeżeli czystego JSF i nie chcesz niczego innego zaprzęgać to z tego co widzę spróbuj zrobić coś takiego @WebFilter("/admin/*")

Nie kumam tej adnotacji, tego mechanizmu (po co mi on w ogóle? :P) albo w tym przykładzie, po prostu nie zadziała. @WebFilter("/admin/") pozwala "hackować" wszystko z paska adresu :P otwiera mi się strona bez logowania strona : http://localhost:8080/System/faces/admin/pageTest.html, działa tylko @WebFilter(".xhtml") ale w połowie, wtedy nie mogę się ruszyć ze strony logowania, ale mogę nadal chodzić po aplikacji z paska adresu, co jest bez sensu. Użytkownik bez logowania musi mieć możliwość rejestracji, ale nie może nagle przypadkiem stać się adminem. Czy coś pominąłem? :P

Samemu dość trudno było mi opracować mechanizm logowania/rejestracji więc wykorzystałem pomysł kolegi:
http://www.journaldev.com/7252/jsf-authentication-login-logout-database-example

0

Ma blokować dostęp do jednej rzeczy tymczasem blokuje wszystko, czeka aż się zaloguje. Fajnie, że działa ale nie bardzo kumam jak :P

http://localhost:8080/System/faces/user/login.xhtml -> wyświetla http://localhost:8080/System/faces/admin/list.xhtml
(ale nie pokazuje tego w URL-U)

<navigation-rule> <from-view-id>/user/login.xhtml</from-view-id> <navigation-case> <from-outcome>admin</from-outcome> <to-view-id>/faces/admin/list.xhtml</to-view-id> </navigation-case> </navigation-rule>

Nie przepadam za zabawą z linkami zawsze się gdzieś zgubię.

"login" w stringu to wywala walidacja loginu i hasła:

<navigation-case> <redirect /> <from-outcome>login</from-outcome> <to-view-id>/admin/list.xhtml</to-view-id> </navigation-case>
0

if (requestURI.indexOf("/login.xhtml") >= 0
|| (sessionInit != null && sessionInit.getAttribute("login") != null)
|| requestURI.indexOf("/public/") >= 0
|| requestURI.contains("javax.faces.resource"))

Nie rozumiem tego warunku.

1 użytkowników online, w tym zalogowanych: 0, gości: 1