2013-01-02 8 views
12

Ho una webapp che usa Shiro per l'autenticazione. Le parti rilevanti del web.xml e shiro.ini sono:Come posso reindirizzare le richieste ad un loginUrl Shiro configurato se l'utente è già autenticato?

<listener> 
    <listener-class>org.apache.shiro.web.env.EnvironmentLoaderListener</listener-class> 
</listener> 

<filter> 
    <filter-name>ShiroFilter</filter-name> 
    <filter-class>org.apache.shiro.web.servlet.ShiroFilter</filter-class> 
</filter> 

<filter-mapping> 
    <filter-name>ShiroFilter</filter-name> 
    <url-pattern>/*</url-pattern> 
    <dispatcher>REQUEST</dispatcher> 
    <dispatcher>FORWARD</dispatcher> 
    <dispatcher>INCLUDE</dispatcher> 
    <dispatcher>ERROR</dispatcher> 
</filter-mapping> 

e

[main] 
authc.loginUrl = /authoring/login.html 
authc.successUrl = /authoring 
logout.redirectUrl = /authoring/login.html 

[users] 
foo = foo 

[urls] 
/authoring/logout = logout 
/authoring/** = authc 

Shiro intercetta correttamente tutte le richieste dai client non autenticati e reindirizza al loginUrl configurato (e poi li inoltra sulla pagina richiesta dopo l'autenticazione riuscita). Quello che mi piacerebbe che succedesse è, se un client autenticato fa una richiesta esplicita a /authoring/login.html, reindirizzarlo a/authoring. Questo avverrebbe SOLO se il client è autenticato.

Ad esempio, pensa a come funziona Gmail: provare ad accedere a mail.google.com (o anche a https://accounts.google.com/ServiceLogin) quando hai già effettuato l'accesso reindirizzandoti alla posta in arrivo. È possibile con Shiro fuori dalla scatola? In caso contrario, qual è il modo giusto per implementarlo?

risposta

1

Si potrebbe gestire il login richiedere da soli o utilizzare il framework, si avrebbe bisogno di cambiare il vostro shiro.ini utilizzare un PassThruAuthenticationFilter

authc = org.apache.shiro.web.filter.authc.PassThruAuthenticationFilter 

Si potrebbe ora verificare se l'utente è connesso e riorientare se è vero:

Subject currentUser = SecurityUtils.getSubject(); 
if(currentUser.isAuthenticated()){ 
    //redirect 
}else{ 
    AuthenticationToken token = new UsernamePasswordToken(username, password); 
    currentUser.login(token); 
    WebUtils.redirectToSavedRequest(request, response, "index.xhtml"); 
} 

Questa non è una soluzione totalmente pronta all'uso. Non sono certo se è possibile ottenere l'url successo al di fuori della autenticazione, è possibile reindirizzare manualmente WebUtils.issueRedirect(req, resp, url)

+0

Si sta suggerendo di estendere PassThruAuthenticationFilter e quindi di inserire quel codice in un metodo sovrascritto? Se sì, quale metodo - non riesco a trovare quello appropriato. O stai dicendo che il codice dovrebbe essere in un controller? Al momento non disponiamo di un controller di accesso e sto cercando di capire come utilizzare la tua raccomandazione. – alan

+0

No, sto suggerendo di inserire quel codice in qualsiasi cosa serva la tua pagina di accesso. Io uso jsf in modo che il codice entri nel mio metodo di login nel mio Backing bean –

+0

Puoi estendere il filtro predefinito 'org.apache.shiro.web.filter.authc.FormAuthenticationFilter' per fare quello che vuoi, probabilmente avresti accesso al url di successo anche da qui –

1

Ho incontrato lo stesso problema e ha lavorato intorno ad esso girando la pagina di login in una JSP e l'aggiunta di un reindirizzamento al principio:

<% 
    if (SecurityUtils.getSubject().isAuthenticated()) { 
     response.sendRedirect(request.getContextPath()); 
    } 
%> 
Problemi correlati