Ich benutze Play! 2.4 mit Deadbolt2 zur Autorisierung. Seit ich die Autorisierungsregeln eingeführt habe, kann ich keine erfolgreichen Tests für meine Controller schreiben. Als Beispiel:Wie testen Controller mit Deadbolt2 DeadboltActions oder gibt es ein anderes Framework, das dies leicht erlaubt?
class VisitController @Inject() (authorization: DeadboltActions) extends Controller {
def fetchDailyVisits(date: Date) = authorization.Restrict(List(Array(ADMIN_ROLE), Array(MANAGER_ROLE))) {
Action.async {
visitService.findDailyVisits(date).map(result =>
Ok(Json.toJson(result))
)
}
}
}
Ich verwende specs2 in den Tests. Mein Test sieht wie folgt aus atm:
class VisitControllerSpec extends PlaySpecification with Mockito with ScalaFutures {
val deadboltActions = mock[DeadboltActions]
"VisitControllerSpec#fetchDailyVisits" should {
val testDate = Date.from(LocalDate.of(2016, 2, 25)
.atStartOfDay(ZoneId.systemDefault()).toInstant)
"Return Status Ok with returned list" in {
val expected = List(completeVisitWithId, anotherCompleteVisitWithId)
visitService.findDailyVisits(testDate) returns Future { expected }
val request = FakeRequest(GET, "/visits?date=2016-02-25")
val result = new VisitController(deadboltActions)
.fetchDailyVisits(testDate)(request)
result.futureValue.header.status must beEqualTo(OK)
contentAsJson(result) must_== Json.toJson(expected)
}
}
}
Wie verspotten ich deadboltActions in einer Weise, die ich den Benutzer angeben kann, wird der Zugriff erlaubt?
Gibt es einen anderen Weg? Vielleicht mit einem anderen DeadboltHandler? Es scheint offensichtlich zu sein, dass dies der richtige Weg wäre. Ich bin einfach nicht in der Lage, es herauszufinden und es gibt nicht viele Deadbolt2-Beispiele (zumindest für Scala).
Oder, als extremer, alle anderen Autorisierungsrahmen da draußen, die gut mit Scala spielen und ermöglicht, Sicherheit als Querschnittsaufgabe zu behandeln, ohne die Controller zu stören? Deadbolt2 ist aus diesem Grund zu begrenzt, aber ehrlich gesagt kann ich keinen besseren Berechtigungsrahmen finden (außer ich schreibe meinen eigenen).
Dieser Ansatz ist jetzt in Deadbolt ab 2.5.1-SNAPSHOT verfügbar, inspiriert von Ihrer Antwort und mit Blick auf Panoptes. https://deadbolt-scala.readme.io/v2.5.1/docs/authorized-routes –
Hey sieht gut aus. Da die Deadlines bei meinem Kunden eng sind und ich schon die Arbeit an der Erstellung von Panoptes gemacht habe, bleibe ich für den Moment dran, aber es ist toll zu sehen, dass Deadbolt diese Funktionen ebenfalls zur Verfügung hat. Übrigens erwähnen die Docs es nicht, aber es ist auch möglich, benutzerdefinierte Autorisierungsregeln zu schreiben, indem man ein Merkmal implementiert, nicht wahr? Prost – redwulf
Absolut - Sie können nur 'FilterFunction' implementieren. Ich wusste nicht, dass du Panoptes geschrieben hast - nette Arbeit! –