2016-08-15 32 views
1

我正在尝试使用用户/密码身份验证使用剪影4.0的Play 2.5编写示例应用程序。与剪影4.0一起玩2.5 - 凭据提供商

的源代码,请访问:https://github.com/pariksheet/dribble

我停留在环境对象

Environment[JWTEnv](
    identityService, 
    authenticatorService, 
    Seq(), 
    eventBus 
) 

设置requestProvider正如我不能找出解决办法,我在我所有的控制器注入凭据提供类。

class MyController @Inject() (val messagesApi: MessagesApi,val silhouette: Silhouette[JWTEnv], 
    authInfoRepository: AuthInfoRepository, 
    credentialsProvider: CredentialsProvider) 
    extends Controller { 
      def authenticate = Action.async(BodyParsers.parse.json) { implicit request => 
     credentialsProvider.authenticate(Credentials(data.email, data.password)).flatMap { loginInfo => ..}  
     // silhouette.env.requestProviders.foreach { x => println("====" + x.id) } --- I am hoping to get credential provider from silhouette object 

     ... 
     ... 
     } 
    } 

我Module.scala如下 -

package module 

import com.google.inject.AbstractModule 
import com.google.inject.Provides 
import com.mohiva.play.silhouette.api.Env 
import com.mohiva.play.silhouette.api.Environment 
import com.mohiva.play.silhouette.api.EventBus 
import com.mohiva.play.silhouette.api.Silhouette 
import com.mohiva.play.silhouette.api.SilhouetteProvider 
import com.mohiva.play.silhouette.api.crypto.Base64AuthenticatorEncoder 
import com.mohiva.play.silhouette.api.repositories.AuthInfoRepository 
import com.mohiva.play.silhouette.api.services.AuthenticatorService 
import com.mohiva.play.silhouette.api.services.AvatarService 
import com.mohiva.play.silhouette.api.services.IdentityService 
import com.mohiva.play.silhouette.api.util.CacheLayer 
import com.mohiva.play.silhouette.api.util.Clock 
import com.mohiva.play.silhouette.api.util.FingerprintGenerator 
import com.mohiva.play.silhouette.api.util.HTTPLayer 
import com.mohiva.play.silhouette.api.util.IDGenerator 
import com.mohiva.play.silhouette.api.util.PasswordHasher 
import com.mohiva.play.silhouette.api.util.PasswordHasherRegistry 
import com.mohiva.play.silhouette.api.util.PasswordInfo 
import com.mohiva.play.silhouette.api.util.PlayHTTPLayer 
import com.mohiva.play.silhouette.impl.authenticators.JWTAuthenticator 
import com.mohiva.play.silhouette.impl.authenticators.JWTAuthenticatorService 
import com.mohiva.play.silhouette.impl.authenticators.JWTAuthenticatorSettings 
import com.mohiva.play.silhouette.impl.providers.CredentialsProvider 
import com.mohiva.play.silhouette.impl.services.GravatarService 
import com.mohiva.play.silhouette.impl.util.DefaultFingerprintGenerator 
import com.mohiva.play.silhouette.impl.util.PlayCacheLayer 
import com.mohiva.play.silhouette.impl.util.SecureRandomIDGenerator 
import com.mohiva.play.silhouette.password.BCryptPasswordHasher 
import com.mohiva.play.silhouette.persistence.daos.DelegableAuthInfoDAO 
import com.mohiva.play.silhouette.persistence.repositories.DelegableAuthInfoRepository 

import daos.MongoUserDao 
import daos.MongoUserTokenDao 
import daos.PasswordInfoDao 
import daos.UserDao 
import daos.UserTokenDao 
import models.User 
import net.codingwell.scalaguice.ScalaModule 
import play.api.Configuration 
import play.api.libs.concurrent.Execution.Implicits.defaultContext 
import play.api.libs.ws.WSClient 
import services.UserService 

trait JWTEnv extends Env { 
    type I = User 
    type A = JWTAuthenticator 
} 

class Module extends AbstractModule with ScalaModule { 

    def configure() { 
    bind[IdentityService[User]].to[UserService] 
    bind[UserDao].to[MongoUserDao] 
    bind[UserTokenDao].to[MongoUserTokenDao] 
    bind[DelegableAuthInfoDAO[PasswordInfo]].to[PasswordInfoDao] 
    bind[IDGenerator].toInstance(new SecureRandomIDGenerator()) 
    bind[PasswordHasher].toInstance(new BCryptPasswordHasher) 
    bind[FingerprintGenerator].toInstance(new DefaultFingerprintGenerator(false)) 
    bind[EventBus].toInstance(EventBus()) 
    bind[Clock].toInstance(Clock()) 
    bind[CacheLayer].to[PlayCacheLayer] 
    bind[Silhouette[JWTEnv]].to[SilhouetteProvider[JWTEnv]] 
    } 

    @Provides 
    def provideHTTPLayer(client: WSClient): HTTPLayer = new PlayHTTPLayer(client) 

    @Provides 
    def provideEnvironment(
    identityService: IdentityService[User], 
    authenticatorService: AuthenticatorService[JWTAuthenticator], 
    eventBus: EventBus): Environment[JWTEnv] = { 

    Environment[JWTEnv](
     identityService, 
     authenticatorService, 
     Seq(), 
     eventBus 
    ) 
    } 

    @Provides 
    def provideAuthenticatorService(
    fingerprintGenerator: FingerprintGenerator, 
    idGenerator: IDGenerator, 
    configuration: Configuration, 
    clock: Clock): AuthenticatorService[JWTAuthenticator] = { 
    val settings = JWTAuthenticatorSettings(
     sharedSecret = configuration.getString("application.secret").getOrElse("PARI")) 


    new JWTAuthenticatorService(
     settings = settings, 
     repository = None, 
     authenticatorEncoder = new Base64AuthenticatorEncoder, 
     idGenerator = idGenerator, 
     clock = Clock()) 
    } 

    @Provides 
    def provideAuthInfoRepository(
    passwordInfoDAO: DelegableAuthInfoDAO[PasswordInfo]): AuthInfoRepository = { 

    new DelegableAuthInfoRepository(passwordInfoDAO) 
    } 

    @Provides 
    def providePasswordHasherRegistry(passwordHasher: PasswordHasher): PasswordHasherRegistry = { 
    new PasswordHasherRegistry(passwordHasher) 
    } 

    @Provides 
    def provideCredentialsProvider(
    authInfoRepository: AuthInfoRepository, 
    passwordHasherRegistry: PasswordHasherRegistry): CredentialsProvider = { 

    new CredentialsProvider(authInfoRepository, passwordHasherRegistry) 
    } 


    @Provides 
    def provideAvatarService(httpLayer: HTTPLayer): AvatarService = new GravatarService(httpLayer) 

} 

能否请你帮我在这里?

感谢 帕里

回答

0

你在这里混合两个不同的东西。凭证提供程序不是请求提供程序。请求提供者是一种特殊类型的提供者,可以直接挂接到请求中。有关详细说明,请参见documentation。 Silhouette提供了一个Basic Authentication provider这是一个请求提供者的实现。

凭证提供程序应该直接注入您的控制器,如seed template中所实施的。

+0

感谢您的信息。我想,我需要更彻底地阅读请求提供者。 –

2

请求供应商在你的Module.scala设置,但它们设置为空序列:

@Provides 
def provideEnvironment(
    identityService: IdentityService[User], 
    authenticatorService: AuthenticatorService[JWTAuthenticator], 
    eventBus: EventBus): Environment[JWTEnv] = { 

    Environment[JWTEnv](
    identityService, 
    authenticatorService, 
    Seq(),     // Here the request providers are set 
    eventBus 
) 
} 

PS:请记住,该foreach总会“返回无“,因为它的类型是unit

+0

谢谢莫里茨。我后来知道了。我已注入val credentialsProvider:CredentialsProvider,明确地在控制器中。我现在可以使用凭证提供程序。 不知道如何在环境中设置。什么是代码而不是Seq()。 任何想法。 谢谢 –