1

我希望能够即时创建和删除一些剪影角色,例如添加一个非硬编码的角色管理器。

我看到的唯一解决方案是将这些角色存储在数据库中。

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 项目?

4

0 回答 0