web-dev-qa-db-fra.com

Filtre d'authentification et servlet pour la connexion

J'ai un filtre utilisé pour la connexion. Il effectue une vérification textuelle, sur les champs "Nom d'utilisateur" et "Mot de passe". Si et seulement si la vérification textuelle est correctement effectuée, la demande est envoyée au Servlet. Ce dernier effectue le contrôle qui doit interagir avec la base de données. Cette chaîne est-elle correcte?

21
paolo2988

Préface: Je suppose que vous utilisez une connexion locale au lieu d'une connexion gérée par conteneur. Pour toutes les façons, voir Comment gérer l'authentification/autorisation avec les utilisateurs dans une base de données?


Le filtre (l'intercepteur) ne doit pas vérifier la validité de la combinaison nom d'utilisateur/mot de passe. C'est la responsabilité du servlet (le contrôleur).

Le filtre doit simplement vérifier si l'utilisateur est connecté ou non (généralement en vérifiant simplement la présence d'un attribut de session), puis poursuivre la demande ou la bloquer en redirigeant vers la page de connexion.

@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);
        }
    }

    // ...
}

Le servlet doit collecter les données soumises, trouver le User associé dans la base de données et, s'il est trouvé, le stocker en tant qu'attribut de session, puis rediriger vers la page d'accueil, sinon afficher à nouveau le formulaire avec des erreurs de validation.

@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);
    }

}

Voir également:

48
BalusC