【发布时间】:2018-09-10 04:26:29
【问题描述】:
我正在尝试在Silhouette 中创建Environment,但我无法做到。我已将Identity 和Authenticator 定义如下
trait SessionEnv extends Env {
type I = User
type A = SessionAuthenticator
}
接下来,我想我必须创建Environment。为此,我编写了以下代码,但由于我不明白如何传递 Environment 的 apply 方法所期望的不同参数,所以我坚持了下来
环境伴生对象的apply方法有签名
def apply[E <: Env](
identityServiceImpl: IdentityService[E#I],
authenticatorServiceImpl: AuthenticatorService[E#A],
requestProvidersImpl: Seq[RequestProvider],
eventBusImpl: EventBus
我知道我必须提供IdentityService 的实现。我已经这样做了
class UserService @Inject()(userDao:UsersRepository) extends IdentityService[User] {...}
用户定义如下
case class UserProfile(
loginInfo:LoginInfo,
confirmed: Boolean,
email:Option[String],
firstName: Option[String],
lastName: Option[String],
passwordInfo:Option[PasswordInfo]
//oauth1Info: Option[OAuth1Info],
//avatarUrl: Option[String]) {
)
//representation of a user. A user has an Id and a profile
case class User (id:UUID, profile:UserProfile)
但是对于 apply 所需的其他值,我应该传递什么 -authenticatorServiceImpl: AuthenticatorService[E#A], requestProvidersImpl: Seq[RequestProvider], eventBusImpl: 事件总线
val sessionEnv = com.mohiva.play.silhouette.api.Environment[SessionEnv](new UserService(userRepository),????)
另外,我想我不必使用Guice,因为我正在使用编译时注入。对吗?
更新
我从SessionAuthenticatorService 更改为CookieAuthenticatorService 以尝试一些在线可用的代码。
我的理解似乎Silhouette 提供了一些默认实现并不完全正确。我认为我可以简单地使用https://github.com/mohiva/play-silhouette/blob/master/silhouette/app/com/mohiva/play/silhouette/impl/authenticators/SessionAuthenticator.scala 中定义的SessionAuthenticatorService 伴随对象,但事实并非如此。查看ScalaModule 中创建的一些代码,似乎我必须自己创建所需的对象,但我需要在我的 AppLoader 类(用于编译时 DI)而不是 ScalaModule(用于运行时 DI)中创建。但是,我仍然没有解决问题。我不知道如何创建CookieAuthenticatorService所需的signer
val config = configuration.underlying.asInstanceOf[CookieAuthenticatorSettings]("silhouette.authenticator")
val fingerprintGenerator = new DefaultFingerprintGenerator(false)
val idGenerator = new SecureRandomIDGenerator()
val clock:Clock = Clock()
val authenticatorService: AuthenticatorService[CookieAuthenticator] = new CookieAuthenticatorService(config,None,,,fingerprintGenerator, idGenerator,clock) //STILL NEED TO FIND OUT HOW TO CREATE Signer AND CookieHeaderEncoding required by CookieAuthenticator service
val cookieEnv = com.mohiva.play.silhouette.api.Environment[CookieEnv](userIdentityService ,authenticatorService,Seq(),EventBus())
【问题讨论】:
-
我想 Silhouette 为 Authenticators、Providers 提供了默认实现,我们还可以获取对事件总线的引用。我试过
val sessionEnv = com.mohiva.play.silhouette.api.Environment[SessionEnv](new UserService(userRepository),SessionAuthenticatorService() ,CredentialsProvider(),EventBus()),但我收到错误om.mohiva.play.silhouette.impl.authenticators.SessionAuthenticatorService.type does not take parameters。我删除了(),但得到了错误found : SessionAuthenticatorService.type [error] required: AuthenticatorService[components.SessionEnv#A]
标签: silhouette