- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我使用了play-silhouette-seed作为我的应用程序的模板。因此,在我的项目中,我使用基于 cookie 的身份验证器 (CookieAuthenticator
)。即使对于通过嵌入在我的 Twirl 模板中的 JavaScript 进行的 REST 调用,这也绝对可以正常工作。但是,现在我还想在浏览器以外的客户端中以编程方式进行 REST 调用。因此,我必须检索每个响应上的 Set-Cookie:authenticator=...
元素,并将其设置为我的请求的一部分。在嵌入我的 Twirl 模板并在浏览器中呈现的 JavaScript 代码片段中,这不是问题,因为我不必处理这个问题,但对于其他客户端(服务器等)来说,这会导致头痛。
除了我的 CookieAuthenticator
之外,我现在还想实现一个 JWTAuthenticator
。这是否受支持,或者我是否必须完全切换到 JWTAuthenticator ?此外,即使除了身份验证器之外的所有内容都应该是相同的实现,我是否需要单独的操作?
最佳答案
是的,Silhouette 允许您实现多个 authenticators 。以下是如何实现 JWTAuthenticator
提供 JWT 身份验证器服务以及您的 CookieAuthenticator
:
Identity
与相应的Authenticator
连接起来。 例如:
trait CookieEnv extends Env {
type I = Account
type A = CookieAuthenticator
}
trait JWTEnv extends Env {
type I = Account
type A = JWTAuthenticator
}
例如:
class SilhouetteModule extends AbstractModule with ScalaModule {
def configure() {
bind[Silhouette[CookieEnv]].to[SilhouetteProvider[CookieEnv]]
bind[Silhouette[JWTEnv]].to[SilhouetteProvider[JWTEnv]]
// ...
()
}
@Provides
def provideCookieEnvironment(
userService: AccountService,
authenticatorService: AuthenticatorService[CookieAuthenticator],
eventBus: EventBus): Environment[CookieEnv] = {
Environment[CookieEnv](
userService,
authenticatorService,
Seq(),
eventBus
)
}
@Provides
def provideJWTEnvironment(
userService: AccountService,
authenticatorService: AuthenticatorService[JWTAuthenticator],
eventBus: EventBus): Environment[JWTEnv] = {
Environment[JWTEnv](
userService,
authenticatorService,
Seq(),
eventBus
)
}
// ...
@Provides
def provideCookieAuthenticatorService(
@Named("authenticator-cookie-signer") cookieSigner: CookieSigner,
@Named("authenticator-crypter") crypter: Crypter,
fingerprintGenerator: FingerprintGenerator,
idGenerator: IDGenerator,
configuration: Configuration,
clock: Clock): AuthenticatorService[CookieAuthenticator] = {
val config = configuration.underlying.as[CookieAuthenticatorSettings]("silhouette.authenticator")
val encoder = new CrypterAuthenticatorEncoder(crypter)
new CookieAuthenticatorService(config, None, cookieSigner, encoder, fingerprintGenerator, idGenerator, clock)
}
@Provides
def provideJWTAuthenticatorService(
@Named("authenticator-crypter") crypter: Crypter,
idGenerator: IDGenerator,
configuration: Configuration,
clock: Clock): AuthenticatorService[JWTAuthenticator] = {
val config = configuration.underlying.as[JWTAuthenticatorSettings]("silhouette.authenticator")
val encoder = new CrypterAuthenticatorEncoder(crypter)
new JWTAuthenticatorService(config, None, encoder, idGenerator, clock)
}
// ...
}
JWTAuthenticator
configuration settings到您的silhouette.conf
:例如:
authenticator.fieldName = "X-Auth-Token"
authenticator.requestParts = ["headers"]
authenticator.issuerClaim = "Your fancy app"
authenticator.authenticatorExpiry = 12 hours
authenticator.sharedSecret = "!!!changeme!!!"
例如,在您的 app.routes
文件中,添加以下行:
# JWT Authentication
POST /api/jwt/authenticate controllers.auth.api.AuthController.authenticate
AuthController
中,添加相应的authenticate
方法。示例代码(改编自 SignInController.scala
):
implicit val dataReads = (
(__ \ 'email).read[String] and
(__ \ 'password).read[String] and
(__ \ 'rememberMe).read[Boolean]
) (SignInForm.SignInData.apply _)
def authenticate = Action.async(parse.json) { implicit request =>
request.body.validate[SignInForm.SignInData].map { signInData =>
credentialsProvider.authenticate(Credentials(signInData.email, signInData.password)).flatMap { loginInfo =>
accountService.retrieve(loginInfo).flatMap {
case Some(user) => silhouette.env.authenticatorService.create(loginInfo).map {
case authenticator if signInData.rememberMe =>
val c = configuration.underlying
authenticator.copy(
expirationDateTime = clock.now + c.as[FiniteDuration]("silhouette.authenticator.rememberMe.authenticatorExpiry"),
idleTimeout = c.getAs[FiniteDuration]("silhouette.authenticator.rememberMe.authenticatorIdleTimeout")
)
case authenticator => authenticator
}.flatMap { authenticator =>
Logger.info(s"User ${user._id} successfully authenticated.")
silhouette.env.eventBus.publish(LoginEvent(user, request))
silhouette.env.authenticatorService.init(authenticator).map { token =>
Ok(Json.obj("token" -> token))
}
}
case None => Future.failed(new IdentityNotFoundException("Couldn't find user."))
}
}.recover {
/* Login did not succeed, because user provided invalid credentials. */
case e: ProviderException =>
Logger.info(s"Host ${request.remoteAddress} tried to login with invalid credentials (email: ${signInData.email}).")
Unauthorized(Json.obj("error" -> Messages("error.invalidCredentials")))
}
}.recoverTotal {
case e: JsError =>
Logger.info(s"Host ${request.remoteAddress} sent invalid auth payload. Error: $e.")
Future.successful(Unauthorized(Json.obj("error" -> Messages("error.invalidPayload"))))
}
}
关于scala - 如何实现多个Silhouette Authenticator?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42209678/
我使用 scipy.cluster.hierarchy.linkage 作为聚类算法并将结果链接矩阵传递给 scipy.cluster.hierarchy.fcluster ,以获得扁平化的集群,用于
下面的链接说您可以将 CookieAuthenticator 用作无状态或有状态。 http://silhouette.mohiva.com/docs/authenticator 但是我在下面的链接中
在 Spark 中使用 KMeans 聚类时,我想使用 Silhouette 来确定 k 的最佳值。有没有最佳的并行化方法?即使其可扩展 最佳答案 不,根据定义,剪影是不可缩放的。 它使用成对距离,这
我正在对约 100 万个项目(每个表示为一个约 100 个特征向量)运行 k-means 聚类。我已经为各种 k 运行了聚类,现在想用 sklearn 中实现的轮廓分数来评估不同的结果。尝试在没有采样
我是一名优秀的程序员,十分优秀!