In breve: la mia applicazione utilizza la versione 2.5.1 Play web framework. Voglio utilizzare the Deadbolt authorization system e Slick per accedere alle informazioni di autorizzazione dell'utente nel mio database. Come posso fare questo? Catenaccio è fatto appositamente per Gioca, e Gioca viene fornito con Slick integrato out-of-the-box, per cui dovrebbe essere possibile se non molto facile.Come integrare Play (framework web), Deadbolt (autorizzazione) e Slick (accesso al database)
In base a "Integrating Deadbolt" dalla documentazione di Deadbolt, ho esteso il tratto DeadboltHandler
. Il suo metodo astratto getSubject()
sembra il posto dove eseguire la query del database (così dice the documentation ma senza alcun esempio). Tale metodo riceve come argomento un AuthenticatedRequest
e restituisce lo Subject
, in pratica l'id utente che è stato autenticato, insieme a ruoli e permessi (autorizzazioni).
Sono bloccato, perché mentre Play viene fornito con Slick integration, la documentazione descrive solo come utilizzarlo da un controller di riproduzione. (nota Sono voler fare questo l'iniezione di dipendenza utilizzando in quanto utilizza le ricerche a livello mondiale è deprecato e soggetto a errori)
adesso utilizzo Catenaccio nel mio controller per limitare l'accesso a determinate risorse, ma il controller sembra il posto sbagliato per deadbolt per eseguire query di database per i dettagli di autorizzazione (se lo fosse, quindi lo DeadboltHandler
non avrebbe voluto). La definizione firma del costruttore del controller sembra qualcosa di simile (nota il controller accede al database predefinito che memorizza i contenuti web, piuttosto che il database delle autorizzazioni):
class Application @Inject()(
dbConfigProvider: DatabaseConfigProvider,
playConfig: play.api.Configuration,
deadbolt: DeadboltActions
) extends Controller {
che funziona. Tuttavia, allo stesso modo annotare l'estensione DeadboltHandler
con @Inject
non riesce a fornire Slick accesso al database:
class AuthHandler @Inject()(@play.db.NamedDatabase("auth") dbConfigProvider: DatabaseConfigProvider)
extends DeadboltHandler {
il risultato è
not enough arguments for constructor AuthHandler: (dbConfigProvider: play.api.db.slick.DatabaseConfigProvider)services.AuthHandler.
Unspecified value parameter dbConfigProvider.
Ovviamente, Gioca fa qualcosa di speciale per i controller in modo che il @Inject
funziona l'annotazione, qualcosa di cui mi manca la comprensione. Presumo che sia nella natura di costruire controllori usando un iniettore piuttosto che la parola chiave new
, ma la mia ricerca attraverso il codice sorgente non è riuscita a mostrarmi cosa sta succedendo esattamente. Se riuscissi a trovarlo, forse potrei imitare quella tecnica per costruire un DeadboltHandler
.
vedo che il gioco viene fornito con classi come GuiceInjector e GuiceInjectorBuilder, che suonano come se fossero parte della soluzione, ma la mia sperimentazione non è ancora riuscito a farmi vedere come, e se non v'è alcuna documentazione su come utilizzare loro nel contesto specifico di un'estensione DeadboldHandler
, mi manca.
Ho trovato questa domanda precedente: Scala (Play 2.4.x) How to call a class with @inject() annotation, che sembra molto sul punto. Sfortunatamente, nonostante una mezza dozzina di commenti di follow-up dal poster originale, non ha ancora ricevuto risposta.Mi sento se avessi la risposta a questa domanda che vorrei avere la risposta a questa domanda, anche se la mia domanda è molto specifica: come utilizzare gioco e Catenaccio e Slick uno con l'altro (in Scala).
Quello che mi confonde di più è che questo sembra qualcosa che dovrebbe essere abbastanza comune da essere menzionato nella documentazione o che è stato già chiesto riguardo a SO. Il fatto che non riesca a trovare tali riferimenti in genere significa che sto facendo qualcosa di talmente unico che nessun altro ha mai avuto occasione di parlarne. Certamente sembra che dovrebbe essere abbastanza semplice da sperare ottimisticamente che mi manchi qualcosa di molto semplice, e attendo con impazienza un'anima gentile che mi informi di questa conoscenza.
scriverò una risposta completa dopo, ma per ora si può dare un'occhiata a https: // GitHub. com/schaloner/deadbolt-auth0-scala/blob/master/app/security/MyDeadboltHandler.scala # L37 e https://github.com/schaloner/deadbolt-auth0-scala/blob/master/app/security/AuthSupport. scala # L56 - questo esempio utilizza una piattaforma di gestione delle identità esterna al posto di un database, ma dovresti essere in grado di riscrivere https://github.com/schaloner/deadbolt-auth0-scala/blob/master/app/security/AuthSupport .scala # L105 an d usare la maggior parte del codice così com'è. –
Mi hai lasciato, benedici Steve! Prendi tutto il tempo necessario per scrivere una risposta completa; hai un segno di risposta corretta che ti aspetta. –