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.

Pourriez-vous expliquer ce que vous voulez utiliser la anonyme 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