You are viewing an old version of this page. View the current version.

Compare with Current View Page History

« Previous Version 10 Next »

Penn is not a big LDAP shop, we have a person database, so we decided to have a feed from there to the Grouper DB into a subject table.  The JDBC2 subject source provides more powerful querying (and we contributed it!) so we are using that.  We have about 600k subjects.  Generally we try not to take subjects out of resolvability once they are resolvable subjects.

Here is a row from our table




Screen showing search result, membership listing, and tooltip

 

 

 

Attributes

  • SubjectID is PennID which is an 8 digit opaque number which does not change or get reassigned
  • Our subject identifiers are pennkey (netId), and EPPN
  • The name is the name which puts all the name pieces together
  • The description is a long form of the name which we show in search results.  This takes a lot of logic to produce, it is the name, pennkey, pennid, if active, description of primary affiliation, and listing of short forms of other affiliations.  This is so descriptive to assure that someone using Grouper does not pick the wrong person.  There are privacy issues which we address by using information from the user which they display in the authenticated directory, and we clamp down on which users can access the UI
  • We have some subject attributes to help applications which are Grouper enabled get access to user attributes.  Things like name, email, eppn, etc.
  • The search field for the source is the description in lower-case.

Sync process

  • We wrote a Java daemon which runs on real time and nightly to compute the subject source table
  • There is a change log on the source table which we use to know which rows to recalculate real time
  • We calculate all in batch at night to sync up discrepancies.  This takes several hours.  We only update records which need updating.

Configuration

Here is out config in the sources.xml

 <source adapterClass="edu.internet2.middleware.subject.provider.JDBCSourceAdapter2">
    <id>pennperson</id>
    <name>Penn person</name>
     <type>person</type>
     <!-- init-param>
       <param-name>maxResults</param-name>
       <param-value>1000</param-value>
     </init-param -->
    <!-- on a findPage() this is the most results returned --> 
    <init-param>
      <param-name>maxPageSize</param-name>
      <param-value>100</param-value>
    </init-param>
     <init-param>
       <param-name>jdbcConnectionProvider</param-name>
       <param-value>edu.internet2.middleware.grouper.subj.GrouperJdbcConnectionProvider</param-value>
     </init-param>
      <init-param>
       <param-name>dbTableOrView</param-name>
       <param-value>person_source_v</param-value>
     </init-param>
      <init-param>
       <param-name>subjectIdCol</param-name>
       <param-value>penn_id</param-value>
     </init-param>
     <init-param>
       <param-name>nameCol</param-name>
       <param-value>name</param-value>
     </init-param>
     <init-param>
       <param-name>descriptionCol</param-name>
       <param-value>description</param-value>
     </init-param>
     <init-param>
       <!-- search col where general searches take place, lower case -->
       <param-name>lowerSearchCol</param-name>
       <param-value>description_lower</param-value>
     </init-param>
     <init-param>
       <!-- optional col if you want the search results sorted in the API (note, UI might override) -->
       <param-name>defaultSortCol</param-name>
       <param-value>description</param-value>
     </init-param>
     <init-param>
       <!-- col which identifies the row, perhaps not subjectId -->
       <param-name>subjectIdentifierCol0</param-name>
       <param-value>pennname</param-value>
     </init-param>
     <init-param>
       <param-name>subjectIdentifierCol1</param-name>
       <param-value>penn_id</param-value>
     </init-param>
     <init-param>
       <param-name>subjectIdentifierCol2</param-name>
       <param-value>eppn</param-value>
     </init-param>
     <!-- now you can count up from 0 to N of attributes for various cols -->
     <init-param>
       <param-name>subjectAttributeCol0</param-name>
       <param-value>pennname</param-value>
     </init-param>
     <init-param>
       <param-name>subjectAttributeName0</param-name>
       <param-value>PENNNAME</param-value>
     </init-param>
     <init-param>
       <param-name>subjectAttributeCol1</param-name>
       <param-value>email</param-value>
     </init-param>
     <init-param>
       <param-name>subjectAttributeName1</param-name>
       <param-value>EMAIL</param-value>
     </init-param>
     <init-param>
       <param-name>subjectAttributeCol2</param-name>
       <param-value>eppn</param-value>
     </init-param>
     <init-param>
       <param-name>subjectAttributeName2</param-name>
       <param-value>EPPN</param-value>
     </init-param>

     <init-param>
       <param-name>subjectAttributeCol3</param-name>
       <param-value>first_name</param-value>
     </init-param>
     <init-param>
       <param-name>subjectAttributeName3</param-name>
       <param-value>FIRST_NAME</param-value>
     </init-param>

     <init-param>
       <param-name>subjectAttributeCol4</param-name>
       <param-value>last_name</param-value>
     </init-param>
     <init-param>
       <param-name>subjectAttributeName4</param-name>
       <param-value>LAST_NAME</param-value>
     </init-param>

     <init-param>
       <param-name>subjectAttributeCol5</param-name>
       <param-value>email_public</param-value>
     </init-param>
     <init-param>
       <param-name>subjectAttributeName5</param-name>
       <param-value>EMAIL_PUBLIC</param-value>
     </init-param>

     <init-param>
       <param-name>subjectAttributeCol6</param-name>
       <param-value>name_first_public</param-value>
     </init-param>
     <init-param>
       <param-name>subjectAttributeName6</param-name>
       <param-value>NAME_FIRST_PUBLIC</param-value>
     </init-param>

     <init-param>
       <param-name>subjectAttributeCol7</param-name>
       <param-value>name_last_public</param-value>
     </init-param>
     <init-param>
       <param-name>subjectAttributeName7</param-name>
       <param-value>NAME_LAST_PUBLIC</param-value>
     </init-param>

     <init-param>
       <param-name>subjectAttributeCol8</param-name>
       <param-value>name_public</param-value>
     </init-param>
     <init-param>
       <param-name>subjectAttributeName8</param-name>
       <param-value>NAME_PUBLIC</param-value>
     </init-param>

     <init-param>
       <param-name>subjectAttributeCol9</param-name>
       <param-value>preferred_first_name</param-value>
     </init-param>
     <init-param>
       <param-name>subjectAttributeName9</param-name>
       <param-value>PREFERRED_FIRST_NAME</param-value>
     </init-param>

     <init-param>
       <param-name>subjectAttributeCol10</param-name>
       <param-value>description_lower</param-value>
     </init-param>
     <init-param>
       <param-name>subjectAttributeName10</param-name>
       <param-value>DESCRIPTION_LOWER</param-value>
     </init-param>

     <init-param>
       <param-name>sortAttribute0</param-name>
       <param-value>DESCRIPTION_LOWER</param-value>
     </init-param>
     <init-param>
       <param-name>sortAttribute1</param-name>
       <param-value>LAST_NAME</param-value>
     </init-param>

     <init-param>
       <param-name>searchAttribute0</param-name>
       <param-value>DESCRIPTION_LOWER</param-value>
     </init-param>

   </source>

sfd

  • No labels