2011-11-20 60 views
6

目前,我使用的是默认的HttpSession对象在两个控制器和GSP页面:如何在grails web应用程序中使用shiro本地会话?

在控制器:

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

在GSP的:

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

我想有一个“记住我“的功能。 Shiro已经内置了它。但是,据我所知,为了做到这一点,我必须使用shiro本地会话模式(在Config.groovy中:security.shiro.session.mode =“native”)。默认情况下,它保持会话状态,所以只要cookie过期或用户注销,对象就会保留在会话中。

我的理解正确吗?

那么我将不得不改变我的控制器,以这样的:

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

而我的看法是:

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

所以,我的问题是:

  • 是这样吗?
  • 我不能只用前面的方式来访问会话吗?
  • 我是否必须在某些配置中关闭默认http会话?
+1

你不需要本地会话来使用“记住我”。 – user852518

+0

你有什么建议?你能指点我一些链接吗?在阅读本文后,我尝试了本地会话:http://grails.1312388.n4.nabble.com/Forcing-authentication-of-user-in-Grails-filter-using-Shiro-tp3698679p3702316.html – r0drigopaes

+0

From:https: //grails.org/plugin/shiro按照惯例查看访问控制。你只需在''SecurityUtils.groovy'''中设置'''accessControl(auth:false)'''。如果您正确传递rememberMe标志,该工作。 –

回答

1

我放弃了在会话中保持对象(直到cookie过期)。这里是我做的:

在控制器中的登录方法:

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

第一次会议的“如果”检查是否有我需要的对象。

configureSession方法在会话中放入我需要的所有信息。

相关问题