我希望能够即时创建和删除一些剪影角色,例如添加一个非硬编码的角色管理器。
我看到的唯一解决方案是将这些角色存储在数据库中。
Silhouette 需要我来实现:
case class WithRole(role: String*) extends Authorization[User, CookieAuthenticator] {
def isAuthorized[B](user: User, authenticator: CookieAuthenticator)(
implicit request: Request[B]
): Future[Boolean] = {
myChekingIfAuthorizedFunction()
}
问题是我无法将我的数据库注入到案例类中。所以我发现的唯一解决方法是:
myChekingIfAuthorizedFunction(): Future[Boolean] = {
val currentApp: Application = Play.current
val injector: Injector = currentApp.injector
lazy val dbConfProvider: DatabaseConfigProvider = injector.instanceOf[DatabaseConfigProvider]
lazy val ec: ExecutionContextExecutor = scala.concurrent.ExecutionContext.Implicits.global
lazy val isInRole = new IsInRole(dbConfProvider, ec)
isInRole.isInRole(1, user)
}
class IsInRole @Inject()(
protected val dbConfigProvider: DatabaseConfigProvider,
implicit val ec: ExecutionContext
) extends HasDatabaseConfigProvider[MyPostgresDriver]
with RoleTableDefinitions {
def isInRole(roleId: Long, user: User): Future[Boolean] =
db.run(userRoles.filter(_.roleId === roleId).result) map { relations =>
relations.map(_.userId).contains(user.uuid)
}
}
这个解决方案的问题是Play.current
被称为。
那么,你有什么想法可以避免这种情况吗?或者是否有一个我没有找到提供此功能的 github 项目?