Je crée une application Web avec Spring Security qui fonctionnera sur Amazon EC2 et utilisera les équilibreurs de charge élastiques d'Amazon. Malheureusement, ELB ne prend pas en charge les sessions persistantes, je dois donc m'assurer que mon application fonctionne correctement sans sessions.
Jusqu'à présent, j'ai configuré RememberMeServices pour attribuer un jeton via un cookie, et cela fonctionne bien, mais je veux que le cookie expire avec la session du navigateur (par exemple, lorsque le navigateur se ferme).
Je dois imaginer que je ne suis pas le premier à vouloir utiliser Spring Security sans sessions ... des suggestions?
spring
spring-security
load-balancing
amazon-ec2
Jarrod Carlson
la source
la source
Cela semble être encore plus facile dans Spring Securitiy 3.0. Si vous utilisez la configuration de l'espace de noms, vous pouvez simplement procéder comme suit:
Ou vous pouvez configurer SecurityContextRepository comme null, et rien ne serait jamais enregistré de cette façon également .
la source
Nous avons travaillé sur le même problème (injecter un SecurityContextRepository personnalisé à SecurityContextPersistenceFilter) pendant 4 à 5 heures aujourd'hui. Finalement, nous l'avons compris. Tout d'abord, dans la section 8.3 de Spring Security réf. doc, il existe une définition de bean SecurityContextPersistenceFilter
Et après cette définition, il y a cette explication: "Sinon, vous pouvez fournir une implémentation nulle de l'interface SecurityContextRepository, qui empêchera le contexte de sécurité d'être stocké, même si une session a déjà été créée pendant la requête."
Nous devions injecter notre SecurityContextRepository personnalisé dans SecurityContextPersistenceFilter. Nous avons donc simplement changé la définition du bean ci-dessus avec notre impl personnalisé et l'avons placée dans le contexte de sécurité.
Lorsque nous exécutons l'application, nous avons tracé les journaux et constaté que SecurityContextPersistenceFilter n'utilisait pas notre impl personnalisé, il utilisait le HttpSessionSecurityContextRepository.
Après quelques autres choses que nous avons essayées, nous avons compris que nous devions donner notre implément SecurityContextRepository personnalisé avec l'attribut "security-context-repository-ref" de l'espace de noms "http". Si vous utilisez l'espace de noms "http" et que vous souhaitez injecter votre propre implément SecurityContextRepository, essayez l'attribut "security-context-repository-ref".
Lorsque l'espace de noms "http" est utilisé, une définition SecurityContextPersistenceFilter distincte est ignorée. Comme je l'ai copié ci-dessus, le doc de référence. ne dit pas cela.
Veuillez me corriger si j'ai mal compris les choses.
la source
Jetez un œil à la
SecurityContextPersistenceFilter
classe. Il définit comment leSecurityContextHolder
est peuplé. Par défaut, il utiliseHttpSessionSecurityContextRepository
pour stocker le contexte de sécurité dans la session http.J'ai implémenté ce mécanisme assez facilement, avec custom
SecurityContextRepository
.Voir
securityContext.xml
ci - dessous:la source
En fait,
create-session="never"
cela ne signifie pas être complètement apatride. Il y a un problème pour cela dans la gestion des problèmes de Spring Security.la source
Après avoir lutté avec les nombreuses solutions publiées dans cette réponse, pour essayer de faire fonctionner quelque chose lors de l'utilisation de la
<http>
configuration de l' espace de noms, j'ai finalement trouvé une approche qui fonctionne réellement pour mon cas d'utilisation. Je n'ai pas vraiment besoin que Spring Security ne démarre pas une session (parce que j'utilise session dans d'autres parties de l'application), mais simplement qu'il ne se "souvienne" pas du tout de l'authentification dans la session (il devrait être revérifié chaque demande).Pour commencer, je n'ai pas pu comprendre comment faire la technique "d'implémentation nulle" décrite ci-dessus. Il n'était pas clair si vous êtes censé définir le securityContextRepository sur
null
ou sur une implémentation sans opération. Le premier ne fonctionne pas car unNullPointerException
est jeté à l'intérieurSecurityContextPersistenceFilter.doFilter()
. En ce qui concerne l'implémentation no-op, j'ai essayé de l'implémenter de la manière la plus simple que je puisse imaginer:Cela ne fonctionne pas dans mon application, à cause d'un étrange
ClassCastException
rapport avec leresponse_
type.Même en supposant que j'ai réussi à trouver une implémentation qui fonctionne (en ne stockant simplement pas le contexte en session), il reste le problème de savoir comment l'injecter dans les filtres construits par la
<http>
configuration. Vous ne pouvez pas simplement remplacer le filtre à laSECURITY_CONTEXT_FILTER
position, comme indiqué dans la documentation . Le seul moyen que j'ai trouvé pour accrocher dans leSecurityContextPersistenceFilter
qui est créé sous les couvertures était d'écrire unApplicationContextAware
haricot laid :Quoi qu'il en soit, à la solution qui fonctionne réellement, bien que très hackish. Utilisez simplement un
Filter
qui supprime l'entrée de sessionHttpSessionSecurityContextRepository
recherchée quand il fait son truc:Puis dans la configuration:
la source
WebSecurityConfigurerAdapter
avec "http.addFilterBefore(new SpringSecuritySessionDeletingFilter(), SecurityContextPersistenceFilter.class)
"Juste un petit mot: c'est "create-session" plutôt que "create-sessions"
create-session
Contrôle l'empressement avec lequel une session HTTP est créée.
S'il n'est pas défini, la valeur par défaut est "ifRequired". Les autres options sont «toujours» et «jamais».
Le paramètre de cet attribut affecte les propriétés allowSessionCreation et forceEagerSessionCreation de HttpSessionContextIntegrationFilter. allowSessionCreation sera toujours vrai à moins que cet attribut ne soit défini sur "jamais". forceEagerSessionCreation est "faux" sauf s'il est défini sur "toujours".
Ainsi, la configuration par défaut autorise la création de session mais ne la force pas. L'exception est si le contrôle de session simultanée est activé, lorsque forceEagerSessionCreation sera défini sur true, quel que soit le paramètre ici. L'utilisation de "jamais" provoquerait alors une exception lors de l'initialisation de HttpSessionContextIntegrationFilter.
Pour des détails spécifiques sur l'utilisation de la session, il existe une bonne documentation dans le javadoc HttpSessionSecurityContextRepository.
la source
auto-config=false
, vous ne pouvez apparemment pas remplacer ce qui est enSECURITY_CONTEXT_FILTER
position par le vôtre. J'ai essayé de le désactiver avec unApplicationContextAware
bean (en utilisant la réflexion pour forcer l'securityContextRepository
implémentation nulleSessionManagementFilter
) mais pas de dés. Et malheureusement, je ne peux pas passer à Spring-Security 3.1 an qui fourniraitcreate-session=stateless
.