4

我正在开发具有安全社交整合功能的 play 2.1。到目前为止,我已经能够使用 SALAT 将 securesocial 与 mongod db 集成。现在我可以登录/注销了。但是现在我想要的是如果用户已经登录,那么我需要在我的 Web 应用程序的标题中显示用户信息,如头像等,我不知道如何在不作为参数传递的情况下在 scala.html 中获取用户信息控制器。我不能每次都这样做。

我们是否有类似于 spring security 的东西,它从会话中获取用户并使用 EL 或 spring taglib 来显示用户信息?

4

3 回答 3

3

很遗憾这个社区如此不活跃或不想回答这个问题。即使在几年后,我仍然发现 spring 和 java 社区回答了最基本的问题。所以这就是我所做的。非常欢迎任何改进或建议。

在我的控制器中编写了一个方法,该方法将用户作为隐式方法返回。

  implicit def user(implicit request: RequestHeader):Option[Identity] = {
    SecureSocial.currentUser
  }

将此用户传递给我的模板并使其隐含。想知道为什么它不能直接从控制器使用它。我必须明确地通过它,这很奇怪。

  @(implicit user:Option[securesocial.core.Identity])

由于用户信息必须在所有页面中,它必须包含在主模板或主模板中调用另一个呈现用户信息的模板。在我的主模板中=>

@(title: String, nav: String = "")(content: Html)(implicit user:Option[securesocial.core.Identity]=None)

然后一些查看相关代码

@if(user.isDefined){
      <li>          
         <a href="@securesocial.controllers.routes.LoginPage.logout()"/>Logout</li>
         }else{
      <li>
        <a href="@securesocial.core.providers.utils.RoutesHelper.login()">Login</a></li>
 }
于 2013-09-02T02:20:29.223 回答
2

您可以在模板中调用控制器的方法来获取某些内容,而无需将其作为参数传递:

@defining(Auth.getCurrentUserName()) {user =>
    <div>Hello, @user</div>
}

Auth是一个控制器,getCurrentUserName()只是从会话中获取一些数据。

public static String getCurrentUserName() {
    return session().get("username");
}
于 2013-08-22T00:09:15.290 回答
2

为了在不提供隐式用户的情况下使其更简单,只需在您的 scala 模板中直接调用 SecureSocial.currentUser() 即可。

您需要导入它,然后您可以检查用户是否已定义:

@import securesocial.core.SecureSocial

@if(SecureSocial.currentUser.isDefined) {
    ...
}
于 2014-04-06T11:46:31.267 回答