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 requête va au Servlet. Ce dernier effectue le contrôle qui doit interagir avec la base de données. Est-ce de la chaîne correcte?

20
demandé sur BalusC 2012-11-07 20:46:59

1 réponses

préface: j'ai cru comprendre que vous utilisez un login maison au lieu d'un login géré par conteneur. Pour tous les moyens, voir comment gérer l'Authentification / autorisation avec les utilisateurs dans une base de données?


le filtre (l'intercepteur) ne devrait 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 pas (habituellement en vérifiant simplement la présence d'un attribut de session), puis continuer la requête 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 si trouvé puis le stocker comme un attribut de session et ensuite rediriger vers la page d'accueil, sinon redisplay 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 aussi:

45
répondu BalusC 2017-05-23 10:31:25