在 Play 2.4 with DI 中,如何在“Secured”特征中使用服务类?

2024-01-21

这是一个Play 文档中的授权示例 https://www.playframework.com/documentation/2.0.4/ScalaSecurity#Authorization(版本 2.0.4;我试图找到此文档的更新版本,但找不到):

trait Secured {

  def username(request: RequestHeader) = request.session.get(Security.username)

  def onUnauthorized(request: RequestHeader) = Results.Redirect(routes.Auth.login)

  def withAuth(f: => String => Request[AnyContent] => Result) = {
    Security.Authenticated(username, onUnauthorized) { user =>
      Action(request => f(user)(request))
    }
  }

  def withUser(f: User => Request[AnyContent] => Result) = withAuth { username => implicit request =>
    UserDAO.findOneByUsername(username).map { user =>
      f(user)(request)
    }.getOrElse(onUnauthorized(request))
  }
}

总的来说,这非常简单,我想采用这样的方法。

现在,在 Play 2.4 中推荐的方式是not不再使用单例(如上面的 UserDAO),而是使用类和运行时 DI(参见迁移指南 https://www.playframework.com/documentation/2.4.x/Migration24#Dependency-Injection, or DI docs https://www.playframework.com/documentation/2.4.x/ScalaDependencyInjection).

例如,我的服务和存储库类定义如下:

class AuthService @Inject()(accountRepo: AccountRepository) { }

class AccountRepository { }

使用 Play 2.4 和 DI 时,获取服务或 DAO 的推荐/“正确”/最简单方法是什么(例如AuthService就我而言,或者UserDAO在文档示例中)在类似的特征中Secured?

或者你现在是否应该以一种完全不同于使用这种特征的方式来实现控制器的授权?


我可以让它按照以下方式工作:

trait Secured {
  val authService = GuiceUtils.inject[AuthService]    
  // ...
}

使用这样的助手:

object GuiceUtils {
  lazy val injector = new GuiceApplicationBuilder().injector()    
  def inject[T: ClassTag]: T = injector.instanceOf[T]
}

但根据a中的回答相关问题 https://stackoverflow.com/a/31937794/56285:

在Play中你可以直接使用注入器,只要应用程序 特质在范围内。但这不被认为是好的做法 生产代码。

如果这是真的,那是什么is在这个用例中被认为是好的实践吗?


我认为最简单的方法是在您的特征中声明 authService 但保持抽象,然后让扩展它的控制器处理注入(我相信这就是MessagesApi/I18nSupport注射工作)。所以你可以这样做:

trait Secured {
  val authService: AuthService
  ...
}

controller Application @Inject()(override val authService: AuthService) extends Controller with Secured {
  ...
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Play 2.4 with DI 中,如何在“Secured”特征中使用服务类? 的相关文章

随机推荐

  • 为什么不使用 document.write 呢? [复制]

    这个问题在这里已经有答案了 为什么通常不认为使用document write在 JavaScript 中 我知道这不是最优雅或最好的方法 但是它有任何真正的错误吗 一直好吗 在什么情况下会比inner HTML 据我所知 如果在加载后使用
  • Flask 说“没有提供 FLASK_APP 环境变量”[重复]

    这个问题在这里已经有答案了 我正在尝试运行 Flask 应用程序flask run但无论如何 我收到此错误 Error Could not locate Flask application You did not provide the F
  • 如何使用 serde_json 动态构建 json 数组或对象?

    我需要在运行时构建一个 json 对象 现在 只是一个简单的 key stringvalue 对象 但每个键 值对必须添加到循环中 这看起来非常简单 基本 但我没有找到任何好的示例或文档 我终于设法让一些东西发挥作用 但它似乎太复杂了 不是
  • 如何在 Windows 上获得 git 分支的图形表示,真正显示存储库的拓扑?

    我的最后一个问题已关闭 因为显然是重复的并且已得到多次答复 然而 没有一个答案提到 无法在终端中显示 Git 树 https stackoverflow com questions 1064361 unable to show a git
  • 自定义 uitableViewCell 内的 NSTimer

    我正在从 viewController 激活自定义单元类中的函数 自定义单元格类如下所示 import UIKit class TableViewCell UITableViewCell var counter 10 class func
  • 如何对非 ASCII 字符使用 tolower 函数

    我正在尝试对非 ASCII 字符应用较低的函数 以下代码在Linux Ubuntu 环境中不起作用 但在Windows中有效 int main std string data std transform data begin data en
  • Java:来自 class.getResource( ... ) 的 NullPointerException

    我正在编写一个小型应用程序 当我尝试创建 ImageIcon 时 我总是遇到异常 异常是由这行代码引起的 prayerLevel setIcon new ImageIcon getClass getResource icons icon p
  • 使用原始文件的共享外部包?

    我们有一些项目依赖共享类型进行通信 团队决定使用这些类型的共享包 并希望使用协议缓冲区来实现此实现 如果重要的话 语言是 Go 并且所有这些项目都不是公开的 我们如何使用项目中未定义的协议缓冲区类型 我似乎无法找到一种在应用程序之间共享完全
  • 在 C 扩展中定义 Python 枚举 - 我这样做对吗?

    我正在开发一个 Python C 扩展 我想公开一个完全在 C 中定义的自定义枚举 如 继承自 enum Enum 的类 事实证明这不是一个简单的任务 并且使用常规的继承机制 tp base不起作用 很可能是由于 Enum 的元类没有被引入
  • 在 C 中更改 .bin 文件的数据

    我有很多数据以 bin 格式存储为结构序列 我希望能够随机读取任何结构并在 C 中修改它 我正在尝试使用以下代码 但它不起作用 有人可以帮我解决吗 另外 是否可以从中间的文件中删除中间结构 代码如下 include
  • 从静态域提供 CSS

    我想从静态无 cookie 域提供我的 CSS 和图像 现在我的问题是如何指向 css 文件中的图像 我不想在 css 文件中对我的域进行硬编程 例如 http static com image png http static com im
  • 在搅拌机 2.76 中将装备重量从一个网格转移到另一个网格

    我最近开始使用搅拌机来创建我自己的游戏模型等 我创建了一个模型 对其进行了装备 单独创建了衣服 现在我想将这些衣服添加到我的模型中 以便它随装备移动而不会刺穿皮肤 因此 有很多使用重量转移工具的解决方案 但我似乎无法在 Blender 2
  • 如果设计师可以使用@font-face,为什么还要使用 sIFR?

    如果设计师可以使用 font face 为什么还要使用 sIFR font face 有什么问题吗 font face font family Hacen Tehran eot src url Hacen Tehran eot font f
  • 查询执行速度非常慢,有什么办法可以进一步改进它吗?

    我有以下查询 并且由于很多SUM函数调用 我的查询运行太慢 我的数据库中有很多记录 我想为每条记录获取今年和去年 过去 30 天 过去 90 天和过去 365 天 的报告 SELECT b id as ID d Title as Title
  • 如何在 R 中将字符串转换为日期

    有什么方法可以将下面的字符串转换为标准 R 日期类对象吗 Date String 19th January 2020 任何指针表示赞赏 Lubridate 可以处理它 gt Date String lt 19th January 2020
  • 在 mysql 查询中列出 null 和 not null

    假设我有桌子 NAME ID REF foo1 1 NULL foo2 2 1234 foo2 3 567 foo1 4 NULL foo3 5 89 我想在一个查询中计算 NULL 和 NOT NULL 的所有实例 这样我就可以说 NAM
  • Python 如何从 .egg 文件导入模块?

    我怎样才能打开 init pyc here gt gt gt import stompservice
  • 如何使用 php Excel 生成漂亮的 PDF?

    我正在使用最新的 PHPExcel 版本 我认为是 7 7 我能够生成我的Excel 我必须使用 tcpdf 生成 pdf 版本 这里别无选择 但结果是丑陋且过大 请参阅 2012 000012 的巨大字体大小 在 Excel 中为 11
  • PHP next() 不工作

    我正在尝试使用 PHP 制作一个画廊 图像加载正确 但下一个和上一个按钮似乎不起作用 单击图片 1 下的 下一步 您将看到图片 3 但是单击 图片 3 将您带到图片 2 这是正确的 我应该如何更改我的代码以使两者都按顺序进行
  • 在 Play 2.4 with DI 中,如何在“Secured”特征中使用服务类?

    这是一个Play 文档中的授权示例 https www playframework com documentation 2 0 4 ScalaSecurity Authorization 版本 2 0 4 我试图找到此文档的更新版本 但找不