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
相关产品推荐
相关产品推荐

