2012-11-06 2 views
8

Utilizziamo Spring Security 3.1.3-RELEASE con sicurezza a livello di metodo. Funziona perfettamente.Come ottenere il 'motivo'/causa per AccessDeniedException in Spring Security?

Vorrei registrarmi, e forse mostrare all'utente, perché a viene negato l'accesso.

Utilizzando una sottoclasse org.springframework.security.web.access.AccessDeniedHandlerImpl, posso ottenere un riferimento allo org.springframework.security.access.AccessDeniedException generato, ma non riesco a trovare un modo per determinare cosa l'ha causato (ad esempio, "Ruolo mancante ROLE_ADMIN" o qualcosa del genere).

Mi manca qualcosa o semplicemente non esiste?

+0

stesso problema qui. Sarebbe bello se AccessDecisionVoters non restituisca solo ACCESS_GRANTED o ACCESS_DENIED ma restituisca una AccessDeniedDecision che può contenere un motivo/causa – Janning

+1

Ho creato un problema con jira: https://jira.springsource.org/browse/SEC-2148 – Janning

risposta

4

Sfortunatamente, non è possibile con le implementazioni predefinite disponibili in Spring Security.

ho studiato il codice sorgente e ...

MethodSecurityInterceptor è responsabile della protezione chiamate di metodi. Delega le decisioni di accesso allo AccessDecisionManager. Ho controllato ogni implementazione di AccessDecisionManager disponibile fuori dalla scatola.

  • AffirmativeBased
  • ConsensusBased
  • UnanimousBased

Ognuno di loro tiri AccessDeniedException eccezione in modo simile.

case AccessDecisionVoter.ACCESS_DENIED: 
       throw new AccessDeniedException(
         messages.getMessage("AbstractAccessDecisionManager.accessDenied", 
         "Access is denied") 
       ); 

AbstractAccessDecisionManager.accessDenied è il nome del messaggio, che può essere localizzato.

Per l'inglese è:

AbstractAccessDecisionManager.accessDenied=Access is denied 

Ci sono diverse lingue disponibili dalla scatola, e si può fare si possiede traduzioni, ma ...

Questo è tutto, non è più informazioni su ragioni di eccezione.

Maggiori informazioni sulla localizzazione dei messaggi di eccezione:

http://static.springsource.org/spring-security/site/docs/3.1.x/reference/springsecurity-single.html#localization

0

Ho anche creato un problema di JIRA per questo: https://jira.spring.io/browse/SEC-3104

@PreAuthorize, @PostAuthorize, @Secured annotazione può avere un parametro per indicare proprietà messaggio personalizzato al fine di impostare dettagliato & più messaggi di eccezione user friendly.

Questo potrebbe anche essere fatto fornendo un parametro. per definire un nome di classe che si estende a AccessDeniedException per consentire all'utente di gestire il resto.

In questo modo, durante l'elaborazione di regole complesse come

@PreAuthorize("record.createuser != authentication.getName()")

possiamo ottenere un errore definito come

"You cannot process a record that you created."" ecc invece di "Access is denied"