#1 2021-12-20 15:03:02

itatwork
Member
Registered: 2019-12-11

user variables mit LDAP-Daten

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

#2 2021-12-21 07:39:37

Tobias F
Administrator
Registered: 2020-02-07

Re: user variables mit LDAP-Daten

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

#3 2021-12-21 08:22:22

eduardo
Administrator
Registered: 2016-11-01
Website

Re: user variables mit LDAP-Daten

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

#4 2022-01-04 09:39:37

itatwork
Member
Registered: 2019-12-11

Re: user variables mit LDAP-Daten

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

#5 2022-01-04 13:43:38

eduardo
Administrator
Registered: 2016-11-01
Website

Re: user variables mit LDAP-Daten

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

#6 2022-01-05 09:06:53

itatwork
Member
Registered: 2019-12-11

Re: user variables mit LDAP-Daten

Danke Eduardo.

Da ich das kurzfristig einrichten muss, hast du noch ein Beispiel für die alte Version?

Gruß
Christoph

Offline

#7 2022-01-05 09:11:26

eduardo
Administrator
Registered: 2016-11-01
Website

Re: user variables mit LDAP-Daten

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

#8 2022-01-05 14:28:07

itatwork
Member
Registered: 2019-12-11

Re: user variables mit LDAP-Daten

Wo genau kommt dann das Mapping für das "AD-Feld" und die "User Variable" hin?

Gruß
Christoph

Offline

#9 2022-01-05 14:38:27

eduardo
Administrator
Registered: 2016-11-01
Website

Re: user variables mit LDAP-Daten

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

#10 2022-01-05 17:13:22

itatwork
Member
Registered: 2019-12-11

Re: user variables mit LDAP-Daten

mmh, ich kann jetzt keine Verbindung zu "myUserVar" und "mail" erkennen.
sorry, ich verstehe es noch nicht so ganz.

Gruß
Christoph

Offline

#11 2022-01-05 17:22:18

eduardo
Administrator
Registered: 2016-11-01
Website

Re: user variables mit LDAP-Daten

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

#12 2022-01-06 09:14:38

itatwork
Member
Registered: 2019-12-11

Re: user variables mit LDAP-Daten

Super, danke. Jetzt habe ich es verstanden.

Gruß
Christoph

Offline

#13 2022-01-06 10:28:15

itatwork
Member
Registered: 2019-12-11

Re: user variables mit LDAP-Daten

Eine Frage noch:

Gehört das noch in den Bereich von "public class LdapUserLoader {" oder kann das in einen extra Bereich?

Offline

#14 2022-01-06 11:26:42

eduardo
Administrator
Registered: 2016-11-01
Website

Re: user variables mit LDAP-Daten

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

#15 2022-01-13 11:36:57

itatwork
Member
Registered: 2019-12-11

Re: user variables mit LDAP-Daten

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

#16 2022-01-13 11:46:08

eduardo
Administrator
Registered: 2016-11-01
Website

Re: user variables mit LDAP-Daten

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

#17 2022-01-26 09:07:10

eduardo
Administrator
Registered: 2016-11-01
Website

Re: user variables mit LDAP-Daten

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

Board footer

Powered by FluxBB