Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

Table of Contents

Indledning

Det primære formål med MinLogProducer biblioteket er at udstille et Java-API som NSP komponenter kan anvende til at lave MinLog2 registreringer via. Dette dokument beskriver tilgængelighed af modulet samt anvendelse.

...

Biblioteket består af 2 moduler. Begge biblioteker findes som moduler på platformen. Det betyder at de . Som anvender er det kun nødvendigt med kendskab til et af modulerne. Det er modulet minlog-producer-api. Dette skal inkluderes som provided in i pom.xml og tilføjes som en dependency i jboss-deployment-structure.xml.

...

Dette bibliotek indeholder api og interface definitioner samt ServiceLoader implementeret i form af klassen RegisterServiceProvider. Det er det eneste bibliotek der er brug for at inkludere i sit projekt.

POM groupId: dk.nsp.minlog

POM artifactId: minlog-producer-api

Wildfly modul navn: dk.sds.nsp.minlog.api.nsp.minlog.producer.api

Eksempel på inkludering i pom.xml

Code Block
languagexml
<dependency>
	<groupId>dk.nsp.minlog</groupId>
	<artifactId>minlog-producer-api</artifactId>
	<version>${minlog.producer.version}</version>
	<scope>provided</scope>
</dependency>

Minlog-producer-registration

Dette bibliotek indeholder implementering af interface defineret i minlog-producer-api biblioteket.

POM groupId: dk.nsp.minlog

POM artifactId: minlog-producer-registration

Wildfly modul navn: dk.sds.nsp.minlog.producer

Dette bibliotek har en afhængighed til minlog-producer-api biblioteket, så det er kun nødvendigt at anvende dette bibliotek i sit projekt.

Eksempel på inkludering i pom.xml

Bemærk at under normale omstændigheder er det ikke nødvendigt at inkludere dette modul i sit komponent.

Code Block
<dependency>
	<groupId>dk.nsp.minlog</groupId>
	<artifactId>minlog-producer-registration</artifactId>
	<version>${minlog.producer.version}</version>
	<scope>provided</scope>
</dependency>

API Beskrivelse og anvendelse

Anvendelse af API sker primært gennem to klasser og en række POJO klasser.

RegisterServiceProvider

Dette er service provider klassen. Den definerer en enkelt statisk metode og denne metode skal kaldes for at få en instans af RegisterService. Metoden man skal kalde hedder getRegisterService().

Hvis man kalder getRegisterService() metoden UDEN at have minlog-producer-registration på sin classpath så får man en test implementering af RegisterService. Denne udgave sender IKKE data til MinLog og validerer heller ikke input. Den logger udelukkende kald til via log4j. Afvikling i en NSP Wildfly container vil altid indeholde minlog-producer-registration på classpath.

RegisterService

Når man har anvendt RegisterServiceProvider til at få en implementering af RegisterService er der 4 metoder man kan kalde.

MetodesignaturBeskrivelse
void init(String topic, Properties

...

kafkaProperties)

Denne metode skal kaldes inden man kalder andre metoder.
Hvis man ikke

...

gør dette, får man en exception. Første argument (topic) er det Kafka topic, der skal anvendes. De properties, der skal angives som

...

argument (kafkaProperties), er dem, der kan anvendes til at konfigurere en KafkaProducer.

RegistrationResult addRegistrations(List<LogEntry> logEntries)

Denne metode kaldes for at registrere i MinLog.
Argumentet indeholder en liste af LogEntry objekter, som repræsenterer de data, der skal registreres i MinLog. RegistrationResult er resultatet af registreringen.

void flush()

Sørger for at kalde flush() på KafkaProducer.
Metoden skal kaldes

...

hver gang, man

...

vil sikre sig at kald til addRegistrations() er persisteret i Kafka.

void close()Kaldes når servicen ikke længere skal bruges. Sørger for pænt at lukke forbindelsen til Kafka osv.

LogEntry

Source

Destination

I forbindelse med version 3 af Seal.java er det besluttet at opdele koden, så den bliver fordelt i flere moduler. Det gøres bl.a. for at undgå at serviceudbydere behøver at hente al Seal.java koden ned, hvis man kun har behøv for at udstille en DGWS service.

Serviceudbydere kan desuden hente DGWS og IDWS modulerne uden at de samtidigt får WSS4J med ned, da dette modul, for nogen har givet store problemer.

...

2.1. Seal-common

Indeholder kode som bruges på tværs af IDWS og DGWS (og evt. fremtidige formater).

2.2. Seal-dgws

Indeholder den kode som en serviceudbyder behøver for at kunne udstille en DGWS service.

2.3. Seal-idws

Indeholder den kode, som en serviceudbyder behøver for at kunne udstille en IDWS service.

2.4. Seal-common-exchange

Koden som bruges til billetomveksling for både DGWS og IDWS.

2.5. Seal-dgws-exchange

Bruges hvis man ønsker at billetomveksle DGWS.

Dette gælder f.eks. JWTToOIOSAMLAssertion, OIOSAMLAssertionToIDCard og IDCardToOIOSAMLAssertion

2.6. Seal-idws-exchange

Bruges hvis man ønsker at billetomveksle IDWS.

Dette gælder f.eks. OIOBootstrapToIdentityToken, JWTToIdentityToken og EncryptedOIOSAMLAssertionToIdentityToken

2.7. Seal-sts

Bruges af STS, og det indeholder alt fra ovenståense moduler og et par ekstra klasser.

2.8. Seal-testtools

Bruger Seal-sts til at kunne lave tests mod alle modulerne

3. Snitfladeændringer

For at kunne lave opdelingen i moduler har vi været nød til at lave nogle ændringer til snitfladen.

3.1. SOSIFactory

SOSIFactory findes nu i 3 udgaver:

  • dk.sosi.seal.common.SOSIFactory
    Findes i Seal-common modulet og indeholder primært konstant værdier og simple get metoder.
  • dk.sosi.seal.dgws.SOSIFactory
    Findes i Seal-dgws modulet og indeholder alt fra dk.sosi.seal.common.SOSIFactory. Derudover indeholder klassen metoder som ikke har med signering af Id-kort.
  • dk.sosi.seal.SOSIFactory
    Findes i Seal-dgws-exhange modulet og indeholder alt fra dk.sosi.seal.dgws.SOSIFactory. Og så har den metoder til kopiere VOCES til signeret Id-kort.

Eksempel

blahh eksempel på anvendelse

4. Biblioteker

4.1. Standard SOSI-factory

...

4.2. IDWSH-factory

Fra version 2.1 inkluderer Seal.Java nu IDWSHFactory. Version 2.1 markerer begyndelsen af IDWSH-support. Det formodes at fremdidige versioner af Seal.Java vil udvide support og arbejdsgang ved hjælp af IDWSH.
Seal.Java 2.1 understøtter kun IDWSH IdentityToken. Strømmen til konstruktion og anvendelse af IdentityToken er vist nedenstående figur.

IDWSH Identity  token workflowImage Removed

4.3. OIOSAML-factory

I Seal 2.1.4 blev OIOSAMLFactory introduceret, som giver funktionalitet til at oprette, analysere, underskrive og validere OIOWS-Trust-meddelelser, der bruges ved udveksling af OIOSAML-påstande, der er udstedt af og IdP til SOSI IDCards.

4.4. OIOIDWS-factory

Siden Seal 2.5.10 understøttes OIO IDWS.

...

5. Federations

Når SOSIFactory er oprettet, er det let at komme i gang. Overvej følgende kodestykker, der indeholder kode til opbygning af en anmodning (request) som sendes til en tjenesteudbyder (Service provider).

5.1. Service Consumer

...

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

...

Properties properties = ...;
SOSITestFederation testFederation = new SOSITestFederation(properties);
CredentialVault credentialVault = ...; // construct or resolve credentialvault here
 
SOSIFactory factory = new SOSIFactory(testFederation, credentialVault, properties);
Request request = factory.createNewRequest(
        false, // don’t require non-repudiation receipt
        null // Optional flow-ID (not used here)
);
 
IDCard idCard = ...; // resolve ID-card here
 
request.setIDCard(idCard);
 
Element body = ...; // build body DOM element here
request.setBody(body);
 
Document domDocument = request.serialize2DOMDocument();
String xml = XmlUtil.node2String(domDocument, false, true);
//Send xml to Service provider here

PropertyFilter

Lille hjælper klasse, man kan anvende til at filtrere properties, så de kan anvendes til init metoden i RegisterService.

MetodesignaturBeskrivelse
Properties fitlerProperties(String prefix, Properties kafkaProperties)Denne metode kan anvendes til at filtrere kafkaProperties, så der kun returneres de properties, der matcher det prefix, der er angivet. Prefix er fjernet fra properties, der returneres.

LogEntry

Dette svarer til et LogDataEntry element i https://www.nspop.dk/display/public/web/MinLog2+-+Min+Log+Registrering+-+Guide+til+anvendere#MinLog2MinLogRegistreringGuidetilanvendere-Request og der henvises derfor til dette dokument.

Source

Dette svarer til et Source element i https://www.nspop.dk/display/public/web/MinLog2+-+Min+Log+Registrering+-+Guide+til+anvendere#MinLog2MinLogRegistreringGuidetilanvendere-Request og der henvises derfor til dette dokument.

Destination

Dette svarer til et Destination element i https://www.nspop.dk/display/public/web/MinLog2+-+Min+Log+Registrering+-+Guide+til+anvendere#MinLog2MinLogRegistreringGuidetilanvendere-Request og der henvises derfor til dette dokument.

For OrganisationIdSrc anbefales det at anvende den set metode der tager en enum som argument, hvis dette er muligt.

Eksempel

Nedenstående er et eksempel på hvordan man anvender biblioteket.

Application.propertiees

Code Block
languagetext
# Kafka
kafka.producer.bootstrap.servers=kafka:9092
kafka.producer.client.id=MinLog2-producer
kafka.producer.key.serializer=org.apache.kafka.common.serialization.StringSerializer
kafka.producer.value.serializer=org.apache.kafka.common.serialization.StringSerializer
kafka.topic=MIT_TOPIC


Kode

Code Block
languagejava
// Load and filter properties
Properties properties = new Properties();
properties.load(RegisterServiceImplTest.class.getResourceAsStream("/application.properties"));

Properties filterProperties = new PropertyFilter().filterProperties("kafka.producer.", properties);

// Opret instans
RegisterService registerService = RegisterServiceProvider.getRegisterService();
registerService.init(properties.get("kafka.topic"), filterProperties);

// Send data til MinLog
RegistrationResult result = registerService.addRegistrations(createLogEntryList());
registerService.flush();
if(result.getNumberFailed() > 0) {
	// Håndter fejlede registreringer her. 
}

// Send flere data til MinLog. Dette kunne f.eks. være en anden transaktion.
registerService.addRegistrations(createLogEntryList());
registerService.flush();
if(result.getNumberFailed() > 0) {
	// Håndter fejlede registreringer her. 
}

// Luk service. F.eks. når applikationen stoppes.
registerService.close();

Det reelle arbejde ligger i følgende linier:

Linie 1: Specificering af egenskaber for SOSI, se senere for reference til SOSI-egenskaber
Linie 3: Opbygge/finde instans af Credential Vault.
Linie 11:  Opbygge/finde instans af ID-kort.
Linie 15: Opbygning af indhold til XML
Linie 20: Sende XML til  serviceprovider

5.2. Service  Provider

På den "anden side" hos serviceudbyderen bruges biblioteket således. Også her håndterer udvikleren kun ting, der er relateret til forretningsopgaven.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29

Properties properties = ...;
Federation federation = new SOSIFederation(properties);
CredentialVault credentialVault = ...; // construct or resolve credentialvault here
SOSIFactory factory = new SOSIFactory(federation, credentialVault, properties);
 
// This implicitely verifies the STS signature on the ID card etc.
Request request = factory.deserializeRequest(xml);
 
IDCard idCard = request.getIDCard();
 
// use ID card attributes for authorization here
 
Element body = request.getBody();
 
// use information in body for business logic here
 
Reply reply = factory.createNewReply(
        request,    // dgws version and”In response to” ID
        null        // Optional flow-ID set to null
);
 
reply.setIDCard(idCard);
 
Element replyBody = ...; // build reply body DOM element here
reply.setBody(replyBody);
 
Document domDocument = reply.serialize2DOMDocument();
String replyXML = XmlUtil.node2String(domDocument, false, true);
// Send replyXML to Service provider here

...