2016-08-15 21 views
1

ユーザー/パスワード認証のために、Silhouette 4.0を使用してPlay 2.5のサンプルアプリケーションを作成しようとしています。Play with Silhouette 4.0 - 資格情報提供者

ソースコードはで入手できます:私は解決策を把握することはできませんよと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) 

} 

あなたはここに私を助けてくださいことはできますか?

@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 
) 
} 

シモンズ::foreachは「いつもすることを、覚えておいてください巴里

答えて

0

です。ここでは2つの異なるものを混在させています。資格情報プロバイダは要求プロバイダではありません。リクエストプロバイダは、特別なタイプのプロバイダであり、リクエストに直接フックすることができます。詳細な説明は、documentationに記載されています。 Silhouetteは、要求プロバイダーの実装であるBasic Authentication providerを提供します。

seed templateで実装されているように、資格情報プロバイダをコントローラに直接注入する必要があります。

+0

ありがとうございました。私は、より完全にリクエストプロバイダーを読む必要があると思います。 –

2

要求プロバイダがあなたのModule.scalaに設定されているが、それらは空のシーケンスに設定されている

感謝あなたのタイプはunit

+0

ありがとうMoritz。私は後でそれを理解した。私はval credentialsProvider:CredentialsProviderを明示的にコントローラに注入しました。今、資格プロバイダを使用することができます。 Environmentに設定する方法が不明です。 Seq()の代わりにコードは何ですか? ありがとう –

関連する問題