Seite 1 von 1
Automatische Anmeldung an der DB
Verfasst: Fr 12. Feb 2016, 08:57
von Dami
… um das Thema aus
http://www.libreoffice-forum.de/viewtop ... 10&t=15855
ein wenig anders auszurollen und unabhängig von irgendwelchen Sicherheitsaspekten,
ist es möglich sich mit der DB (zB.: Postgres) durch ein Makro
mit Passwort und Userkennung zu verbinden/anzumelden
Code: Alles auswählen
SUB open_main_form
oController= ThisDatabaseDocument.CurrentController
IF oController.DataSource.IsPasswordRequired THEN
oController.DataSource.User = "User"
oController.DataSource.Password = "Password"
END IF
IF NOT ( oController.isConnected() ) THEN
oController.connect()
END IF
ThisDatabaseDocument.formdocuments.getbyname("Start").open
END SUB
... dem Ereigniss "Dokument öffnen" zugewiesen, öffnet es das Formular "Start"
wie hier schon mehrfach beschrieben
Re: Automatische Anmeldung an der DB
Verfasst: Fr 12. Feb 2016, 10:16
von gogo
klar, aber Du musst über die (angemeldete) Datenquelle gehen.
die zentralen Befehle wären:
Code: Alles auswählen
DatabaseContext = createUnoService("com.sun.star.sdb.DatabaseContext")
DataSource = DatabaseContext.getByName("Datenbankname")
DataSource.GetConnection("MeinName","pAssWoRt")
Ein etwas längeres Listing:
(Wesentlich sind die Zeilen "DataSource.USER = sUser" und "DataSource.Password = sPasswd")
Einen Passwort-Dialog brauchst Du auch noch außer Du möchtest immer mit demselben Benutzernamen und Passwort verbinden, dann kannst Du den ganzen Abschnitt von "' holt zumindest irgendwas aus der Verbindung" bis "DataSource.Password = sPasswd" weglassen und "goConnection = DataSource.GetConnection(sUser,sPasswd)" durch "goConnection = DataSource.GetConnection("Benutzer","geheimesPasswort")" ersetzen.
Die Zuweisung der Connection zur globalen Variable goConnection hat den Vorteil, dass Du diese später nutzen kannst, und ein SQL-Statement dann einfach mit Statement=goConnection.createStatement erzeugt wird.
Code: Alles auswählen
Global goConnection
Global go_Dlg_Passwort
sub DatenbankStarten(optional oEvent)
if not VerbindungHerstellen("NameDerRegistriertenDatenbank") then
if not ismissing(oEvent) then
on error resume next
' eigene Sub in einem anderen Modul, das die Datenbank "von aussen" korrekt schliesst
call SUB_DatenbankSchliessen(oEvent, 1500)
on error goto EH
msgbox "Verbindung zur Datenbank konnte nicht hergestellt werden, die Anwendung wird beendet!"
else
msgbox "Verbindung zur Datenbank konnte nicht hergestellt werden! Bitte die Anwendung manuell beenden!"
end if
end if
end sub
function VerbindungHerstellen(sMyRegDB)
on erhror goto EH
dim DatabaseContext, DataSource, Connection
dim InteractionHandler
dim sUser, sPasswd
VerbindungHerstellen = false
DatabaseContext = createUnoService("com.sun.star.sdb.DatabaseContext")
if NOT DatabaseContext.hasByName(sMyRegDB) then
msgbox "Datenquelle " & sMyRegDB & " wurde NICHT gefunden! - daher Abbruch!"
exit function
end if
DataSource = DatabaseContext.getByName(sMyRegDB)
' holt zumindest irgendwas aus der Verbindung1
sUser=cstr(DataSource.USER)
sPasswd=cstr(DataSource.Password)
if sPasswd = "" then sUser=""
PasswortDialog:
if NOT DLG_Passwort(sUser, sPasswd) Then exit function
if sUser = "" OR sPasswd = "" then
if msgbox("Benutzername und Passwort muessen angegeben werden! - Noch eine Versuch?", 4) = 6 then
goto PasswortDialog
else
exit function
end if
end if
DataSource.USER = sUser
DataSource.Password = sPasswd
goConnection = DataSource.GetConnection(sUser,sPasswd)
if DataSource.getConnection(DataSource.USER, DataSource.Password).isClosed = true then
msgbox sMyRegDB & "-Verbindung ist derzeit - warum auch immer - Schrott!"
exit function
end if
VerbindungHerstellen = true
exit function
EH:
call EH
if msgbox("Verbindung zu " & sMyRegDB & " schliessen?",4) = 6 then Connection.release
end function
Function DLG_Passwort(sUser, sPasswd, optional sDatenquelle)
dim DialogWert, i
DLG_Passwort = false
i=0
If (Not ThisComponent.DialogLibraries.isLibraryLoaded("Standard")) Then
ThisComponent.DialogLibraries.LoadLibrary("Standard")
End If
go_Dlg_Passwort = CreateUnoDialog(Dialoglibraries.Standard.Dlg_Passwort)
' manchmal dauert's ein bisschen bis der Dialog geladen wurde - daher diese Schleife
do while (NOT isobject(go_Dlg_Passwort)) AND ( i < 100 )
i=i+1
wait 100
loop
go_Dlg_Passwort.GetControl("BenName").setText(sUser)
go_Dlg_Passwort.GetControl("Passwd").setText(sPasswd)
DialogWert = go_Dlg_Passwort.execute()
if DialogWert = 1 then ' ueberprueft ob ueberhaupt etwas ausgewaehlt wurde
DLG_Passwort = true
sUser = go_Dlg_Passwort.GetControl("BenName").Text
sPasswd = go_Dlg_Passwort.GetControl("Passwd").Text
end if
go_Dlg_Passwort.dispose()
end Function
Re: Automatische Anmeldung an der DB
Verfasst: Fr 12. Feb 2016, 17:00
von RobertG
Hallo *,
das folgende Verfahren geht auch ohne angemeldete Datenbank:
Code: Alles auswählen
oDatasource = thisDatabaseDocument.CurrentController.DataSource
oConnection = oDatasource.getConnection("username","password")
Datenbanken melde ich in der Regel nicht an. Und da sowieso beim Öffnen des Dokumentes noch keine Verbindung für die Base-Datei besteht, kann ich mir eine IF-Abfrage doch sparen, oder?
Abgesehen davon: Wenn ich Nutzername und Passwort bereits in die Datenbank in den Makrocode rein schreibe, dann sollte ich den Makrocode wenigstens durch ein Passwort sichern. Ich weiß nicht, wie das einmal funktioniert hat. Ich habe nur davon gelesen, dass der Passwortschutz zur Zeit defekt ist.
Folgerung: Ich kann mir auch gleich das Passwort für den entsprechenden Nutzer in der Datenbank sparen ...
Gruß
Robert
Re: Automatische Anmeldung an der DB
Verfasst: Fr 12. Feb 2016, 17:40
von gogo
Dem CurrentController vertraue ich nicht - bei falschen Passworteingaben und sonstigen Verbindungsproblemen war das immer zu instabil - kann aber sein, dass er bei der embedded HSQLDB gut funktioniert.
Re: Automatische Anmeldung an der DB
Verfasst: Fr 12. Feb 2016, 19:32
von RobertG
Hallo gogo,
ich habe das mit einer externen MariaDB getestet, die eben so eine Passworteingabe erforderte. Nur einmal getestet, nicht intensiv. Ich würde sowieso keine Passwörter in der Datenbankdatei hinterlegen.
Gruß
Robert
Re: Automatische Anmeldung an der DB
Verfasst: Di 1. Mär 2016, 15:55
von scientific
RobertG hat geschrieben:Hallo gogo,
ich habe das mit einer externen MariaDB getestet, die eben so eine Passworteingabe erforderte. Nur einmal getestet, nicht intensiv. Ich würde sowieso keine Passwörter in der Datenbankdatei hinterlegen.
Gruß
Robert
Ich steh auch grad vor dem Problem, dass ich für ein Skript, welches Outlook- oder auch Google-Calendar-Events bearbeitet irgendwo Credentials hinterlegen muss...
LO-Base ruft ein Python-Skript auf, welches sich dann gegen den Outlook- bzw. Google-Server authentifiziert...
Wie macht man so etwas "richtig"?
Das Eintragen/Ändern von Events auf einen Exchange-Server klappt schon. In die Google-Api arbeite ich mich gerade ein.
Aber ich hab echt keine Ahnung, wie ich das in LO korrekterweise mit der Authentifizierung löse, sodass ich die Login-Credentials nicht im Klartext hinterlegen muss (derzeit liegen die probehalber in einer Tabelle in der hsqldb)
lg scientific