2010-05-30 66 views
1

此代码获取年代当前登录的用户,使用Spring安全插件(Acegi的):如何保存春季安全登录的用户在会话

def principalInfo = authenticateService.principal() 
def person = null 
if (principalInfo != "anonymousUser" && principalInfo.username) { 
    person = Person.findByUsername(principalInfo.username) 
} 

然后,我会喜欢做的事:

session.user = person 

这需要在用户登录后完成。我无法弄清楚在哪里放置我的代码来执行此操作。它似乎应该是登录控制器中的某个地方,但我看不到在哪里。

回答

1

你为什么要这样做?该人已经隶属于会议中的委托人。调用authenticateService.userDomain()来访问它。

+0

几乎工程,但如果你访问任何相关财产如果失败,例如如果我做 person = authenticateService.userDomain() company = person.company 我得到一个LazyInitializationException。可能这就是为什么人们使用上面的代码? 这是我需要一个自定义的userDetailsS​​ervice?或者会设置渴望解决问题? – 2010-05-30 20:11:58

+0

您可以使用预先抓取,但如果您只需要它就可以使用这种用例。为了避免LIE,您可以重新附加实例(def person = authenticateService.userDomain(); person.attach())或通过id(def person = Person.get(authenticateService.userDomain()。id))重新加载它。这比预先加载更好,因为只有当你知道需要时才能做到这一点 - 如果你只需要字符串,布尔值或数字属性,那么就不需要重新附加或重新加载。 – 2010-05-31 03:37:42

+0

person.attach()给了我一个NonUniqueObjectException,但def person = Person.get(authenticateService.userDomain()。id)的作品。 谢谢! – 2010-05-31 07:14:09

0

Spring不会直接在会话中设置用户对象。但是他们在会话中放置了SPRING_SECURITY_CONTEXT对象。这包含经过身份验证的用户。在你的控制器代码

${session.SPRING_SECURITY_CONTEXT?.authentication?.authenticated} 

或干脆直接:

下在对子级的GSP工作。 我用这个与导航插件,显示某些菜单的:

static navigation = [ 
     group:'tabs', 
     order:10, 
     isVisible: { session.SPRING_SECURITY_CONTEXT?.authentication?.authenticated } 
    ] 

,并回答你的问题,你可以得到用户对象是这样的:

session.SPRING_SECURITY_CONTEXT?.authentication?.principal?