2010-10-05 7 views
4

J'utilise Spring 3.0.3 avec Spring Security. Donc, j'ai des restrictions assez clémentes sur une application que je suis en train de faire. Je veux seulement m'assurer qu'une personne peut se connecter et être authentifiée afin de voir l'application. Je ne veux pas attribuer des rôles à tous les utilisateurs potentiels de cette application (cela pourrait être dans les dizaines de milliers).Sécurité de printemps: Autoriser les pages vues pour tous les utilisateurs entièrement authentifiés, sauf s'ils ont un rôle spécifique

Ainsi, il a été bien utiliser:

<security:intercept-url pattern="/**" access="isFullyAuthenticated()" requires-channel="https"/> 

Mais maintenant, je veux être en mesure de limiter les gens d'utiliser l'application si je dois, je créé un rôle appelé ROLE_BANNED dans l'espoir que je pourrait simplement attribuer des rôles à ces personnes étant des problèmes.

Alors, maintenant, je suis en train ceci:

<security:intercept-url pattern="/**" access="isFullyAuthenticated() and not hasRole('ROLE_BANNED')" requires-channel="https"/> 

Cela a semblé fonctionner au début, mais il ne peut pas charger ma page refusée. Je crois que cela restreint l'accès à la page refusée. Je ne peux pas charger la page refusée via le contrôleur ou en tant que jsp dans WEB-INF. Est-ce que quelqu'un peut me montrer comment autoriser les utilisateurs authentifiés à accéder à l'ensemble de mon application et envoyer des personnes avec un rôle spécifique (ROLE_BANNED) à la page refusée?

EDIT Voici ma sécurité entière: http configuration:

<security:http auto-config="true" access-denied-page="/denied" entry-point-ref="casAuthenticationEntryPoint" use-expressions="true"> 
    <security:intercept-url pattern="/**" access="isFullyAuthenticated() and not hasRole('ROLE_BANNED')" requires-channel="https"/> 
    <security:intercept-url pattern="/denied" access="IS_AUTHENTICATED_FULLY" filters="none" /> 

    <security:logout logout-url="/logout" logout-success-url="${cas.logoutUrl}" /> 
    <security:session-management session-fixation-protection="none" /> 
    <security:custom-filter after="CAS_FILTER" ref="casAuthenticationFilter"/> 
    <security:custom-filter before="CHANNEL_FILTER" ref="channelProcessingFilter" /> 
    <security:port-mappings> 
     <security:port-mapping http="80" https="443" /> 
    </security:port-mappings> 
</security:http> 

J'ai essayé d'utiliser un contrôleur cartographié la page refusée (/ refusée), une page jsp (de /denied.jsp) et même un page html simple (/denied.html), mais je reçois un 404 pour chacun. Je ne vois rien dans les fichiers journaux lorsque cela se produit.

Répondre

4

je fini par faire ce qui suit:

<security:intercept-url pattern="/**" access="isFullyAuthenticated()" requires-channel="https"/> 
<security:intercept-url pattern="/banned" access="isFullyAuthenticated() and hasRole('ROLE_BANNED')" requires-channel="https"/> 

Ce qui signifie que vous devez être connecté pour les deux cas, mais vous devez avoir le rôle INTERDIT pour accéder à la page interdite.

J'ai également ajouté un aspect qui s'exécute avant chaque méthode de contrôleur avec RequestMethod.GET qui vérifie si l'utilisateur a le rôle BANNED et, le cas échéant, les redirige vers/banned.

Si quelqu'un connaît une meilleure façon de procéder, veuillez ajouter une réponse.

0

Comme vous avez dit, je pense que vous avez juste besoin de faire de votre « refusé » page ne nécessite aucune sécurité d'accès, donc il suffit d'ajouter une interception URL pour cette page spécifique ...

Cet exemple est avec le printemps sécurité 2, mais il devrait se traduire par ...

<intercept-url pattern="/denied.html" access="IS_AUTHENTICATED_ANONYMOUSLY" filters="none" /> 

Edit:

Vous aurez probablement besoin aussi de faire votre javascript, css, images, etc, ont également une exemption similaire des restrictions de sécurité autrement votre page ne chargera rien d'autre que le texte brut.

+0

Cela n'a pas fonctionné pour moi. J'ai mis à jour ma question avec plus de détails. –

+0

Ah, maintenant que j'y pense, ce ne serait pas le cas. Votre utilisateur banni est toujours connecté (pas anonyme).Si vous supprimez tous vos éléments de sécurité, pouvez-vous toujours accéder/refusé via URL? –

Questions connexes