2016-08-15 1 views
1

사용자/비밀번호 인증을 위해 Silhouette 4.0을 사용하여 Play 2.5로 샘플 앱을 작성하려고합니다.Play with Silhouette 4.0 - Credential Provider

소스 코드에서 사용할 수 : 나는 해결책을 알아낼 수 아니다으로 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) 

} 

당신은 날 여기에 걸쳐 도와 주시겠습니까?

감사 PARI

답변

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

시 : 명심 그 foreach는 항상 " 반환 유형 없음 "이므로 해당 유형이 unit

+0

고마워요. 모리츠. 나는 나중에 그것을 알아 냈다. 내가 강구 한 credentialsProvider : CredentialsProvider를 명시 적으로 컨트롤러에 주입했습니다. 이제 자격 증명 공급자를 사용할 수 있습니다. Environment에서 설정하는 방법을 잘 모릅니다. Seq() 대신 코드가 무엇입니까? 의견이 있으십니까? 감사합니다. –