He comprobado el tema más profundamente que la última vez y he descubierto que debe determinar si el usuario está autenticado por usted mismo en el controlador. Fila del cabrestante (dev Spring Security) says here:
primavera de Seguridad no tiene conocimiento de las interioridades de su aplicación (es decir, si usted desea hacer su entrada página de flexión sobre la base de si el usuario se registra o no) . Para mostrar su página de inicio cuando la página de inicio de sesión es solicitada y el usuario ha iniciado sesión use SecurityContextHolder
en la página de inicio de sesión (o su controlador) y redirija o reenvíe al usuario a la página de inicio.
Así que la solución sería determinar si el usuario que solicita /auth/login
es anónimo o no, algo como a continuación.
applicationContext-security.xml:
<http auto-config="true" use-expressions="true"
access-decision-manager-ref="accessDecisionManager">
<intercept-url pattern="/auth/login" access="permitAll" />
<intercept-url pattern="/auth/logout" access="permitAll" />
<intercept-url pattern="/admin/**" access="ADMINISTRATIVE_ACCESS" />
<intercept-url pattern="/**" access="XYZ_ACCESS" />
<form-login login-page="/auth/login"
authentication-failure-url="/auth/loginFailed"
authentication-success-handler-ref="authenticationSuccessHandler" />
<logout logout-url="/auth/logout" logout-success-url="/auth/login" />
</http>
<beans:bean id="defaultTargetUrl" class="java.lang.String">
<beans:constructor-arg value="/content" />
</beans:bean>
<beans:bean id="authenticationTrustResolver"
class="org.springframework.security.authentication.AuthenticationTrustResolverImpl" />
<beans:bean id="authenticationSuccessHandler"
class="com.example.spring.security.MyAuthenticationSuccessHandler">
<beans:property name="defaultTargetUrl" ref="defaultTargetUrl" />
</beans:bean>
Añadir a applicationContext.xml definición de frijol:
<bean id="securityContextAccessor"
class="com.example.spring.security.SecurityContextAccessorImpl" />
que es de clase
public final class SecurityContextAccessorImpl
implements SecurityContextAccessor {
@Autowired
private AuthenticationTrustResolver authenticationTrustResolver;
@Override
public boolean isCurrentAuthenticationAnonymous() {
final Authentication authentication =
SecurityContextHolder.getContext().getAuthentication();
return authenticationTrustResolver.isAnonymous(authentication);
}
}
implementación sencilla Interfaz
public interface SecurityContextAccessor {
boolean isCurrentAuthenticationAnonymous();
}
(SecurityContextHolder
accessing code is decoupled from controller, I followed suggestion from this answer, por lo tanto, SecurityContextAccessor
interfaz.)
Y por último pero no menos importante redirigir la lógica en el controlador:
@Controller
@RequestMapping("/auth")
public class AuthController {
@Autowired
SecurityContextAccessor securityContextAccessor;
@Autowired
@Qualifier("defaultTargetUrl")
private String defaultTargetUrl;
@RequestMapping(value = "/login", method = RequestMethod.GET)
public String login() {
if (securityContextAccessor.isCurrentAuthenticationAnonymous()) {
return "login";
} else {
return "redirect:" + defaultTargetUrl;
}
}
}
Definición defaultTargetUrl
Cadena de frijol parece un truco, pero yo don' Tenemos una mejor manera de no codificar url ... (En realidad, en nuestro proyecto usamos <util:constant>
con una clase que contiene campos de cadenas estáticas finales.) Pero funciona después de todo.
Una forma en que puedo pensar es: 'if (session.getAttribute (" SPRING_SECURITY_CONTEXT ")! = Null) return" redirect:/";' (_que en realidad funciona! _) Pero estoy buscando un enfoque mucho más ordenado . – adarshr
ver este http://stackoverflow.com/questions/13131122/spring-security-redirect-if-already-logged-in – Aalkhodiry
Selecciona esta solución -> [aquí] [1] [1 ]: http://stackoverflow.com/a/28257013/3287459 – erginduran