Code Block |
---|
Kopierad till ny Wiki |
Skatteverket publicerar en skrift SKV 704 (upplaga 8 är senaste i skrivande stund) som beskriver hur personnummret är uppbyggt. I avsnittet "Personnummer i ADB-system" står följande:
...
Efter 'T' ska 'R' användas till dess samtliga tillgängliga interimspersonnummer med den bokstaven är slut för det aktuella datumet. Därefter används 'S', osv.
Konfiguration för Shibboleth
Info |
---|
Konfigurationerna under detta avsnitt fungerar endast för Shibboleth 2 eller senare. För simpleSAMLphp och ADFS2 kan konfigurationsexemplen endast användas som inspiration. |
Hur gör man om man har personnumret i 12 tecken men inte i LDAP-attributet norEduPersonNIN?
Förutsättning:
- Peronnummer Personnummer hämtas via attributet mittPersonnummer hämtas från källan myLDAP.
Code Block <resolver:AttributeDefinition id="norEduPersonNIN" xsi:type="Simple" xmlns="urn:mace:shibboleth:2.0:resolver:ad" sourceAttributeID="mittPersonnummer"> <resolver:Dependency ref="myLDAP" /> <resolver:AttributeEncoder xsi:type="SAML1String" xmlns="urn:mace:shibboleth:2.0:attribute:encoder" name="urn:mace:dir:attribute-def:norEduPersonNIN" /> <resolver:AttributeEncoder xsi:type="SAML2String" xmlns="urn:mace:shibboleth:2.0:attribute:encoder" name="urn:oid:1.3.6.1.4.1.2428.90.1.5" friendlyName="norEduPersonNIN" /> </resolver:AttributeDefinition>
Hur gör man om man har personnumret i 10 tecken och inte i LDAP-attributet norEduPersonNIN?
Förutsättningar:
- Peronnummer hämtas via attributet mittPersonnummer hämtas från källan myLDAP, anpassa efter behov.
- Personnumret kan vara både 10 och 12 siffror.
- Använder "sliding windows" utan offset för att dynamiskt hantera 2000-problemet.
- Loggningen i exemplet används av Stockholms universitet men behöver troligen anpassas utifrån det specifika lärosätets faktiska förutsättningar och behov.
Code Block |
---|
// Script to handle ten position wide national identity numbers // Create 12 position wide norEduPersonNIN from the attribute mittPersonnummer // Change mittPersonnummer to your NIN attribute name // The script is supplied by SU <resolver:AttributeDefinition id="norEduPersonNIN" xsi:type="Script" xmlns="urn:mace:shibboleth:2.0:resolver:ad" sourceAttributeID="mittPersonnummer"> <resolver:Dependency ref="myLDAP" /> <resolver:AttributeEncoder xsi:type="SAML1String" xmlns="urn:mace:shibboleth:2.0:attribute:encoder" name="urn:mace:dir:attribute-def:norEduPersonNIN" /> <resolver:AttributeEncoder xsi:type="SAML2String" xmlns="urn:mace:shibboleth:2.0:attribute:encoder" name="urn:oid:1.3.6.1.4.1.2428.90.1.5" friendlyName="norEduPersonNIN" /> <Script> <![CDATA[ // Script to handle ten position wide national identity numbers // The script is supplied by SU // import needed packages importPackage(Packages.edu.internet2.middleware.shibboleth.common.attribute.provider); importPackage(Packages.org.slf4j); // Setup a logger logger = LoggerFactory.getLogger("se.su.it.shibboleth.idp.ninDecorator"); //try the{ attribute which is to be populated // Get a ref norEduPersonNINto =the new BasicAttribute("norEduPersonNIN"); try {NIN received from ldap // GetChange amittPersonnummer ref to theyour SSNNIN receivedattribute from ldapname ssnnin=socialSecurityNumbermittPersonnummer.getValues().get(0); logger.debug("Doing decoration of ssnNIN " + ssn nin); // the attribute which is to be populated norEduPersonNIN = new BasicAttribute("norEduPersonNIN"); // Only do decoration of SSNsNINs which are on the format YYMMDDxxxx if(ssnnin.length() == 10) { // Create the two alternative return strings we have to choose between pnr19 = "19" + ssnnin; pnr20 = "20" + ssnnin; // Extract year/month/day from the SSNNIN string m_y = ssnnin.substring(0,2); m_m = ssnnin.substring(2,4); m_d = ssnnin.substring(4,6); // Create a Date object for the 20xx case datePnr = new Date("20" + m_y, m_m-1, m_d); // Create a Date object for the current date dateCur = new Date(); // Some debug logging logger.debug("pnr19: " + pnr19); logger.debug("pnr20: " + pnr20); logger.debug("datePnr: " + datePnr); logger.debug("dateCur: " + dateCur); // Verify the value of datePnr before proceeding if(isNaN(datePnr.valueOf())) { throw("Failed to parse the SSNNIN into a Date object"); } // If the 20xx case is in the future we assume 19xx for the NIN attribute if(datePnr>dateCur) { logger.info("Returning 19xx pnr since the 20xx case is in the future"); norEduPersonNIN.getValues().add(pnr19); } else { logger.info("Returning 20xx pnr since it is closer to current date than the 19xx one."); norEduPersonNIN.getValues().add(pnr20); } } else if(ssnnin.length() == 12) { logger.info("Returning pnr as-is since it contains 12 chars"); norEduPersonNIN.getValues().add(ssnnin); } else { throw("Not setting any norEduPersonNIN since it is bogus (length=" + ssnnin.length() + "): " + ssnnin); } } catch(err) { logger.error("Not setting any norEduPersonNIN due to exception: " + err); } ]]> </Script> </resolver:AttributeDefinition> |