Date: Thu, 28 Mar 2024 18:34:20 +0000 (UTC) Message-ID: <1248888746.6791.1711650860115@ip-10-10-7-29.ec2.internal> Subject: Exported From Confluence MIME-Version: 1.0 Content-Type: multipart/related; boundary="----=_Part_6790_770729530.1711650860111" ------=_Part_6790_770729530.1711650860111 Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable Content-Location: file:///C:/exported.html
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 J= DBC2 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 s= ubjects.
Here is a row from our table
Screen showing search result, membership listing, and tooltip
# Copyr= ight 2016 Internet2 # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # # Subject configuration # # The subject properties uses Grouper Configuration Overlays (documented on= wiki) # By default the configuration is read from subject.base.properties # (which should not be edited), and the subject.properties overlays # the base settings. See the subject.base.properties for the possible # settings that can be applied to the subject.properties # enter the location of the sources.xml. Must start with classpath: or fil= e: # blank means dont use sources.xml, use subject.properties # default is: classpath:sources.xml # e.g. file:/dir1/dir2/sources.xml subject.sources.xml.location =3D=20 ######################################### ## Configuration for source id: pennperson ## Source configName: pennperson ######################################### subjectApi.source.pennperson.id =3D pennperson # this is a friendly name for the source subjectApi.source.pennperson.name =3D Penn person # type is not used all that much. Can have multiple types, comma separate.= Can be person, group, application subjectApi.source.pennperson.types =3D person # the adapter class implements the interface: edu.internet2.middleware.subj= ect.Source # adapter class must extend: edu.internet2.middleware.subject.provider.Base= SourceAdapter # edu.internet2.middleware.grouper.subj.GrouperJdbcSourceAdapter2 : if do= ing JDBC this should be used if possible. All subject data in one table/vi= ew. # edu.internet2.middleware.grouper.subj.GrouperJdbcSourceAdapter : oldes= t JDBC source. Put freeform queries in here # edu.internet2.middleware.grouper.subj.GrouperJndiSourceAdapter : used = for LDAP subjectApi.source.pennperson.adapterClass =3D edu.internet2.middleware.subj= ect.provider.JDBCSourceAdapter2 subjectApi.source.pennperson.param.maxPageSize.value =3D 100 # edu.internet2.middleware.subject.provider.C3p0JdbcConnectionProvider (def= ault) # edu.internet2.middleware.subject.provider.DbcpJdbcConnectionProvider (leg= acy)=20 # edu.internet2.middleware.grouper.subj.GrouperJdbcConnectionProvider=20 # (same settings as grouper.hibernate.properties, the driver, url, pass, ma= xActive, maxIdle, maxWait are forbidden subjectApi.source.pennperson.param.jdbcConnectionProvider.value =3D edu.int= ernet2.middleware.grouper.subj.GrouperJdbcConnectionProvider # the table or view to query results from. Note, could prefix with a schem= a name subjectApi.source.pennperson.param.dbTableOrView.value =3D person_source_v # the column name to get the subjectId from subjectApi.source.pennperson.param.subjectIdCol.value =3D penn_id # the column name to get the name from subjectApi.source.pennperson.param.nameCol.value =3D name subjectApi.source.pennperson.param.descriptionCol.value =3D description # search col where general searches take place, lower case subjectApi.source.pennperson.param.lowerSearchCol.value =3D description_low= er # optional col if you want the search results sorted in the API (note, UI m= ight override) subjectApi.source.pennperson.param.defaultSortCol.value =3D description # you can count up from 0 to N of columns to search by identifier (which mi= ght also include by id) subjectApi.source.pennperson.param.subjectIdentifierCol0.value =3D pennname # you can count up from 0 to N of columns to search by identifier (which mi= ght also include by id) subjectApi.source.pennperson.param.subjectIdentifierCol1.value =3D penn_id # you can count up from 0 to N of columns to search by identifier (which mi= ght also include by id) subjectApi.source.pennperson.param.subjectIdentifierCol2.value =3D eppn # now you can count up from 0 to N of attributes for various cols. The nam= e is how to reference in subject.getAttribute() subjectApi.source.pennperson.param.subjectAttributeCol0.value =3D pennname # you can count up from 0 to N of attributes for various cols. The name is= how to reference in subject.getAttribute() subjectApi.source.pennperson.param.subjectAttributeName0.value =3D PENNNAME # now you can count up from 0 to N of attributes for various cols. The nam= e is how to reference in subject.getAttribute() subjectApi.source.pennperson.param.subjectAttributeCol1.value =3D email # you can count up from 0 to N of attributes for various cols. The name is= how to reference in subject.getAttribute() subjectApi.source.pennperson.param.subjectAttributeName1.value =3D EMAIL # now you can count up from 0 to N of attributes for various cols. The nam= e is how to reference in subject.getAttribute() subjectApi.source.pennperson.param.subjectAttributeCol2.value =3D eppn # you can count up from 0 to N of attributes for various cols. The name is= how to reference in subject.getAttribute() subjectApi.source.pennperson.param.subjectAttributeName2.value =3D EPPN # now you can count up from 0 to N of attributes for various cols. The nam= e is how to reference in subject.getAttribute() subjectApi.source.pennperson.param.subjectAttributeCol3.value =3D first_nam= e # you can count up from 0 to N of attributes for various cols. The name is= how to reference in subject.getAttribute() subjectApi.source.pennperson.param.subjectAttributeName3.value =3D FIRST_NA= ME # now you can count up from 0 to N of attributes for various cols. The nam= e is how to reference in subject.getAttribute() subjectApi.source.pennperson.param.subjectAttributeCol4.value =3D last_name # you can count up from 0 to N of attributes for various cols. The name is= how to reference in subject.getAttribute() subjectApi.source.pennperson.param.subjectAttributeName4.value =3D LAST_NAM= E # now you can count up from 0 to N of attributes for various cols. The nam= e is how to reference in subject.getAttribute() subjectApi.source.pennperson.param.subjectAttributeCol5.value =3D email_pub= lic # you can count up from 0 to N of attributes for various cols. The name is= how to reference in subject.getAttribute() subjectApi.source.pennperson.param.subjectAttributeName5.value =3D EMAIL_PU= BLIC # now you can count up from 0 to N of attributes for various cols. The nam= e is how to reference in subject.getAttribute() subjectApi.source.pennperson.param.subjectAttributeCol6.value =3D name_firs= t_public # you can count up from 0 to N of attributes for various cols. The name is= how to reference in subject.getAttribute() subjectApi.source.pennperson.param.subjectAttributeName6.value =3D NAME_FIR= ST_PUBLIC # now you can count up from 0 to N of attributes for various cols. The nam= e is how to reference in subject.getAttribute() subjectApi.source.pennperson.param.subjectAttributeCol7.value =3D name_last= _public # you can count up from 0 to N of attributes for various cols. The name is= how to reference in subject.getAttribute() subjectApi.source.pennperson.param.subjectAttributeName7.value =3D NAME_LAS= T_PUBLIC # now you can count up from 0 to N of attributes for various cols. The nam= e is how to reference in subject.getAttribute() subjectApi.source.pennperson.param.subjectAttributeCol8.value =3D name_publ= ic # you can count up from 0 to N of attributes for various cols. The name is= how to reference in subject.getAttribute() subjectApi.source.pennperson.param.subjectAttributeName8.value =3D NAME_PUB= LIC # now you can count up from 0 to N of attributes for various cols. The nam= e is how to reference in subject.getAttribute() subjectApi.source.pennperson.param.subjectAttributeCol9.value =3D preferred= _first_name # you can count up from 0 to N of attributes for various cols. The name is= how to reference in subject.getAttribute() subjectApi.source.pennperson.param.subjectAttributeName9.value =3D PREFERRE= D_FIRST_NAME # now you can count up from 0 to N of attributes for various cols. The nam= e is how to reference in subject.getAttribute() subjectApi.source.pennperson.param.subjectAttributeCol10.value =3D descript= ion_lower # you can count up from 0 to N of attributes for various cols. The name is= how to reference in subject.getAttribute() subjectApi.source.pennperson.param.subjectAttributeName10.value =3D DESCRIP= TION_LOWER # the 1st sort attribute for lists on screen that are derived from member t= able (e.g. search for member in group) # you can have up to 5 sort attributes=20 subjectApi.source.pennperson.param.sortAttribute0.value =3D DESCRIPTION_LOW= ER # the 2nd sort attribute for lists on screen that are derived from member t= able (e.g. search for member in group) # you can have up to 5 sort attributes=20 subjectApi.source.pennperson.param.sortAttribute1.value =3D LAST_NAME # the 1st search attribute for lists on screen that are derived from member= table (e.g. search for member in group) # you can have up to 5 search attributes=20 subjectApi.source.pennperson.param.searchAttribute0.value =3D DESCRIPTION_L= OWER # list your identifiers here by attribute subjectApi.source.pennperson.param.subjectIdentifierAttribute0.value=3DPENN= NAME subjectApi.source.pennperson.param.subjectIdentifierAttribute1.value=3DEPPN
# Copyr= ight 2016 Internet2 # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # # Subject configuration # # The subject properties uses Grouper Configuration Overlays (documented on= wiki) # By default the configuration is read from subject.base.properties # (which should not be edited), and the subject.properties overlays # the base settings. See the subject.base.properties for the possible # settings that can be applied to the subject.properties # enter the location of the sources.xml. Must start with classpath: or fil= e: # blank means dont use sources.xml, use subject.properties # default is: classpath:sources.xml # e.g. file:/dir1/dir2/sources.xml subject.sources.xml.location =3D=20 ######################################### ## Configuration for source id: pennperson ## Source configName: pennperson ######################################### subjectApi.source.pennperson.id =3D pennperson # this is a friendly name for the source subjectApi.source.pennperson.name =3D Penn person # type is not used all that much. Can have multiple types, comma separate.= Can be person, group, application subjectApi.source.pennperson.types =3D person # the adapter class implements the interface: edu.internet2.middleware.subj= ect.Source # adapter class must extend: edu.internet2.middleware.subject.provider.Base= SourceAdapter # edu.internet2.middleware.grouper.subj.GrouperJdbcSourceAdapter2 : if do= ing JDBC this should be used if possible. All subject data in one table/vi= ew. # edu.internet2.middleware.grouper.subj.GrouperJdbcSourceAdapter : oldes= t JDBC source. Put freeform queries in here # edu.internet2.middleware.grouper.subj.GrouperJndiSourceAdapter : used = for LDAP subjectApi.source.pennperson.adapterClass =3D edu.internet2.middleware.subj= ect.provider.JDBCSourceAdapter2 subjectApi.source.pennperson.param.maxPageSize.value =3D 100 # edu.internet2.middleware.subject.provider.C3p0JdbcConnectionProvider (def= ault) # edu.internet2.middleware.subject.provider.DbcpJdbcConnectionProvider (leg= acy)=20 # edu.internet2.middleware.grouper.subj.GrouperJdbcConnectionProvider=20 # (same settings as grouper.hibernate.properties, the driver, url, pass, ma= xActive, maxIdle, maxWait are forbidden subjectApi.source.pennperson.param.jdbcConnectionProvider.value =3D edu.int= ernet2.middleware.subject.provider.C3p0JdbcConnectionProvider # e.g. mysql: jdbc:mysql://localhost:3306/grouper # e.g. p6spy (log sql): [use the URL that your DB requires] # e.g. oracle: jdbc:oracle:thin:@server.school.edu:1521:sid # e.g. hsqldb (a): jdbc:hsqldb:dist/run/grouper;create=3Dtrue # e.g. hsqldb (b): jdbc:hsqldb:hsql://localhost:9001 # e.g. postgres: jdbc:postgresql:grouper subjectApi.source.pennperson.param.dbUrl.value =3D jdbc:mysql://localhost:3= 306/grouper # username when connecting to the database subjectApi.source.pennperson.param.dbUser.value =3D sa # password when connecting to the database (or file with encrypted password= inside) subjectApi.source.pennperson.param.dbPwd.value =3D whatever # the table or view to query results from. Note, could prefix with a schem= a name subjectApi.source.pennperson.param.dbTableOrView.value =3D person_source_v # the column name to get the subjectId from subjectApi.source.pennperson.param.subjectIdCol.value =3D penn_id # the column name to get the name from subjectApi.source.pennperson.param.nameCol.value =3D name subjectApi.source.pennperson.param.descriptionCol.value =3D description # search col where general searches take place, lower case subjectApi.source.pennperson.param.lowerSearchCol.value =3D description_low= er # optional col if you want the search results sorted in the API (note, UI m= ight override) subjectApi.source.pennperson.param.defaultSortCol.value =3D description # you can count up from 0 to N of columns to search by identifier (which mi= ght also include by id) subjectApi.source.pennperson.param.subjectIdentifierCol0.value =3D pennname # you can count up from 0 to N of columns to search by identifier (which mi= ght also include by id) subjectApi.source.pennperson.param.subjectIdentifierCol1.value =3D penn_id # you can count up from 0 to N of columns to search by identifier (which mi= ght also include by id) subjectApi.source.pennperson.param.subjectIdentifierCol2.value =3D eppn # now you can count up from 0 to N of attributes for various cols. The nam= e is how to reference in subject.getAttribute() subjectApi.source.pennperson.param.subjectAttributeCol0.value =3D pennname # you can count up from 0 to N of attributes for various cols. The name is= how to reference in subject.getAttribute() subjectApi.source.pennperson.param.subjectAttributeName0.value =3D PENNNAME # now you can count up from 0 to N of attributes for various cols. The nam= e is how to reference in subject.getAttribute() subjectApi.source.pennperson.param.subjectAttributeCol1.value =3D email # you can count up from 0 to N of attributes for various cols. The name is= how to reference in subject.getAttribute() subjectApi.source.pennperson.param.subjectAttributeName1.value =3D EMAIL # now you can count up from 0 to N of attributes for various cols. The nam= e is how to reference in subject.getAttribute() subjectApi.source.pennperson.param.subjectAttributeCol2.value =3D eppn # you can count up from 0 to N of attributes for various cols. The name is= how to reference in subject.getAttribute() subjectApi.source.pennperson.param.subjectAttributeName2.value =3D EPPN # now you can count up from 0 to N of attributes for various cols. The nam= e is how to reference in subject.getAttribute() subjectApi.source.pennperson.param.subjectAttributeCol3.value =3D first_nam= e # you can count up from 0 to N of attributes for various cols. The name is= how to reference in subject.getAttribute() subjectApi.source.pennperson.param.subjectAttributeName3.value =3D FIRST_NA= ME # now you can count up from 0 to N of attributes for various cols. The nam= e is how to reference in subject.getAttribute() subjectApi.source.pennperson.param.subjectAttributeCol4.value =3D last_name # you can count up from 0 to N of attributes for various cols. The name is= how to reference in subject.getAttribute() subjectApi.source.pennperson.param.subjectAttributeName4.value =3D LAST_NAM= E # now you can count up from 0 to N of attributes for various cols. The nam= e is how to reference in subject.getAttribute() subjectApi.source.pennperson.param.subjectAttributeCol5.value =3D email_pub= lic # you can count up from 0 to N of attributes for various cols. The name is= how to reference in subject.getAttribute() subjectApi.source.pennperson.param.subjectAttributeName5.value =3D EMAIL_PU= BLIC # now you can count up from 0 to N of attributes for various cols. The nam= e is how to reference in subject.getAttribute() subjectApi.source.pennperson.param.subjectAttributeCol6.value =3D name_firs= t_public # you can count up from 0 to N of attributes for various cols. The name is= how to reference in subject.getAttribute() subjectApi.source.pennperson.param.subjectAttributeName6.value =3D NAME_FIR= ST_PUBLIC # now you can count up from 0 to N of attributes for various cols. The nam= e is how to reference in subject.getAttribute() subjectApi.source.pennperson.param.subjectAttributeCol7.value =3D name_last= _public # you can count up from 0 to N of attributes for various cols. The name is= how to reference in subject.getAttribute() subjectApi.source.pennperson.param.subjectAttributeName7.value =3D NAME_LAS= T_PUBLIC # now you can count up from 0 to N of attributes for various cols. The nam= e is how to reference in subject.getAttribute() subjectApi.source.pennperson.param.subjectAttributeCol8.value =3D name_publ= ic # you can count up from 0 to N of attributes for various cols. The name is= how to reference in subject.getAttribute() subjectApi.source.pennperson.param.subjectAttributeName8.value =3D NAME_PUB= LIC # now you can count up from 0 to N of attributes for various cols. The nam= e is how to reference in subject.getAttribute() subjectApi.source.pennperson.param.subjectAttributeCol9.value =3D preferred= _first_name # you can count up from 0 to N of attributes for various cols. The name is= how to reference in subject.getAttribute() subjectApi.source.pennperson.param.subjectAttributeName9.value =3D PREFERRE= D_FIRST_NAME # now you can count up from 0 to N of attributes for various cols. The nam= e is how to reference in subject.getAttribute() subjectApi.source.pennperson.param.subjectAttributeCol10.value =3D descript= ion_lower # you can count up from 0 to N of attributes for various cols. The name is= how to reference in subject.getAttribute() subjectApi.source.pennperson.param.subjectAttributeName10.value =3D DESCRIP= TION_LOWER # the 1st sort attribute for lists on screen that are derived from member t= able (e.g. search for member in group) # you can have up to 5 sort attributes=20 subjectApi.source.pennperson.param.sortAttribute0.value =3D DESCRIPTION_LOW= ER # the 2nd sort attribute for lists on screen that are derived from member t= able (e.g. search for member in group) # you can have up to 5 sort attributes=20 subjectApi.source.pennperson.param.sortAttribute1.value =3D LAST_NAME # the 1st search attribute for lists on screen that are derived from member= table (e.g. search for member in group) # you can have up to 5 search attributes=20 subjectApi.source.pennperson.param.searchAttribute0.value =3D DESCRIPTION_L= OWER