Así que tengo un controlador Spring, usando Spring Security que fue bloqueado con un simple Funcionó bien.
Ahora tengo el requisito de que -algunas- personas no necesitan iniciar sesión a menos que estén buscando la receta de galletas de mi abuela. Entonces, en el código de mi controlador, verifico qué receta buscan, y si son cookies, lanzo una BadCredentialsException();
Ahora no quiero dividir los métodos del controlador. Estas recetas estarán en una base de datos y algunas (galletas) estarán disponibles para todos, otras querrás un rol específico. (Carnes por ejemplo)
Sin embargo, parece que la excepción se está detectando en el interceptor de excepciones general y se está redirigiendo a la página "algo salió mal".
Quiero que vayan a la página de inicio de sesión, inicien sesión y luego sean redirigidos a la página de recetas.
<bean id="failureRedirectHandler" class="org.springframework.security.web.authentication.SimpleUrlAuthenticationFailureHandler"> <property name="useForward" value="true"/> </bean>Nuevamente, todo esto funcionó con intercept-url access="IS_AUTHENTICATED_FULLY" Pero, ¿por qué no funcionará si lanzo explícitamente BadCredentialsException?
Creo que la excepción que quieres lanzar es AccessDeniedException . Con una configuración estándar, eso redirigirá al usuario a la página de inicio de sesión si actualmente no ha iniciado sesión. Si inició sesión, se mostrará una página de "acceso denegado". Puede personalizar esta página de acceso denegado y, por ejemplo, incluir un enlace para iniciar sesión como un usuario diferente.
La BadCredentialsException probablemente no esté destinada a ser lanzada en los controladores, sino solo internamente en los filtros de seguridad, cuando el usuario realmente ha ingresado algunas credenciales incorrectas.