我正在使用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
,表面上我会在数据库中获得新的一行,因此,我努力理解如何对上述模型进行反向查找是token
-> groupName
,这给更新等带来了巨大的问题。
我想先了解一下SO方面的优秀人才,然后才删除Event Sourcing的资料并使用原始的Slick。
答案 0 :(得分:1)
您确定要使用CQRS和Lagom永久实体吗?
如果您需要实现通过token
查找实体的案例,则需要为此使用Read-Side。但是我不确定Lagom PE是您的正确选择。尝试使用基本的PersistentActor代替Lagom PE。