Kurz gesagt: Meine Anwendung verwendet die Play web framework Version 2.5.1. Ich möchte the Deadbolt authorization system und Slick verwenden, um auf die Benutzerautorisierungsinformationen in meiner Datenbank zuzugreifen. Wie kann ich das machen? Deadbolt ist speziell für Play gemacht und Spiele mit out-of-the-box integriert Slick kommt, so sollte es, wenn nicht sehr einfach möglich sein.So integrieren Sie Play (Web-Framework), Deadbolt (Autorisierung) und Slick (Datenbankzugriff)
Basierend auf "Integrating Deadbolt" aus der Deadbolt-Dokumentation, erweiterte ich die DeadboltHandler
Eigenschaft. Seine abstrakte getSubject()
Methode scheint wie der Ort, um die Datenbankabfrage zu tun (so sagt the documentation, aber ohne Beispiel). Diese Methode erhält als Argument eine AuthenticatedRequest
und gibt die Subject
, im Wesentlichen die Benutzer-ID, die authentifiziert wurde, zusammen mit Rollen und Berechtigungen (Berechtigungen) zurück.
Ich stecke fest, denn während Play mit Slick integration kommt, beschreibt die Dokumentation nur, wie man es in einem Play-Controller verwendet. (Hinweis Ich wünsche dies mit Dependency Injection zu tun, da mit Hilfe der globalen Lookups sind veraltet und fehleranfällige)
Ich verwende erfolgreich Deadbolt in meinem Controller Zugriff auf bestimmte Ressourcen zu beschränken, sondern die Steuerung scheint, wie der falsche Platz für Deadbolt Datenbankabfragen für Autorisierungsdetails zu tun (wenn es so wäre, wäre DeadboltHandler
sinnlos). Der Controller Konstruktor Signaturdefinition sieht so etwas wie (Note der Controller greift auf die Standarddatenbank, die Web-Inhalte anstatt die Berechtigungsdatenbank speichert):
class Application @Inject()(
dbConfigProvider: DatabaseConfigProvider,
playConfig: play.api.Configuration,
deadbolt: DeadboltActions
) extends Controller {
, das funktioniert. Jedoch in ähnlicher Weise die DeadboltHandler
Erweiterung mit @Inject
Anmerkungen versehen Slick Zugriff auf die Datenbank nicht bereitstellt:
class AuthHandler @Inject()(@play.db.NamedDatabase("auth") dbConfigProvider: DatabaseConfigProvider)
extends DeadboltHandler {
wobei das Ergebnis
not enough arguments for constructor AuthHandler: (dbConfigProvider: play.api.db.slick.DatabaseConfigProvider)services.AuthHandler.
Unspecified value parameter dbConfigProvider.
Offensichtlich Spielen tut etwas Besonderes für Controller, so dass die @Inject
Annotation funktioniert, etwas, was ich nicht verstehe. Ich nehme an, es liegt in der Natur der Konstruktion von Controllern mit einem Injektor anstelle des Schlüsselwortes new
, aber meine Suche durch den Play Quellcode konnte mir nicht zeigen, was genau passiert. Wenn ich das finden könnte, könnte ich vielleicht diese Technik nachahmen, um eine DeadboltHandler
zu konstruieren.
Ich sehe, dass das Spiel kommt mit Klassen wie GuiceInjector und GuiceInjectorBuilder, die klingen, als ob sie ein Teil der Lösung sein könnten, aber mein Experiment hat mir immer noch nicht gezeigt, wie, und wenn es Dokumentation zur Verwendung gibt sie im spezifischen Kontext einer DeadboldHandler
Erweiterung, ich vermisse es.
Ich habe diese vorherige Frage gefunden: Scala (Play 2.4.x) How to call a class with @inject() annotation, die sehr auf den Punkt scheint. Leider ist es trotz eines halben Duzend Folgekommentars des ursprünglichen Posters noch unbeantwortet.Ich fühle mich, wenn ich die Antwort auf diese Frage hätte, würde ich die Antwort auf diese Frage hat, wenn meine Frage sehr spezifisch ist: Wie Wiedergabe verwendet und Deadbolt und Slick miteinander (in Scala).
Was mich am meisten verwirrt ist, dass dies scheint etwas, das genug sein sollte, dass es entweder in der Dokumentation erwähnt werden würde oder bereits auf SO gefragt worden. Wenn ich solche Hinweise nicht finde, bedeutet das normalerweise, dass ich etwas so Ungewöhnliches tue, dass niemand sonst jemals Gelegenheit hatte, darüber zu sprechen. Es scheint so, als ob es einfach genug sein sollte, dass ich optimistisch hoffe, dass ich etwas sehr Grundlegendes verpasse, und ich freue mich auf eine freundliche Seele, die mich über dieses Wissen informiert.
ich später eine vollständige Antwort aufschreiben werde, aber jetzt können Sie einen Blick auf https nehmen: // GitHub. com/schaloner/deadbolt-auth0-scala/blob/master/app/sicherheit/MyDeadboltHandler.scala # L37 und https://github.com/schaloner/deadbolt-auth0-scala/blob/master/app/security/AuthSupport. scala # L56 - In diesem Beispiel wird eine externe Identitätsverwaltungsplattform anstelle einer Datenbank verwendet. Sie sollten jedoch https://github.com/schaloner/deadbolt-auth0-scala/blob/master/app/security/AuthSupport neu schreiben können .scala # L105 an d verwende den größten Teil des Codes wie er ist. –
Du löst mich, segne dich Steve! Nehmen Sie so lange, wie Sie eine vollständige Antwort schreiben müssen; Sie haben ein korrektes Antwortzeichen, das auf Sie wartet. –