2011-11-20 11 views
6

Attualmente, sto usando l'oggetto predefinito HttpSession in entrambi i controller e le pagine SPG:Come utilizzare una sessione nativa shiro in un'applicazione web Grails?

Nei controllori:

... 
session.mykey = anObject; // adding an object to session 
... 
if (session.otherkey) { // performing some checking 

In GSP:

... 
<g:if test="${session.mykey}"> 
... 

mi piacerebbe avere un " ricordati di me "funzionalità. Shiro lo ha già costruito. Tuttavia, per quanto ho capito, per farlo devo usare la modalità sessione nativa shiro (in Config.groovy: security.shiro.session.mode = "native"). Per impostazione predefinita, persiste lo stato della sessione, quindi gli oggetti rimarranno nella sessione fino alla scadenza del cookie o alla disconnessione dell'utente.

La mia comprensione è corretta?

allora dovrò cambiare il mio controller per questo:

def shiroSession = SecurityUtils.subject.session 
shiroSession.setAttribute("mykey",anObject) 
.... 
if (shiroSession.getAttribute("otherkey")){ 

E le mie opinioni a questo:

<g:if test="${SecurityUtils.subject.session.getAttribute('mykey')}"> 

Quindi, le mie domande sono:

  • È quello giusto ?
  • Non posso semplicemente usare il modo precedente per accedere alla sessione?
  • Devo disattivare la sessione http predefinita in alcune configurazioni?
+1

non è necessaria la sessione nativa per utilizzare "ricordami". – user852518

+0

cosa suggerisci? Puoi indicarmi qualche link? Ho provato la sessione nativa dopo aver letto questo post: http://grails.1312388.n4.nabble.com/Forcing-authentication-of-user-in-Grails-filter-using-Shiro-tp3698679p3702316.html – r0drigopaes

+0

Da: https: //grails.org/plugin/shiro guarda al controllo degli accessi per convenzione. Basta impostare '' 'accessControl (auth: false)' '' in '' 'SecurityUtils.groovy'''. Dovrebbe funzionare se si passa il flag rememberMe correttamente. –

risposta

1

Ho rinunciato a mantenere gli oggetti nella sessione in modo persistente (fino alla scadenza del cookie). Ecco quello che ho fatto:

Nel metodo di login nel controller:

if (! session.currentProfile){ 
    Subject currentUser = SecurityUtils.getSubject() 
if (currentUser.isRemembered()){ 
    boolean success = configureSession(session, currentUser.getPrincipal()) 
     if (success){ 
     ... 
     } 
    } 
    .... 
} 

Il primo "se" controlla se la sessione ha lo scopo ho bisogno.

Il metodo configureSession inserisce nella sessione tutte le informazioni necessarie.