Comment faire pour rediriger vers la page d'accueil si l'utilisateur accède à la page de connexion après avoir été connecté?
Ici, est mon de printemps de sécurité config:
<http pattern="/auth/login" security="none" />
<http pattern="/auth/loginFailed" security="none" />
<http pattern="/resources/**" security="none" />
<http auto-config="true" access-decision-manager-ref="accessDecisionManager">
<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>
La authenticationSuccessHandler
étend le SavedRequestAwareAuthenticationSuccessHandler
s'assurer que l'utilisateur est redirigé vers la page qu'il avait demandé à l'origine.
Cependant, depuis /auth/login
est marqué comme security="none"
, je n'arrive pas à rediriger l'utilisateur vers la page d'accueil s'il accède à la page de connexion après vous être connecté. Je crois que c'est le droit expérience de l'utilisateur trop.
J'ai essayé de le ci-dessous trop, mais le Principal
objet est toujours null
, sans doute à cause de la security="none"
attribut de nouveau.
@RequestMapping(value = "/auth/login", method = GET)
public String showLoginForm(HttpServletRequest request, Principal principal) {
if(principal != null) {
return "redirect:/";
}
return "login";
}
- D'une façon que je peux penser est:
if(session.getAttribute("SPRING_SECURITY_CONTEXT") != null) return "redirect:/";
(qui fonctionne réellement!) Mais je suis à la recherche d'un beaucoup plus propre approche. - voir ce stackoverflow.com/questions/13131122/...
- Veuillez vérifier cette solution-->[Ici][1] [1]: stackoverflow.com/a/28257013/3287459
Vous devez vous connecter pour publier un commentaire.
J'ai vérifié le sujet plus profondément que la dernière fois, et a constaté que vous avez à déterminer si l'utilisateur est authentifié par vous-même dans le contrôleur. Ligne Treuil (Printemps de Sécurité dev) dit ici:
Donc la solution serait de déterminer si l'utilisateur demande
/auth/login
est anonyme ou non, quelque chose comme ci-dessous.applicationContext-security.xml:
Ajouter à applicationContext.xml bean définition:
qui est de la classe
la mise en œuvre de l'interface simple
(
SecurityContextHolder
l'accès à code est découplé de la manette, j'ai suivi la suggestion de cette réponse, doncSecurityContextAccessor
interface.)Et le dernier mais non moins logique de redirection dans le contrôleur:
Définition
defaultTargetUrl
haricots semble comme un hack, mais je n'ai pas de meilleure façon de ne pas coder en dur des url... (en Fait, dans notre projet, nous utilisons<util:constant>
avec classe contenant static final String champs.) Mais ça marche, après tout.Vous pouvez également restreindre votre page de connexion à
ROLE_ANONYMOUS
et définir une<access-denied-handler />
:Et dans votre gestionnaire de vérifier si l'utilisateur est déjà authentifié:
Mettre en œuvre une Redirection de l'Intercepteur à cet effet:
De l'Intercepteur (mise en place de
HandlerInterceptor
interface) vérifier si quelqu'un tente d'accéder à la page de connexion, et si cette personne est déjà connecté, puis de l'intercepteur envoie une redirection vers la page d'index.Vous pouvez le garder simple flux par
access-denied-page
attribut danshttp
élément ou dtrunk dit d'écrire gestionnaire d'accès refusé ainsi que. la config serait commedans le contrôleur pour
/403
et pour
/home
et lorsque vous faites la demande pour
/admin/dashboard
sans connecté, il va rediriger/login
automatiquement par sécuritéVous pouvez essayer de vérifier
True signifie que l'utilisateur n'est pas authentifié, et peut donc être envoyé à la page de connexion. Je ne sais pas comment solide/fiable c'est, mais il semble raisonnable d'essayer.