【问题标题】:unable to create `Environment` in `Silhouette`无法在“剪影”中创建“环境”
【发布时间】:2018-09-10 04:26:29
【问题描述】:

我正在尝试在Silhouette 中创建Environment,但我无法做到。我已将IdentityAuthenticator 定义如下

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

接下来,我想我必须创建Environment。为此,我编写了以下代码,但由于我不明白如何传递 Environmentapply 方法所期望的不同参数,所以我坚持了下来

环境伴生对象的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


【解决方案1】:

这里是cookie验证器的实现

import com.mohiva.play.silhouette.api.actions._
import com.mohiva.play.silhouette.api.{EventBus, SilhouetteProvider}

import com.mohiva.play.silhouette.api.crypto.CrypterAuthenticatorEncoder
import com.mohiva.play.silhouette.api.util.Clock
import com.mohiva.play.silhouette.crypto.{JcaCrypter, JcaCrypterSettings, JcaSigner, JcaSignerSettings}
import com.mohiva.play.silhouette.impl.authenticators.{CookieAuthenticatorService, CookieAuthenticatorSettings}
import com.mohiva.play.silhouette.impl.util.{DefaultFingerprintGenerator, SecureRandomIDGenerator}
import components._
import play.api.mvc.DefaultCookieHeaderEncoding
import controllers._
import play.api._
import services.db.cassandra.UserService
import play.filters.csrf._
import services.AtomicCounter
import play.api.ApplicationLoader.Context
import play.filters.HttpFiltersComponents
import router.Routes


class AppLoader extends ApplicationLoader {

  override def load(context: ApplicationLoader.Context): Application = {
    LoggerConfigurator(context.environment.classLoader).foreach {
      _.configure(context.environment, context.initialConfiguration, Map.empty)
    }
    new AppComponents(context).application
  }
}

class AppComponents (context: Context) extends BuiltInComponentsFromContext(context)
  with CassandraRepositoryComponents
  with HttpFiltersComponents
  with AssetsComponents
  with CSRFComponents
  /*with SilhouetteComponents*/{ //TODOM - Would prefer SilhouetteComponent but creating an Environment requires IdentityService.  UserService is an IdentifyService but it requires userRepository which is created here. Need to resolve this cross dependence

  val userIdentityService = new UserService(userRepository) //responsible for retrieving user information (eg email id) from a database

  val config =  CookieAuthenticatorSettings() 
  val fingerprintGenerator = new DefaultFingerprintGenerator(false)
  val idGenerator = new SecureRandomIDGenerator()
  val clock:Clock = Clock()
  val signer= new JcaSigner(new JcaSignerSettings("someSigner"))
  val crypter = new JcaCrypter(new JcaCrypterSettings("someCrypter"))
  val authenticatorEncoder = new CrypterAuthenticatorEncoder(crypter)
  val cookieHeaderEncoding= new DefaultCookieHeaderEncoding()
  val authenticatorService = new CookieAuthenticatorService(config, None, signer, cookieHeaderEncoding, authenticatorEncoder, fingerprintGenerator, idGenerator, clock)

  val cookieEnv = com.mohiva.play.silhouette.api.Environment[CookieEnv](userIdentityService ,authenticatorService,Seq(),EventBus())

  val defaultParser = new mvc.BodyParsers.Default()

  val securedAction = new DefaultSecuredAction(new DefaultSecuredRequestHandler(new DefaultSecuredErrorHandler(messagesApi)), defaultParser )
  val unsecuredAction = new DefaultUnsecuredAction(new DefaultUnsecuredRequestHandler(new DefaultUnsecuredErrorHandler(messagesApi)),defaultParser)
  val userAware = new DefaultUserAwareAction(new DefaultUserAwareRequestHandler(),defaultParser)

  val silhouette = new SilhouetteProvider[CookieEnv](cookieEnv,securedAction,unsecuredAction,userAware)
  lazy val userRepositoryController = new UserController(userRepository, controllerComponents)
  lazy val homeController = new HomeController(controllerComponents, csrfAddToken,csrfCheck,silhouette) //using Silhouette in only one controller for the moment

  lazy val countController = new CountController(controllerComponents,new AtomicCounter())
  lazy val asyncController = new AsyncController(controllerComponents, actorSystem)

  lazy val userWSRoutes = new WSRouters.User.UserRouter(userRepositoryController) //TODOM - whatam i doing here?

  lazy val router = new Routes(httpErrorHandler, homeController,userWSRoutes, countController,asyncController, assets)

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-30
    • 2020-08-10
    • 2020-11-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多