authentication - tutorial - Filtro de autenticación y servlet para iniciar sesión
spring mvc 4 tutorial español (1)
Tengo un filtro utilizado para el inicio de sesión. Realiza una verificación textual, en los campos "Nombre de usuario" y "Contraseña". Si y solo si la verificación textual se realiza correctamente, la solicitud se envía al servlet. Este último realiza el control que tiene que interactuar con la base de datos. Es esta cadena correcta?
Prefacio: supongo que está utilizando el inicio de sesión local en lugar del inicio de sesión administrado por contenedor. Para todos los modos, consulte ¿Cómo manejar la autenticación / autorización con usuarios en una base de datos?
El filtro (el interceptor) no debe verificar la validez del combo nombre de usuario / contraseña. Esa es la responsabilidad del servlet (el controlador).
El filtro debería simplemente verificar si el usuario está conectado o no (generalmente solo verificando la presencia de un atributo de sesión) y luego continuar la solicitud o bloquearlo redireccionando a la página de inicio de sesión.
@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);
}
}
// ...
}
El servlet debe recopilar los datos enviados, buscar el User
asociado en la base de datos y, si se encuentra, almacenarlo como un atributo de sesión y luego redirigirlo a la página de inicio; de lo contrario, vuelva a mostrar el formulario con errores de validación.
@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);
}
}
Ver también:
- Nuestra página wiki servlet-filters
- Nuestra página wiki servlets