Skip to content
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Commit 16d645b

Browse files
committedNov 26, 2024··
Ansattgrupper kan oversstyres fra Env
1 parent b6715ff commit 16d645b

File tree

17 files changed

+279
-164
lines changed

17 files changed

+279
-164
lines changed
 
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package no.nav.vedtak.sikkerhet.kontekst;
2+
3+
public enum AnsattGruppe {
4+
5+
SAKSBEHANDLER,
6+
BESLUTTER,
7+
OVERSTYRER,
8+
OPPGAVESTYRER,
9+
VEILEDER,
10+
DRIFTER,
11+
FORTROLIG, // Aka Kode7
12+
STRENGTFORTROLIG, // Aka Kode6
13+
SKJERMET // Aka EgenAnsatt
14+
15+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,140 @@
1+
package no.nav.vedtak.sikkerhet.kontekst;
2+
3+
import java.io.IOException;
4+
import java.util.Arrays;
5+
import java.util.LinkedHashMap;
6+
import java.util.List;
7+
import java.util.Map;
8+
import java.util.Objects;
9+
import java.util.Optional;
10+
import java.util.Properties;
11+
import java.util.Set;
12+
import java.util.UUID;
13+
import java.util.stream.Collectors;
14+
15+
import org.slf4j.Logger;
16+
import org.slf4j.LoggerFactory;
17+
18+
import no.nav.foreldrepenger.konfig.Environment;
19+
20+
public class AnsattGruppeProvider {
21+
22+
private static final Logger LOG = LoggerFactory.getLogger(AnsattGruppeProvider.class);
23+
private static final Environment ENV = Environment.current();
24+
private static final String SUFFIX = ".properties";
25+
26+
private static final Map<AnsattGruppe, String> PROPERTY_NAME = Map.of(
27+
AnsattGruppe.SAKSBEHANDLER, "gruppe.oid.saksbehandler",
28+
AnsattGruppe.BESLUTTER, "gruppe.oid.beslutter",
29+
AnsattGruppe.OVERSTYRER, "gruppe.oid.overstyrer",
30+
AnsattGruppe.VEILEDER, "gruppe.oid.veileder",
31+
AnsattGruppe.OPPGAVESTYRER, "gruppe.oid.oppgavestyrer",
32+
AnsattGruppe.DRIFTER, "gruppe.oid.drifter",
33+
AnsattGruppe.FORTROLIG, "gruppe.oid.fortrolig",
34+
AnsattGruppe.STRENGTFORTROLIG, "gruppe.oid.strengtfortrolig",
35+
AnsattGruppe.SKJERMET, "gruppe.oid.skjermet"
36+
);
37+
38+
private static final Map<String, AnsattGruppe> PROPERTY_NAME_REVERSE = PROPERTY_NAME.entrySet().stream()
39+
.collect(Collectors.toMap(Map.Entry::getValue, Map.Entry::getKey));
40+
41+
private static AnsattGruppeProvider INSTANCE;
42+
43+
private final Map<AnsattGruppe, UUID> ansattGruppeOid = new LinkedHashMap<>();
44+
private final Map<UUID, AnsattGruppe> oidAnsattGruppe = new LinkedHashMap<>();
45+
46+
47+
private AnsattGruppeProvider() {
48+
this(init());
49+
}
50+
51+
private AnsattGruppeProvider(Map<AnsattGruppe, UUID> gruppeOidMap) {
52+
this.ansattGruppeOid.putAll(gruppeOidMap);
53+
gruppeOidMap.forEach((k,v) -> oidAnsattGruppe.put(v, k));
54+
}
55+
56+
public static synchronized AnsattGruppeProvider instance() {
57+
var inst = INSTANCE;
58+
if (inst == null) {
59+
inst = new AnsattGruppeProvider();
60+
INSTANCE = inst;
61+
}
62+
return INSTANCE;
63+
}
64+
65+
public UUID getAnsattGruppeOid(AnsattGruppe gruppe) {
66+
return ansattGruppeOid.get(gruppe);
67+
}
68+
69+
public AnsattGruppe getAnsattGruppeFra(String value) {
70+
return Optional.ofNullable(value).map(AnsattGruppeProvider::safeUuidFraString).map(this::getAnsattGruppeFra).orElse(null);
71+
}
72+
73+
public Set<AnsattGruppe> getAnsattGrupperFraStrings(List<String> values) {
74+
return values.stream().map(this::getAnsattGruppeFra).filter(Objects::nonNull).collect(Collectors.toSet());
75+
}
76+
77+
public AnsattGruppe getAnsattGruppeFra(UUID value) {
78+
return Optional.ofNullable(value).map(oidAnsattGruppe::get).orElse(null);
79+
}
80+
81+
public Set<AnsattGruppe> getAnsattGrupperFra(List<UUID> values) {
82+
return values.stream().map(this::getAnsattGruppeFra).filter(Objects::nonNull).collect(Collectors.toSet());
83+
}
84+
85+
static String getPropertyNavn(AnsattGruppe ansattGruppe) {
86+
return PROPERTY_NAME.get(ansattGruppe);
87+
}
88+
89+
90+
private static Map<AnsattGruppe, UUID> init() {
91+
Map<AnsattGruppe, UUID> resultat = new LinkedHashMap<>();
92+
lesFraResource(getInfix(), new Properties())
93+
.forEach((k, v) -> resultat.put(PROPERTY_NAME_REVERSE.get(k.toString()), UUID.fromString(v.toString())));
94+
resultat.putAll(lesFraEnv());
95+
return resultat;
96+
}
97+
98+
private static Map<AnsattGruppe, UUID> lesFraEnv() {
99+
Map<AnsattGruppe, UUID> resultat = new LinkedHashMap<>();
100+
Arrays.stream(AnsattGruppe.values())
101+
.forEach(ag -> Optional.ofNullable(PROPERTY_NAME.get(ag)).map(ENV::getProperty).map(AnsattGruppeProvider::safeUuidFraString)
102+
.ifPresent(e -> resultat.put(ag, e)));
103+
return resultat;
104+
}
105+
106+
private static Properties lesFraResource(String infix, Properties p) {
107+
if (infix == null) {
108+
return p;
109+
}
110+
String navn = AnsattGruppeProvider.class.getSimpleName().toLowerCase() + infix + SUFFIX;
111+
try (var is = AnsattGruppeProvider.class.getResourceAsStream(navn)) {
112+
if (is != null) {
113+
LOG.info("Laster groups fra {}", navn);
114+
p.load(is);
115+
return p;
116+
}
117+
} catch (IOException e) {
118+
LOG.info("Propertyfil {} ikke lesbar", navn);
119+
}
120+
LOG.info("Propertyfil {} ikke funnet", navn);
121+
return p;
122+
}
123+
124+
private static String getInfix() {
125+
var cluster = Environment.current().getCluster();
126+
if (cluster.isLocal()) {
127+
return "-vtp";
128+
}
129+
return cluster.isProd() ? "-prod" : "-dev";
130+
}
131+
132+
private static UUID safeUuidFraString(String string) {
133+
try {
134+
return UUID.fromString(string);
135+
} catch (Exception e) {
136+
return null;
137+
}
138+
}
139+
140+
}

‎felles/kontekst/src/main/java/no/nav/vedtak/sikkerhet/kontekst/Groups.java

-13
This file was deleted.

‎felles/kontekst/src/main/java/no/nav/vedtak/sikkerhet/kontekst/GroupsProvider.java

-93
This file was deleted.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
gruppe.oid.saksbehandler=27e77109-fef2-48ce-a174-269074490353
2+
gruppe.oid.beslutter=6e31f9db-7e46-409d-809c-143d3863e4f6
3+
gruppe.oid.overstyrer=542269ee-090b-4017-bbcc-6791580290ac
4+
gruppe.oid.oppgavestyrer=e6508a2a-2e74-450e-ad24-eb1b2b4625c6
5+
gruppe.oid.veileder=8cddda87-0a22-4d35-9186-a2c32a6ab450
6+
gruppe.oid.drifter=f1b82579-c5b5-4617-9673-8ace5ff67f63
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
gruppe.oid.saksbehandler=73107205-17ec-4a07-a56e-e0a8542f90c9
2+
gruppe.oid.beslutter=237ec744-da1f-455b-a794-b2d59c7ce7ee
3+
gruppe.oid.overstyrer=8200240e-d76d-4d48-a655-728d1d8c3641
4+
gruppe.oid.oppgavestyrer=1a59da27-4c55-4a9d-8480-6abd1a856cd2
5+
gruppe.oid.veileder=77f05833-ebfd-45fb-8be7-88eca8e7418f
6+
gruppe.oid.drifter=0d226374-4748-4367-a38a-062dcad70034
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
gruppe.oid.saksbehandler=eb211c0d-9ca6-467f-8863-9def2cc06fd3
2+
gruppe.oid.beslutter=803b1fd5-27a0-46a2-b1b3-7152f44128b4
3+
gruppe.oid.overstyrer=503f0cae-5bcd-484b-949c-a7e92d712858
4+
gruppe.oid.oppgavestyrer=d18989ec-5e07-494b-ad96-0c1f0c76de53
5+
gruppe.oid.veileder=edfe14fe-9a34-4ecb-8840-536ac2bc2818
6+
gruppe.oid.drifter=89c71f0c-ca57-4e6f-8545-990f9e24c762

‎felles/kontekst/src/main/resources/no/nav/vedtak/sikkerhet/kontekst/groupsprovider-dev.properties

-6
This file was deleted.

‎felles/kontekst/src/main/resources/no/nav/vedtak/sikkerhet/kontekst/groupsprovider-prod.properties

-6
This file was deleted.

‎felles/kontekst/src/main/resources/no/nav/vedtak/sikkerhet/kontekst/groupsprovider-vtp.properties

-6
This file was deleted.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
package no.nav.vedtak.sikkerhet.kontekst;
2+
3+
import static org.assertj.core.api.Assertions.assertThat;
4+
5+
import java.util.List;
6+
import java.util.Set;
7+
8+
import org.junit.jupiter.api.AfterEach;
9+
import org.junit.jupiter.api.BeforeEach;
10+
import org.junit.jupiter.api.Test;
11+
12+
/**
13+
* Tester at environment tar presedens over oids fra bundlete ressursfiler
14+
*/
15+
class AnsattGruppeProviderEnvTest {
16+
17+
public void setupAll() {
18+
System.setProperty(AnsattGruppeProvider.getPropertyNavn(AnsattGruppe.BESLUTTER), "6e31f9db-7e46-409d-809c-143d3863e4f6");
19+
System.setProperty(AnsattGruppeProvider.getPropertyNavn(AnsattGruppe.OVERSTYRER), "542269ee-090b-4017-bbcc-6791580290ac");
20+
}
21+
22+
@BeforeEach
23+
public void setUp() {
24+
setupAll();
25+
}
26+
27+
@AfterEach
28+
public void teardown() {
29+
System.clearProperty(AnsattGruppeProvider.getPropertyNavn(AnsattGruppe.BESLUTTER));
30+
System.clearProperty(AnsattGruppeProvider.getPropertyNavn(AnsattGruppe.OVERSTYRER));
31+
}
32+
33+
34+
@Test
35+
void testStringGroupsForLocal() {
36+
var provider = AnsattGruppeProvider.instance();
37+
assertThat(provider.getAnsattGruppeOid(AnsattGruppe.BESLUTTER)).isNotNull();
38+
assertThat(provider.getAnsattGruppeOid(AnsattGruppe.BESLUTTER).toString()).isEqualTo("6e31f9db-7e46-409d-809c-143d3863e4f6");
39+
assertThat(provider.getAnsattGruppeFra("89c71f0c-ca57-4e6f-8545-990f9e24c762")).isEqualTo(AnsattGruppe.DRIFTER);
40+
var grupper = List.of("eb211c0d-9ca6-467f-8863-9def2cc06fd3", "542269ee-090b-4017-bbcc-6791580290ac");
41+
assertThat(provider.getAnsattGrupperFraStrings(grupper)).containsAll(Set.of(AnsattGruppe.SAKSBEHANDLER, AnsattGruppe.OVERSTYRER));
42+
43+
assertThat(provider.getAnsattGruppeFra((String) null)).isNull();
44+
assertThat(provider.getAnsattGruppeFra("forsvarer")).isNull();
45+
assertThat(provider.getAnsattGrupperFraStrings(List.of("forsvarer"))).isEmpty();
46+
}
47+
48+
49+
50+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
package no.nav.vedtak.sikkerhet.kontekst;
2+
3+
import static org.assertj.core.api.Assertions.assertThat;
4+
5+
import java.util.List;
6+
import java.util.Set;
7+
import java.util.UUID;
8+
9+
import org.junit.jupiter.api.Test;
10+
11+
class AnsattGruppeProviderTest {
12+
13+
@Test
14+
void testStringGroupsForLocal() {
15+
var provider = AnsattGruppeProvider.instance();
16+
assertThat(provider.getAnsattGruppeOid(AnsattGruppe.BESLUTTER)).isNotNull();
17+
assertThat(provider.getAnsattGruppeOid(AnsattGruppe.BESLUTTER).toString()).isEqualTo("803b1fd5-27a0-46a2-b1b3-7152f44128b4");
18+
assertThat(provider.getAnsattGruppeFra("89c71f0c-ca57-4e6f-8545-990f9e24c762")).isEqualTo(AnsattGruppe.DRIFTER);
19+
var grupper = List.of("eb211c0d-9ca6-467f-8863-9def2cc06fd3", "503f0cae-5bcd-484b-949c-a7e92d712858");
20+
assertThat(provider.getAnsattGrupperFraStrings(grupper)).containsAll(Set.of(AnsattGruppe.SAKSBEHANDLER, AnsattGruppe.OVERSTYRER));
21+
22+
assertThat(provider.getAnsattGruppeFra((String) null)).isNull();
23+
assertThat(provider.getAnsattGruppeFra("forsvarer")).isNull();
24+
assertThat(provider.getAnsattGrupperFraStrings(List.of("forsvarer"))).isEmpty();
25+
}
26+
27+
@Test
28+
void testUuidGroupsForLocal() {
29+
var provider = AnsattGruppeProvider.instance();
30+
assertThat(provider.getAnsattGruppeOid(AnsattGruppe.BESLUTTER)).isNotNull();
31+
assertThat(provider.getAnsattGruppeOid(AnsattGruppe.BESLUTTER)).isEqualTo(UUID.fromString("803b1fd5-27a0-46a2-b1b3-7152f44128b4"));
32+
assertThat(provider.getAnsattGruppeFra(UUID.fromString("89c71f0c-ca57-4e6f-8545-990f9e24c762"))).isEqualTo(AnsattGruppe.DRIFTER);
33+
var grupper = List.of(UUID.fromString("eb211c0d-9ca6-467f-8863-9def2cc06fd3"), UUID.fromString("503f0cae-5bcd-484b-949c-a7e92d712858"));
34+
assertThat(provider.getAnsattGrupperFra(grupper)).containsAll(Set.of(AnsattGruppe.SAKSBEHANDLER, AnsattGruppe.OVERSTYRER));
35+
36+
assertThat(provider.getAnsattGruppeFra((UUID) null)).isNull();
37+
assertThat(provider.getAnsattGruppeFra(UUID.fromString("eb211c0d-9ca6-467f-8863-9def2cc06fd4"))).isNull();
38+
assertThat(provider.getAnsattGrupperFra(List.of(UUID.fromString("eb211c0d-9ca6-467f-8863-9def2cc06fd4")))).isEmpty();
39+
}
40+
41+
42+
}

‎felles/kontekst/src/test/java/no/nav/vedtak/sikkerhet/kontekst/GroupsProviderTest.java

-26
This file was deleted.

‎felles/oidc/src/main/java/no/nav/vedtak/sikkerhet/kontekst/RequestKontekst.java

+5-5
Original file line numberDiff line numberDiff line change
@@ -12,16 +12,16 @@ public final class RequestKontekst extends BasisKontekst {
1212

1313
private final OpenIDToken token;
1414
private UUID oid;
15-
private final Set<Groups> grupper;
15+
private final Set<AnsattGruppe> grupper;
1616

17-
private RequestKontekst(String uid, String kompaktUid, IdentType identType, String consumerId, OpenIDToken token, UUID oid, Set<Groups> grupper) {
17+
private RequestKontekst(String uid, String kompaktUid, IdentType identType, String consumerId, OpenIDToken token, UUID oid, Set<AnsattGruppe> grupper) {
1818
super(SikkerhetContext.REQUEST, uid, kompaktUid, identType, consumerId);
1919
this.token = token;
2020
this.oid = oid;
2121
this.grupper = new HashSet<>(grupper);
2222
}
2323

24-
public static RequestKontekst forRequest(String uid, String kompaktUid, IdentType identType, OpenIDToken token, UUID oid, Set<Groups> grupper) {
24+
public static RequestKontekst forRequest(String uid, String kompaktUid, IdentType identType, OpenIDToken token, UUID oid, Set<AnsattGruppe> grupper) {
2525
var konsumentId = Optional.ofNullable(MDCOperations.getConsumerId()).orElse(uid);
2626
return new RequestKontekst(uid, kompaktUid, identType, konsumentId, token, oid, grupper);
2727
}
@@ -34,11 +34,11 @@ public UUID getOid() {
3434
return oid;
3535
}
3636

37-
public Set<Groups> getGrupper() {
37+
public Set<AnsattGruppe> getGrupper() {
3838
return grupper;
3939
}
4040

41-
public boolean harGruppe(Groups gruppe) {
41+
public boolean harGruppe(AnsattGruppe gruppe) {
4242
return grupper.contains(gruppe);
4343
}
4444
}

‎felles/oidc/src/main/java/no/nav/vedtak/sikkerhet/oidc/validator/OidcTokenValidator.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
import org.slf4j.Logger;
1818
import org.slf4j.LoggerFactory;
1919

20-
import no.nav.vedtak.sikkerhet.kontekst.GroupsProvider;
20+
import no.nav.vedtak.sikkerhet.kontekst.AnsattGruppeProvider;
2121
import no.nav.vedtak.sikkerhet.kontekst.IdentType;
2222
import no.nav.vedtak.sikkerhet.oidc.config.AzureProperty;
2323
import no.nav.vedtak.sikkerhet.oidc.config.OpenIDConfiguration;
@@ -169,7 +169,7 @@ private OidcTokenValidatorResult validateAzure(JwtClaims claims, String subject)
169169
var brukSubject = Optional.ofNullable(JwtUtil.getStringClaim(claims, AzureProperty.NAV_IDENT)).orElse(subject);
170170
registrer(clientName, "Saksbehandler", OpenIDProvider.AZUREAD, IdentType.InternBruker);
171171
var grupper = Optional.ofNullable(JwtUtil.getStringListClaim(claims, AzureProperty.GRUPPER))
172-
.map(arr -> GroupsProvider.instance().getGroupsFrom(arr))
172+
.map(arr -> AnsattGruppeProvider.instance().getAnsattGrupperFraStrings(arr))
173173
.orElse(Set.of());
174174
return OidcTokenValidatorResult.valid(brukSubject, IdentType.InternBruker, oid, grupper, JwtUtil.getExpirationTimeRaw(claims));
175175
}

‎felles/oidc/src/main/java/no/nav/vedtak/sikkerhet/oidc/validator/OidcTokenValidatorResult.java

+4-4
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,11 @@
33
import java.util.Set;
44
import java.util.UUID;
55

6-
import no.nav.vedtak.sikkerhet.kontekst.Groups;
6+
import no.nav.vedtak.sikkerhet.kontekst.AnsattGruppe;
77
import no.nav.vedtak.sikkerhet.kontekst.IdentType;
88

99
public record OidcTokenValidatorResult(boolean isValid, String errorMessage, String subject, IdentType identType,
10-
String compactSubject, UUID oid, Set<Groups> grupper, long expSeconds) {
10+
String compactSubject, UUID oid, Set<AnsattGruppe> grupper, long expSeconds) {
1111

1212
private static final String NO_CLAIMS = "Can't get claims from an invalid token";
1313

@@ -19,7 +19,7 @@ public static OidcTokenValidatorResult valid(String subject, IdentType identType
1919
return new OidcTokenValidatorResult(true, null, subject, identType, subject, null, Set.of(), expSeconds);
2020
}
2121

22-
public static OidcTokenValidatorResult valid(String subject, IdentType identType, UUID oid, Set<Groups> grupper, long expSeconds) {
22+
public static OidcTokenValidatorResult valid(String subject, IdentType identType, UUID oid, Set<AnsattGruppe> grupper, long expSeconds) {
2323
return new OidcTokenValidatorResult(true, null, subject, identType, subject, oid, grupper, expSeconds);
2424
}
2525

@@ -57,7 +57,7 @@ public IdentType getIdentType() {
5757
return identType;
5858
}
5959

60-
public Set<Groups> getGrupper() {
60+
public Set<AnsattGruppe> getGrupper() {
6161
if (!isValid) {
6262
throw new IllegalArgumentException(NO_CLAIMS);
6363
}

‎felles/oidc/src/test/java/no/nav/vedtak/sikkerhet/oidc/validator/OidcTokenValidatorTest.java

+3-3
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
import org.junit.jupiter.api.BeforeEach;
1616
import org.junit.jupiter.api.Test;
1717

18-
import no.nav.vedtak.sikkerhet.kontekst.Groups;
18+
import no.nav.vedtak.sikkerhet.kontekst.AnsattGruppe;
1919
import no.nav.vedtak.sikkerhet.oidc.config.AzureProperty;
2020
import no.nav.vedtak.sikkerhet.oidc.config.OpenIDProvider;
2121
import no.nav.vedtak.sikkerhet.oidc.config.impl.OidcProviderConfig;
@@ -189,7 +189,7 @@ void skal_ekstrahere_grupper_fra_aad_obo_med_navident_med_grupper() {
189189
assertValid(result);
190190
assertThat(result.getSubject()).isEqualTo(ident);
191191
assertThat(result.oid()).isEqualTo(oid);
192-
assertThat(result.grupper()).containsAll(List.of(Groups.SAKSBEHANDLER, Groups.OPPGAVESTYRER));
192+
assertThat(result.grupper()).containsAll(List.of(AnsattGruppe.SAKSBEHANDLER, AnsattGruppe.OPPGAVESTYRER));
193193
assertThat(result.getCompactSubject()).isEqualTo(ident);
194194
}
195195

@@ -233,7 +233,7 @@ void skal_ekstrahere_grupper_fra_aad_obo_med_navident_med_uglydig_gruppe() {
233233
OidcTokenValidatorResult result = tokenValidator.validate(token);
234234
assertValid(result);
235235
assertThat(result.getSubject()).isEqualTo(ident);
236-
assertThat(result.grupper()).containsExactly(Groups.SAKSBEHANDLER);
236+
assertThat(result.grupper()).containsExactly(AnsattGruppe.SAKSBEHANDLER);
237237
assertThat(result.getCompactSubject()).isEqualTo(ident);
238238
}
239239

0 commit comments

Comments
 (0)
Please sign in to comment.