【发布时间】:2019-04-04 19:01:59
【问题描述】:
我正在使用Lagom 构建令牌身份验证微服务,但遇到了问题。我的数据模型目前是
table Token (
groupName varchar(255) PK,
token varchar(255) (logical UUID type)
)
我有三种方法,createToken、getToken 和 validateToken。前两个采用组名,它很好地映射到https://www.lagomframework.com/documentation/current/scala/PersistentEntity.html#Persistent-Entity 中列出的实体 ID。
第三个在请求的正文中获取一个令牌,然后返回一个带有groupName 和token 的 json 有效负载(如果成功)。
Lagom 抽象出实际的 SQL,您可以通过以下方式访问持久层:val ref = persistentEntityRegistry.refFor[DptokenEntity](groupName)。实际的持久化代码在这里:
class DptokenEntity extends PersistentEntity {
override type Command = DptokenCommand[_]
override type Event = DptokenEvent
override type State = DptokenState
override def initialState: DptokenState = DptokenState(None)
override def behavior: Behavior = {
case DptokenState(_) => Actions()
.onCommand[PersistToken, TokenResponse] {
case (PersistToken(token), ctx, state) =>
ctx.thenPersist(TokenPersisted(token)) { _ =>
ctx.reply(token)
}
}.onReadOnlyCommand[GetToken, TokenResponse] {
case (GetToken(groupName), ctx, state) =>
state.token match {
case Some(token) => ctx.reply(token)
case None => ctx.invalidCommand(s"No token exists for $groupName")
}
}.onEvent {
case (TokenPersisted(token), _) => DptokenState(Some(token))
}
}
}
case class DptokenState(token: Option[TokenResponse])
我很难理解如何使用上述模型进行反向查找,因为如果我通过令牌查找 entity,我表面上会在关系为 @ 的数据库中获得一个新行987654332@ -> groupName,这会给更新等带来大量问题......
在我撕掉 Event Sourcing 的东西并使用原始 Slick 之前,我想与 SO 上的好人核实一下。
【问题讨论】: