2013-05-24 14 views
5

Sto applicando la sicurezza di primavera sulla mia pagina jsp, ho bisogno di mostrare diverse parti della pagina agli utenti con ruoli diversi tutti i ruoli sono i seguenti.Il mio approccio per dare accesso agli utenti è corretto?

Tutti gli utenti autenticati >> Modifica e aggiungere nuovi

Amministrazione> Elimina e Modifica e aggiungere nuovi

Anonimo> Aggiungi nuovo

<sec:authorize 
     access="isAuthenticated()"> 
      Code of add new and edit buttons 
</sec:authorize> 

<sec:authorize 
     access="hasAnyRole('ADMIN')"> 
    Code to add new, edit and delete buttons 
</sec:authorize> 

    <sec:authorize 
     access="isAnonymous()"> 
    Code to add new 
    </sec:authorize> 

Mi chiedo se c'è qualche metodo più semplice, in questo caso, se voglio modificare l'accesso di un ruolo specifico, devo modificare le sue regole di accesso nel file security.xml e ogni pagina che ho impostato per accedere al ruolo.

Ad esempio, diciamo che desidero che il ruolo di amministratore non acceda al pulsante di eliminazione, quindi devo modificare il codice di security.xml e tutte le pagine JSP che il ruolo di amministratore è stato autenticato per visualizzare il pulsante di cancellazione.

C'è qualche metodo più semplice per farlo !?

+1

nel framework basato su componenti è possibile suddividere la pagina in più componenti e definire l'accesso per ognuno di essi nella parte del codice java, ad esempio: JSF, arazzo –

risposta

1

Suppongo di avere gli stessi diritti per la modifica pulsanti ovunque nella vostra app. In questo caso è possibile estrarre il codice di autorizzazione in un tag personalizzato (io consiglio JSP tag files). Per ogni pulsante di modifica che si intende utilizzare il tag personalizzato:

<customtags:hasEditPermission> 
    Edit button code goes here 
<customtags:hasEditPermission> 

Tutte le autorizzazioni saranno dichiarati una volta nella hasEditPermission.tag:

Così, in un caso di nuovo ruolo POWER_USER è necessario modificare un solo file :

<%@tag description="Edit permission tag" pageEncoding="UTF-8"%> 
<sec:authorize access="hasAnyRole('ADMIN', 'POWER_USER')"> 
    <jsp:doBody/> 
</sec:authorize> 

È possibile preparare e utilizzare i tag anche per i pulsanti "Aggiungi nuovo" e "Elimina". Spero che questo ti aiuti.

2

Non penso che ci sia una soluzione integrata per questo. È possibile impostare un sistema di ruolo a grana fine che assegni come un ruolo di modifica, un ruolo di eliminazione e così via. Quindi puoi assegnare questi ruoli più liberamente. Se si desidera semplificare la gestione per l'utente (come se mostri solo il ruolo di amministratore e utente), potrebbe essere necessario mascherare i ruoli effettivi alla base di una mappatura tra i ruoli e i titoli mostrati agli utenti.

Un altro approccio sarebbe quello di impostare i parametri globali per ciascuna azione (modifica, eliminazione, ecc.) In cui si specificano i ruoli che devono essere consentiti per l'azione. In questo modo non applicheresti l'hardcode dei ruoli nella tua applicazione ma li mapperai attraverso i parametri globali.

In attesa di vedere se qualcun altro ha un'idea migliore.

Modifica per specificare il metodo di mappatura da parametri globali(affinato la mappatura sarebbe stato conservato in un db, ma che sta ottenendo da una soluzione ad hoc per l'implementazione di un ACL):

Con parametri globali Intendevo solo qualcosa come un rightsMapping.properties. In questo file si dovrebbe mappare una cosa del genere:

right.edit=ROLE_USER, ROLE_ADMIN 
right.edit=ROLE_ADMIN 
etc... 

Dopo di che si può semplicemente inserire i diritti nelle pagine JSF utilizzando qualcosa di simile:

<f:loadBundle basename="rightsMapping" var="rights"/> 
.... 
<f:CommandButton name="edit" .... rendered="hasRole(rights.edit)"/> 

questo è un abbastanza facile mani sulla soluzione che può essere raffinato utilizzando, ad esempio, una tabella di mapping nel DB, un bean che valuta i diritti di accesso, ecc. Ma l'idea di base di mappare i diritti a grana fine ai ruoli rimane la stessa.

+0

cosa si intende per parametri globali? – J888

+0

aggiornato la mia risposta – Carsten

2

Può esserci una soluzione utilizzando la serie di diritti che può essere contenuta nell'oggetto ruolo come raccolta.

Dopo questa implementazione è possibile controllare la corretta autorizzazione per la visualizzazione dei pulsanti e se si desidera modificare qualcosa nell'architettura di sicurezza, è possibile gestirlo facilmente concedendo o revocando i diritti dal ruolo correlato.

Un esempio di questo può essere visto nel link sottostante.

http://en.tekstenuitleg.net/blog/spring-security-with-roles-and-rights

+0

Sembra che dovrei avere diversi file jsp per ogni ruolo, quindi scoprire il loro ruolo nel back-end e visualizzare la pagina jsp associata a quel ruolo sono corretto? – J888

+0

No, non è così. Devi definire i tuoi ruoli come diritti e la classe del tuo dominio utente dovrebbe contenere una raccolta di diritti. Se specifichi le definizioni del tuo ruolo come diritti, puoi semplicemente controllare in jsp le opzioni correlate con talipkorkmaz

+0

questa è la sicurezza del metodo, ma ho bisogno di sapere come non mostrare un pulsante sulla pagina jsp se l'utente non è autorizzato. – J888

0

questo è probabilmente quello che sei looking for, with sample code

Nel tuo caso, si avrebbe BF_ADD_XXX, BF_EDIT_XXX e BF_DELETE_XXX ecc

Questo consente di concedere/revocare autorizzazioni particolari (o BFs o funzioni aziendali o qualunque vuoi chiamarli) da/per particolari ruoli.

Problemi correlati