Printemps de Sécurité 3.1 et retour anonyme UserDetails
Je suis à essayer de comprendre comment faire pour avoir de la Sécurité Printemps de retour d'un UserDetails objet pour les utilisateurs anonymes pour cet appel:
SecurityContextHolder.getContext().getAuthentication().getPrincipal()
Je sais que, sans configuration particulière, que l'appel renvoie une chaîne de caractères au lieu d'un UserDetails objets que vous créez avec un custom UserDetailsService mise en œuvre, mais je préfère ne pas constamment vérifier "si(principal instanceof String)" partout. Est-il un moyen de le faire avec la configuration Spring - un moyen de stockage pour les anonymes UserDetails objet dans la session de l'utilisateur contexte jusqu'à l'ouverture de la session? Apparemment, je voudrais un unique anonyme UserDetails pour chaque client afin que je puisse suivre l'utilisation individuelle avec elle.
J'ai aussi remarqué que les méthodes que j'ai fixé avec le "exiger une autorisation préalable de" l'annotation ne semblent pas à l'honneur de la hasRole vérifier avec les utilisateurs anonymes. Je suis sûr que c'est un symptôme de ce que je fais mal. Voici un exemple:
@RequestMapping(value = "/almanac/new", method = RequestMethod.GET)
@PreAuthorize("hasRole('ROLE_ADMIN')")
public String newSetup(ModelMap model) {
Voici mon printemps contexte de sécurité (complet sauf pour l'affichage de haricots nœud). Vous pouvez noter que j'ai essayé de l'activation de la "anonyme"
<debug />
<http pattern="/js/**" security="none" />
<http pattern="/css/**" security="none" />
<http pattern="/images/**" security="none" />
<http pattern="/loggedout.jsp" security="none"/>
<http name="httpSiteMap" use-expressions="true">
<custom-filter ref="almanacUsrPwdAuthProcFilter" before="FORM_LOGIN_FILTER"/>
<intercept-url pattern="/login*" access="isAnonymous()" />
<intercept-url pattern="/home/**" access="hasRole('ROLE_USER')" />
<intercept-url pattern="/admin/**" access="hasRole('ROLE_ADMIN')" />
<intercept-url pattern="/**" access="isAnonymous()" />
<form-login login-page="/login.jsp"
default-target-url="/home.htm"
always-use-default-target="false" />
<logout logout-success-url="/loggedout.jsp" delete-cookies="JSESSIONID"/>
<session-management invalid-session-url="/timeout.jsp">
<concurrency-control max-sessions="1" error-if-maximum-exceeded="true" />
</session-management>
<anonymous enabled="true" />
</http>
<global-method-security pre-post-annotations="enabled" secured-annotations="enabled" />
<authentication-manager alias="mainAuthMgr">
<authentication-provider ref="almanacAuthenticationProvider"/>
</authentication-manager>
Tout autres suggestions basées sur le code que vous voyez ici serait la bienvenue.
UserDetails
? Quelles sont les données que serait-il contenir et comment l'utiliser? Vous n'avez pas besoin <anonymous enabled="true" />
que c'est la valeur par défaut. Vous devriez voir le AnonymousAuthenticationFilter
rapporté dans le journal de débogage à titre de confirmation.J'essaie d'éviter d'avoir le "getPrincipal()" appel de retourner une Chaîne de caractères. J'aimerais avoir cet appel uniquement renvoyer un UserDetails mise en œuvre, si le printemps de façon anonyme authentifie ou de l'utilisateur. Je veux éviter d'avoir à tester la valeur de retour de "getPrincipal()" pour instanceof String. Bien sûr, étant donné que la documentation est très ambigu dans certains domaines et d'informations pour des points spécifiques de la configuration est à peine répandu sur de nombreux chapitres, il est difficile de déterminer si c'est une chose que vous devriez faire, ou juste face à la instanceof comparaisons.
OriginalL'auteur ogradyjd | 2012-01-29
Vous devez vous connecter pour publier un commentaire.
Vous n'avez pas vraiment donné beaucoup de détails sur les données que vous souhaitez extraire le
UserDetails
pour un utilisateur anonyme. Si vous voulez juste pour vérifier le nom d'utilisateur, vous pouvez utiliserAuthentication.getName()
.Dans tous les cas, si vous avez besoin de plus de détails accès au contexte de sécurité, c'est une bonne idée d'utiliser une interface personnalisée pour découpler le code de votre application à partir du Printemps classes de Sécurité (voir ma réponse sur l'utilisation d'un contexte de sécurité de l'accesseur). De cette façon, vous ne devriez vérifier le type de capital en un seul endroit, plutôt que de répéter la case "partout" que vous souhaitez accéder aux données de l'utilisateur.
Si vous voulez absolument avoir toujours le même type principal dans l'authentification de l'objet, indépendamment de savoir si l'utilisateur est anonyme, vous devez désactiver l'authentification anonyme via l'espace de noms et d'ajouter un filtre personnalisé pour faire le travail, sur la base de
AnonymousAuthenticationFilter
.Il n'est pas clair à partir de la deuxième partie de votre question de savoir comment elle est liée à l'authentification anonyme ou le besoin d'accéder au contexte de sécurité. Le annnotation travail à tous les non-utilisateurs anonymes? Si non, il est probablement un contexte d'application de la visibilité question - voir FAQ .
question traite également de la question de l'utilisation de la sécurité des annotations avec des contrôleurs MVC.
Jamais l'esprit à propos de les exiger une autorisation préalable de problème. Il s'avère qu'il n'a rien à voir avec la connexion anonyme, et tout à voir avec le Printemps, le contexte de l'application de la hiérarchie vaudou. La description exacte et la solution à ce problème est ici
...et oui, Luc - vous avez tout à fait raison. Merci pour l'astuce qui m'a conduit à la FAQ et le fixer.
OriginalL'auteur Shaun the Sheep