2016-08-15 36 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()。 任何想法。 謝謝 –