You are not logged in.
Pages: 1
Hallo zusammen,
kann man eine angelegte "user variable" mit LDAP-Daten via LDAP-Import füttern (z.B. "department" vom AD) ?
Oder funktioniert das nur mit den Feldern in den "user properties" wie "First name" ?
Gruß
Christoph
Offline
Hallo,
ja. Das funktioniert. Schau dir mal hier den Beispiel-Code an: https://github.com/infofabrik/reportser … admin/ldap
Du musst die PROPERTY_ATTRIBUTES um die gewünschten LDAP Attribute erweitern (siehe ldapimport.groovy).
Hier eine Liste der LDAP Attribute: https://www.computerperformance.co.uk/l … directory/
Gruß
Tobias
Offline
Hi Christoph,
und zum Speichern der UserVariable mit den neuen Daten kannst Du die Services hier benutzen: net.datenwerke.rs.uservariables.service.uservariables.UserVariableService
Du kannst im LDAP Skript alle RS-Services nutzen wie gewohnt, da es sich um ein Skript handelt.
Gruss
Eduardo
Offline
Hallo zusammen,
vielen Dank für die Antworten.
@Tobias Hast du da ein Beispiel wie das im "ldapimport.groovy" aussehen soll?
Ich würde zum Beispiel "department" aus dem AD in eine "user variable" importieren.
Gruß
Christoph
Offline
Hallo Christoph,
im nächsten ReportServer werden wir voraussichtlich LDAP direkt unterstützen, d.h. es wird ein LdapService geben. Hier haben wir ein Hooker eingebaut (LdapNodePostProcessHook), was Dir erlaubt, irgendetwas mit den Nodes (Users, Groups, OUs) nach dem Import zu machen. In Deinem Fall würdest Du bei den Users eine UserVariable setzen.
Ein Beispiel haben wir hier hochgeladen (postProcessNode): https://github.com/infofabrik/reportser … ker.groovy
Da die Version noch nicht veröffentlicht ist, kannst Du diesen Hook noch nicht benutzen. Aber im Beispiel siehst Du bereits alles, was Du dafür benötigst. Am wichtigsten ist:
def allUserVarDefs = userVarService.getDefinedVariableDefinitions()
allUserVarDefs.each{
userVarDef ->
if (! userVarDef.name.equals(userVar) ) return
def userVarInstance = null
if (userVarService.hasVariableInstance(node, userVarDef)) {
// retrieve instance
userVarInstance = userVarService.getVariableInstanceForUser(node, userVarDef)
} else {
// create instance
userVarInstance = userVarDef.createVariableInstance()
userVarInstance.setFolk node
userVarService.persist userVarInstance
}
userVarInstance.setValue ldapService.getStringAttribute(searchResult, ldapProp)
}
was genau das macht: setzt eine UserVariable mit dem Wert einer LDAP Property.
ldapService.getStringAttribute(searchResult, ldapProp) ist analog wie im legacy-Skript definiert (https://github.com/infofabrik/reportser … ort.groovy) :
private String getStringAttribute(SearchResult sr, String attributeName) throws NamingException{
try{
return sr.getAttributes().get(attributeName).get().toString();
}catch(Exception e){
logger.log(Level.WARNING,"failed to retrieve attribute '" + attributeName + "' from " + sr.getNameInNamespace(), e);
return null;
}
}
Viele Grüße
Eduardo
Offline
Danke Eduardo.
Da ich das kurzfristig einrichten muss, hast du noch ein Beispiel für die alte Version?
Gruß
Christoph
Offline
Hi Christoph,
siehe mein obiges Beispiel. Im Beispiel-Skript hast Du alles, was du in der aktuellen Version benötigst. Nämlich das:
def allUserVarDefs = userVarService.getDefinedVariableDefinitions()
allUserVarDefs.each{
userVarDef ->
if (! userVarDef.name.equals(userVar) ) return
def userVarInstance = null
if (userVarService.hasVariableInstance(node, userVarDef)) {
// retrieve instance
userVarInstance = userVarService.getVariableInstanceForUser(node, userVarDef)
} else {
// create instance
userVarInstance = userVarDef.createVariableInstance()
userVarInstance.setFolk node
userVarService.persist userVarInstance
}
userVarInstance.setValue ldapService.getStringAttribute(searchResult, ldapProp)
}
Das musst Du in dein aktuelles ldapimport.groovy Skript integrieren/anpassen.
Grüße
Eduardo
Offline
Wo genau kommt dann das Mapping für das "AD-Feld" und die "User Variable" hin?
Gruß
Christoph
Offline
Hallo Christoph,
hier werden diese definiert:
// the userVariable you want to set. The user variable definition must exist.
def userVar = 'myUserVar'
// the LDAP property to read. It must exist in your LDAP installation.
def ldapProp = 'mail'
Mapping:
if (userVarService.hasVariableInstance(node, userVarDef)) {
..
userVarInstance.setValue ldapService.getStringAttribute(searchResult, ldapProp)
Gruss,
Eduardo
Offline
mmh, ich kann jetzt keine Verbindung zu "myUserVar" und "mail" erkennen.
sorry, ich verstehe es noch nicht so ganz.
Gruß
Christoph
Offline
Hi Christoph,
1. def userVar = 'myUserVar'
-> so heißt Deine UserVariable
2. def ldapProp = 'mail'
-> so heißt Deine LDAP Property
3. def allUserVarDefs = userVarService.definedVariableDefinitions
-> so holst Du alle UserVariablen die es gibt
4. allUserVarDefs.each{ userVarDef ->
-> Für alle UserVariablen die es gibt:
5. if (! userVarDef.name.equals(userVar) ) return
-> holen wir nur die, die wie "userVar" heißt, also hier holen wir die "richtige" UserVariable
6. if (userVarService.hasVariableInstance(node, userVarDef)) {
-> falls der User diese UserVariable bereits besitzt
7. userVarInstance = userVarService.getVariableInstanceForUser(node, userVarDef)
-> holt sie
Ansonsten:
8. userVarInstance = userVarDef.createVariableInstance()
-> erstellt sie und setzt den User
9. userVarInstance.setValue ldapService.getStringAttribute(searchResult, ldapProp)
-> Hier setzt er den Wert, den er im LDAP findet, zu der richtigen UserVariable
Das mapping ist also im 1, 2, 5, und 9
Gruss
Eduardo
Offline
Super, danke. Jetzt habe ich es verstanden.
Gruß
Christoph
Offline
Eine Frage noch:
Gehört das noch in den Bereich von "public class LdapUserLoader {" oder kann das in einen extra Bereich?
Offline
Hi Christoph,
das kannst Du in der createUserNode() Methode integrieren, da Du hier Zugriff auf die User-Nodes hast.
Z.b. hier https://github.com/infofabrik/reportser … roovy#L346
Gruss
Eduardo
Offline
Wie lade ich diese Klasse?
error message: No such property: userVarService for class: ldap.LdapUserLoader
Wahrscheinlich mit "net.datenwerke.rs.uservariables.service.uservariables.UserVariableService", oder?
Wenn ja, ich in welcher Config muss das rein?
Gruß
Christoph
Last edited by itatwork (2022-01-13 11:40:14)
Offline
Hi Christoph,
du musst diesen Service analog wie UserManagerService definieren (https://github.com/infofabrik/reportser … groovy#L34)
Dann musst du den Service im Konstruktor vom LdapUserLoader übergeben damit er auch in der Klasse verfügbar ist. Den UserManagerService übergeben wir dagegen nicht, da er in der Klasse nicht benötigt wird.
Der Import ist net.datenwerke.rs.uservariables.service.uservariables.UserVariableService , richtig.
Gruss
Eduardo
Offline
Hi Christoph,
wir haben gestern RS 4.0.0 veröffentlicht: https://forum.reportserver.net/viewtopic.php?id=2940
Hier kannst du die eingebaute ldapimport Funktionalität verwenden inkl. UserVariablen-Skript: https://github.com/infofabrik/reportser … ker.groovy
Hier die LDAP Doku: https://reportserver.net/en/guides/conf … roperties/
Grüße
Eduardo
Offline
Pages: 1