Comment définir correctement l'URL du service au Printemps CAS les propriétés du service
Lorsque l'on travaille avec Ressort de Sécurité + CAS je continuer à appuyer sur un petit bloc de route avec l'URL de callback qui est envoyé au TAS, c'est à dire le service de la propriété. J'ai regardé un tas d'exemples comme cette et cette, mais ils utilisent tous codés en dur de l'Url (même Le printemps TAS de docs). Un typique snip ressemble à quelque chose comme ça...
<bean id="serviceProperties" class="org.springframework.security.ui.cas.ServiceProperties">
<property name="service" value="http://localhost:8080/click/j_spring_cas_security_check" />
</bean>
Tout d'abord, je ne veux pas coder en dur le nom du serveur ou le port depuis que je tiens ce GUERRE pour pouvoir être déployées n'importe où et je ne veux pas que mon application lié à une entrée DNS au moment de la compilation. Deuxièmement, je ne comprends pas pourquoi le Printemps ne peuvent pas détecter automatiquement de mon application contexte et la requête de l'URL de construire automatiquement l'URL. La première partie de cette déclaration sont encore debout, mais Comme Raghuram souligné ci-dessous avec ce lien, nous ne pouvons pas faire confiance le HTTP en-Tête d'Hôte du client pour des raisons de sécurité.
Idéalement, j'aimerais que l'URL du service exactement ce que l'utilisateur a demandé (tant que la demande est valide comme un sous-domaine de mycompany.com c'est donc sans soudure ou à tout le moins je voudrais seulement indiquer le chemin relatif de ma racine de contexte et d'avoir le Printemps de déterminer l'URL du service à la volée. Quelque chose comme ce qui suit...
<bean id="serviceProperties" class="org.springframework.security.ui.cas.ServiceProperties">
<property name="service" value="/my_cas_callback" />
</bean>
OU...
<bean id="serviceProperties" class="org.springframework.security.ui.cas.ServiceProperties">
<property name="service" value="${container.and.app.derived.value.here}" />
</bean>
Tout cela est-il possible ou facile ou ai-je manqué à l'évidence?
Eh bien, j'ai certainement appris quelque chose et éliminés d'une solution possible. Puisque je ne peux pas compter sur la requête HTTP que je voudrais encore pour définir le service par le biais de certaines valeurs dérivées à l'heure du déploiement qui doit être sécurisé.
Je suis à l'aide de printemps 3; à noter que le lien vers le printemps de sécurité 3 docs
OriginalL'auteur Andrew White | 2010-12-29
Vous devez vous connecter pour publier un commentaire.
Au Printemps 2.6.5 printemps, vous pouvez étendre les org.springframework.de sécurité.l'interface utilisateur.les sae.ServiceProperties
Au printemps 3 la méthode est définitive, vous pourriez obtenir autour de ce sous-classement par le CasAuthenticationProvider et CasEntryPoint et puis les utiliser avec votre propre version de ServiceProperties et remplacer la méthode getService() la méthode avec une dynamique de mise en œuvre.
Vous pouvez utiliser l'en-tête d'hôte pour calculer le le domaine requis et de le rendre plus sécurisé en validant que seules les domaines/sous-domaines sous votre contrôle sont utilisés. Puis ajoutez à ceci une certaine valeur configurable.
Bien sûr, vous voulez être au risque que votre œuvre a été insécurité... donc soyez prudent.
Il pourrait finir par ressembler à:
Alors que la question des états, vous pourriez juste sous-classe de la CasAuthenticationProvider et CasEntryPoint et de vous fournir une version propre de propriétés du Service. J'ai mis à jour la réponse pour le rendre plus explicite
Je pense que vous avez probablement raison. Je n'ai pas eu la chance de l'essayer encore, mais quand je le fais, et à moins d'une meilleure réponse vient autour, ce qui est à la recherche comme il va être la meilleure réponse.
OriginalL'auteur Pablojim
Je sais que c'est un peu vieux mais j'ai juste eu à résoudre ce problème et je ne pouvais pas vraiment trouver quelque chose dans les nouvelles piles.
Nous avons de multiples environnements de partage le même CAS de service (dev, qa, uat et locales, les environnements de développement); nous avons la capacité de frapper chaque environnement de plus d'un url (via le client web côté serveur via un reverse proxy et directement sur le serveur de back-end). Cela signifie que la spécification d'une url unique est difficile, au mieux. Peut-être il ya un moyen de le faire, mais d'être en mesure d'utiliser d'une dynamique
ServiceProperties.getService()
. Je vais probablement ajouter un peu de type de suffixe du serveur, vérifiez que l'url n'est pas détourné à un certain point.Voici ce que j'ai fait pour passer de la base en CAS de flux de travail, indépendamment de l'URL utilisée pour accéder à la ressource sécurisée...
CasAuthenticationFilter
.CasAuthenticationProvider
.setAuthenticateAllArtifacts(true)
sur leServiceProperties
.Voici la version longue de ma configuration spring bean:
Simplement l'habitude configuration spring bean.
Certains externalisés paramètres de configuration.
La clé ci-dessus est le
setAuthenticateAllArtifacts(true)
appel. Cela rendra le ticket de service valideur utiliser leAuthenticationDetailsSource
mise en œuvre plutôt que de codé en durServiceProperties.getService()
appelBillet Standard du programme de validation..
Crochet Standard à un UserDetailsService
Standard fournisseur d'authentification
Clé ici est la
dynamicServiceResolver()
réglage..Crée dynamiquement l'url du service de la
makeDynamicUrlFromRequest()
méthode. Ce bit est utilisé lors de la validation de ticket.Cette partie utilise la même url dynamique créateur lors de la SAE pour rediriger vers la page de connexion.
C'est ce que vous en faites. J'ai seulement passé dans la ServiceProperties de tenir l'URI du service que nous sommes configuré pour. Nous utilisons HATEAOS sur la face arrière et de mise en œuvre comme:
Edit: voici ce que j'ai fait pour la liste de serveur valide suffixes..
OriginalL'auteur Matt
utilisez maven, ajouter une propriété de l'espace réservé, et de le configurer dans votre processus de création
OriginalL'auteur chrismarx
J'ai essayé de la sous-classe CasAuthenticationProvider comme Pablojim suggèrent, mais la solution est très facile! avec le Printemps, l'Expression de la Langue (SPEL), vous pouvez obtenir l'url dinamically.
Exemple:
<property name="service"
value="https://#{T(java.net.InetAddress).getLocalHost().getHostName()}:${application.port}${cas.service}/login/cascheck"/>
OriginalL'auteur Donald
Je n'ai pas essayé moi-même, mais il semble que le Printemps de Sécurité a une solution à ce avec la
SavedRequestAwareAuthenticationSuccesshandler
indiqué dans la mise à jour de Bob du blog.OriginalL'auteur stigkj