Давным-давно жил-был молодой джентльмен, который прочитал несколько руководств, часть документации, немало вопросов по StackOverflow и, может быть, даже задал один или два. После того, как он это сделал, он подумал, что у него есть четкое представление о том, как все работает, и начал создавать нужные ему функции, и это сработало! Пока не появилась злая ведьма и не попробовала с другого браузера без волшебных файлов cookie, и он не понял, что UserIdentity
сохранялся между пользователями... это было нехорошо.
Из спектакля! документы (документы Guice говорят аналогично)
Новые экземпляры создаются каждый раз, когда требуется компонент. Если компонент используется более одного раза, то по умолчанию будет создано несколько экземпляров компонента. Если вам нужен только один экземпляр компонента, вам нужно пометить его как синглтон.
Вершина моего класса IndexController
(я предполагаю, что каждый запрос вызывает действие index один раз и, следовательно, запрашивает новый UserIdentity
— это неправильно?)
@Singleton
class IndexController @Inject() (contentModel: ContentModel, site: Site, injector: Injector) extends Controller {
def index(url: String, page: Int = 1, sort: String, dir: Int) = Action.async { implicit request =>
implicit val queryString : QueryString = request.queryString
val userIdentityClass = injector.getInstance(classOf[UserIdentity])
implicit val userIdentity : Future[UserIdentity] = userIdentityClass.getUserIdentity
doContent(url, page, sort, dir) fallbackTo doAlias(url) fallbackTo do404(url)
}
Затем userIdentity
неявно передается в недра машины.
Метод getUserIdentity
вызывает метод getUser
, выполняющий аутентификацию, и устанавливает свойство user : UserModel
. Все это передается в будущем, поэтому, когда мы используем userIdentity
позже в приложении, мы можем отобразить его, чтобы мы знали, что аутентификация завершена.
Вот метод получения пользователя и println
, который вызывается для пользователя, не прошедшего проверку подлинности.
private def getUser(implicit request:Request[AnyContent]) : Future[UserModel] = {
if (user != null) {
println("User already set")
Future { user }
} else {
//Go and find the user from cookie/some other auth stuff
Обратите внимание, что var user : UserModel = null
относится к классу UserIdentity
, поэтому в новом экземпляре он должен быть null
.