You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Silhouette中无法创建Environment:不知如何传递apply方法参数

我明白你在Silhouette里创建Environment时卡壳了——别担心,这部分的参数确实需要理清几个核心组件的实例。咱们结合你定义的SessionEnv来一步步拆解怎么搞定它:

先回顾你的Env定义

你已经正确定义了专属的环境特质,明确了身份类型和认证器类型:

trait SessionEnv extends Env {
  type I = User
  type A = SessionAuthenticator
}

拆解Environment.apply的必填参数

Silhouette的Environment伴生对象的apply方法,核心需要4个关键组件实例,咱们逐个准备:

1. IdentityService[User]

这个服务负责根据LoginInfo加载/查找你的User实例,你需要自己实现业务逻辑:

import com.mohiva.play.silhouette.api.IdentityService
import com.mohiva.play.silhouette.api.LoginInfo
import scala.concurrent.Future

class UserIdentityService extends IdentityService[User] {
  override def retrieve(loginInfo: LoginInfo): Future[Option[User]] = {
    // 这里写从数据库/存储中根据LoginInfo查询User的逻辑
    // 比如用Slick、MongoDB驱动或者ORM实现查询
    Future.successful(None) // 替换成你的实际业务代码
  }
}

// 创建实例
val userIdentityService = new UserIdentityService()

2. AuthenticatorService[SessionAuthenticator]

针对SessionAuthenticator,可以用Silhouette提供的默认实现,先配置参数再创建实例:

import com.mohiva.play.silhouette.api.util.Clock
import com.mohiva.play.silhouette.impl.authenticators.{SessionAuthenticatorService, SessionAuthenticatorSettings}
import com.mohiva.play.silhouette.impl.util.DefaultFingerprintGenerator
import scala.concurrent.duration._

// 配置Session认证器的参数
val sessionAuthSettings = SessionAuthenticatorSettings(
  cookieName = "app-session",
  cookiePath = "/",
  secureCookie = false, // 生产环境建议设为true
  httpOnlyCookie = true,
  useFingerprinting = true,
  authenticatorIdleTimeout = Some(2 hours), // 闲置超时时间
  authenticatorExpiry = 12 hours // 认证器总有效期
)

// 创建Session认证器服务实例
val sessionAuthService = new SessionAuthenticatorService(
  sessionAuthSettings,
  DefaultFingerprintGenerator(),
  Clock()
)

3. RequestProviders(请求提供者序列)

因为你用的是SessionAuthenticator,对应需要SessionProvider实例:

import com.mohiva.play.silhouette.impl.providers.SessionProvider

val sessionProvider = new SessionProvider(sessionAuthService)
val requestProviders = Seq(sessionProvider)

4. EventBus(事件总线)

直接用Silhouette提供的默认实现即可:

import com.mohiva.play.silhouette.api.util.DefaultEventBus

val eventBus = new DefaultEventBus()

最终创建Environment实例

把上面准备好的所有参数传入Environment.apply,就能得到你需要的环境实例:

import com.mohiva.play.silhouette.api.Environment

val env: Environment[SessionEnv] = Environment[SessionEnv](
  identityService = userIdentityService,
  authenticatorService = sessionAuthService,
  requestProviders = requestProviders,
  eventBus = eventBus
)

额外提示(Play框架场景)

如果是在Play项目中使用,更推荐通过Guice依赖注入来管理这些实例,避免手动new。你可以在自定义的Module中绑定这些组件:

import com.google.inject.AbstractModule
import com.mohiva.play.silhouette.api._
import com.mohiva.play.silhouette.api.util._
import play.api.libs.concurrent.AkkaGuiceSupport

class SilhouetteModule extends AbstractModule with AkkaGuiceSupport {
  override def configure(): Unit = {
    bind[IdentityService[User]].to[UserIdentityService]
    bind[AuthenticatorService[SessionAuthenticator]].toInstance(sessionAuthService)
    bind[RequestProvider].toInstance(sessionProvider)
    bind[EventBus].to[DefaultEventBus].asEagerSingleton()
    bind[Environment[SessionEnv]].toInstance(env)
  }
}

内容的提问来源于stack exchange,提问作者Manu Chadha

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:25:55