and - jsf session authentication



Filtro di autenticazione e servlet per il login (1)

Prefazione: ritengo che tu stia utilizzando l'accesso homegrown anziché il login gestito dal contenitore. Per tutti i modi, vedi Come gestire l'autenticazione / autorizzazione con gli utenti in un database?

Il filtro (l'intercettore) non dovrebbe controllare la validità della combinazione nome utente / password. Questa è la responsabilità del servlet (il controller).

Il filtro dovrebbe semplicemente verificare se l'utente è connesso o meno (di solito controllando solo la presenza di un attributo di sessione) e quindi continuare la richiesta o bloccarla reindirizzandola alla pagina di accesso.

@WebFilter("/*")
public class LoginFilter implements Filter {

    @Override
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws ServletException, IOException {    
        HttpServletRequest request = (HttpServletRequest) req;
        HttpServletResponse response = (HttpServletResponse) res;
        HttpSession session = request.getSession(false);
        String loginURI = request.getContextPath() + "/login";

        boolean loggedIn = session != null && session.getAttribute("user") != null;
        boolean loginRequest = request.getRequestURI().equals(loginURI);

        if (loggedIn || loginRequest) {
            chain.doFilter(request, response);
        } else {
            response.sendRedirect(loginURI);
        }
    }

    // ...
}

Il servlet deve raccogliere i dati inviati, trovare l' User associato nel database e, se trovato, archiviarlo come attributo di sessione e quindi reindirizzare alla pagina iniziale, altrimenti rivisualizzare il modulo con errori di convalida.

@WebServlet("/login")
public class LoginServlet extends HttpServlet {

    @EJB
    private UserService userService;

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.getRequestDispatcher("/WEB-INF/login.jsp").forward(request, response);
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String username = request.getParameter("username");
        String password = request.getParameter("password");
        Map<String, String> messages = new HashMap<String, String>();

        if (username == null || username.isEmpty()) {
            messages.put("username", "Please enter username");
        }

        if (password == null || password.isEmpty()) {
            messages.put("password", "Please enter password");
        }

        if (messages.isEmpty()) {
            User user = userService.find(username, password);

            if (user != null) {
                request.getSession().setAttribute("user", user);
                response.sendRedirect(request.getContextPath() + "/home");
                return;
            } else {
                messages.put("login", "Unknown login, please try again");
            }  
        }

        request.setAttribute("messages", messages);
        request.getRequestDispatcher("/WEB-INF/login.jsp").forward(request, response);
    }

}

Guarda anche:

  • La nostra pagina wiki dei filtri servlet
  • La nostra pagina wiki di servlet

Ho un filtro usato per il login. Esegue un controllo testuale, sui campi "Username" e "Password". Se e solo se il controllo testuale viene eseguito correttamente, la richiesta viene inviata al Servlet. Quest'ultimo esegue il controllo che deve interagire con il Database. Questa catena è corretta?





login-control