Ho controllato l'argomento più profondamente dell'ultima volta e ho scoperto che è necessario determinare se l'utente è autenticato da solo nel controller. Row Winch (dev Primavera di sicurezza) says here:
Primavera di sicurezza non è a conoscenza dei meccanismi interni della vostra applicazione (cioè se si desidera rendere il vostro login page flessione sulla base se l'utente è loggato o meno) . Per mostrare la tua pagina iniziale quando la pagina di login è richiesta e l'utente ha effettuato l'accesso usa SecurityContextHolder
nella pagina di login (o il suo controller) e reindirizza o inoltra l'utente a la pagina iniziale.
Quindi soluzione sarebbe determinare se l'utente che richiede /auth/login
è anonimo o meno, qualcosa di simile di seguito.
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>
Aggiungi al applicationContext.xml definizione di fagioli:
<bean id="securityContextAccessor"
class="com.example.spring.security.SecurityContextAccessorImpl" />
che è la classe
public final class SecurityContextAccessorImpl
implements SecurityContextAccessor {
@Autowired
private AuthenticationTrustResolver authenticationTrustResolver;
@Override
public boolean isCurrentAuthenticationAnonymous() {
final Authentication authentication =
SecurityContextHolder.getContext().getAuthentication();
return authenticationTrustResolver.isAnonymous(authentication);
}
}
attuazione semplice Interfaccia
public interface SecurityContextAccessor {
boolean isCurrentAuthenticationAnonymous();
}
(SecurityContextHolder
accessing code is decoupled from controller, I followed suggestion from this answer, quindi SecurityContextAccessor
interfaccia.)
E, ultimo ma non meno importante reindirizzare logica nel controllore:
@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;
}
}
}
Definizione defaultTargetUrl
Fagiolino sembra un hack, ma io don' Ho un modo migliore di non usare l'url hardcode ... (In realtà nel nostro progetto usiamo <util:constant>
con una classe contenente i campi di stringa finale statica.) Ma funziona dopotutto.
Un modo che posso pensare è: 'if (session.getAttribute (" SPRING_SECURITY_CONTEXT ")! = Null) restituisce" redirect:/";' (_che funziona davvero! . – adarshr
vedere questo http://stackoverflow.com/questions/13131122/spring-security-redirect-if-already-logged-in – Aalkhodiry
Si prega di verificare questa soluzione -> [qui] [1] [1 ]: http://stackoverflow.com/a/28257013/3287459 – erginduran