如何在PlayFramework中使用Scala Secure Trait?

Jon*_*nas 5 authentication controller scala traits playframework

我正在尝试使用Play Framework在Scala中构建Web应用程序.在Java中使用Play Framework时,我可以使用Secure模块对需要登录的页面进行身份验证.这是许多Web应用程序中的常见问题,我想为我的Web应用程序使用通用解决方案.

我试图使用具有安全特征示例的Traits跟随混合控制器,但我的特性甚至没有编译,我不明白什么是错的.

我已从示例中创建了特征并将其保存在mysite\app\Secure.scala:

package controllers

import play._
import play.mvc._

trait Secure {
    self:Controller =>

    @Before checkSecurity = {
        session("username") match {
            case Some(username) => renderArgs += "user" -> User(username)
                                   Continue
            case None => Action(Authentication.login)
        }
    }

    def connectedUser = renderArgs("user").get

}
Run Code Online (Sandbox Code Playgroud)

然后我用一个简单的安全特征mysite\app\MySecretController.scala:

package controllers

import play._
import play.mvc._

object MySecretController extends Controller with Secure {
    def index = <h1>Hello</h1>
}
Run Code Online (Sandbox Code Playgroud)

但是在访问页面时我收到编译错误:

The file /app/Secure.scala could not be compiled. Error raised is : expected 
start of definition
Run Code Online (Sandbox Code Playgroud)

在这条线上:

@Before ?checkSecurity = {
Run Code Online (Sandbox Code Playgroud)

我还创建了一个简单的mysite/app/User类:

package controllers

class User (name: String){

}
Run Code Online (Sandbox Code Playgroud)

关于如何解决这个问题的任何建议?


UPDATE

def按照Felipe的建议添加后.我收到另一个错误not found: value User:

case Some(username) => renderArgs += "user" -> ?User(username)
Run Code Online (Sandbox Code Playgroud)

Fel*_*ipe 6

在定义方法之前,必须使用关键字def.

@Before def checkSecurity = {
Run Code Online (Sandbox Code Playgroud)

应该解决这个问题

  • 有可能你没有用户类吗?或者你可能没有将它声明为case类,因此你没有User.apply()方法给你试图调用的User对象伴侣. (4认同)