1
1
package no .nav .vedtak .sikkerhet .abac .internal ;
2
2
3
3
import static org .assertj .core .api .Assertions .assertThat ;
4
- import static org .mockito .Mockito .mock ;
5
- import static org .mockito .Mockito .never ;
6
- import static org .mockito .Mockito .verify ;
7
4
import static org .mockito .Mockito .when ;
8
5
9
6
import java .lang .reflect .Constructor ;
10
7
import java .lang .reflect .Method ;
11
8
import java .util .Map ;
12
- import java .util .regex .Pattern ;
9
+ import java .util .Set ;
10
+ import java .util .UUID ;
13
11
14
12
import jakarta .interceptor .InvocationContext ;
15
13
import jakarta .ws .rs .Path ;
16
14
17
- import org .assertj .core .api .Fail ;
15
+ import org .junit .jupiter .api .Assertions ;
16
+ import org .junit .jupiter .api .BeforeEach ;
18
17
import org .junit .jupiter .api .Test ;
19
18
import org .junit .jupiter .api .extension .ExtendWith ;
20
19
import org .mockito .ArgumentCaptor ;
21
20
import org .mockito .Mock ;
22
- import org .mockito .Mockito ;
23
21
import org .mockito .junit .jupiter .MockitoExtension ;
24
22
25
- import no .nav .vedtak .exception .ManglerTilgangException ;
26
- import no .nav .vedtak .log .audit .Auditdata ;
27
- import no .nav .vedtak .log .audit .Auditlogger ;
28
- import no .nav .vedtak .sikkerhet .abac .AbacAuditlogger ;
29
23
import no .nav .vedtak .sikkerhet .abac .AbacDataAttributter ;
30
24
import no .nav .vedtak .sikkerhet .abac .AbacDto ;
31
25
import no .nav .vedtak .sikkerhet .abac .AbacResultat ;
32
26
import no .nav .vedtak .sikkerhet .abac .BeskyttetRessurs ;
33
27
import no .nav .vedtak .sikkerhet .abac .BeskyttetRessursInterceptor ;
28
+ import no .nav .vedtak .sikkerhet .abac .Pep ;
29
+ import no .nav .vedtak .sikkerhet .abac .PepNektetTilgangException ;
34
30
import no .nav .vedtak .sikkerhet .abac .StandardAbacAttributtType ;
35
- import no .nav .vedtak .sikkerhet .abac .Tilgangsbeslutning ;
36
31
import no .nav .vedtak .sikkerhet .abac .TokenProvider ;
37
32
import no .nav .vedtak .sikkerhet .abac .beskyttet .ActionType ;
33
+ import no .nav .vedtak .sikkerhet .abac .beskyttet .AvailabilityType ;
38
34
import no .nav .vedtak .sikkerhet .abac .beskyttet .ResourceType ;
39
- import no .nav .vedtak .sikkerhet .abac . pdp . AppRessursData ;
35
+ import no .nav .vedtak .sikkerhet .kontekst . IdentType ;
40
36
import no .nav .vedtak .sikkerhet .oidc .config .OpenIDProvider ;
41
37
import no .nav .vedtak .sikkerhet .oidc .token .OpenIDToken ;
42
38
import no .nav .vedtak .sikkerhet .oidc .token .TokenString ;
@@ -50,131 +46,99 @@ public class BeskyttetRessursInterceptorTest {
50
46
private final AktørDto aktør1 = new AktørDto ("00000000000" );
51
47
private final BehandlingIdDto behandlingIdDto = new BehandlingIdDto (1234L );
52
48
53
- private final ArgumentCaptor <Auditdata > auditdataCaptor = ArgumentCaptor .forClass (Auditdata .class );
49
+ private static final String BRUKER_IDENT = "A000000" ;
50
+ private static final UUID BRUKER_OID = UUID .randomUUID ();
51
+ private static final String PEP_ID = "test" ;
54
52
55
- public static final OpenIDToken DUMMY_OPENID_TOKEN = new OpenIDToken ( OpenIDProvider . AZUREAD , new TokenString ( DUMMY_ID_TOKEN ) );
53
+ private final ArgumentCaptor < BeskyttetRessursAttributter > braCaptor = ArgumentCaptor . forClass ( BeskyttetRessursAttributter . class );
56
54
55
+ public static final OpenIDToken DUMMY_OPENID_TOKEN = new OpenIDToken (OpenIDProvider .TOKENX , new TokenString (DUMMY_ID_TOKEN ));
56
+
57
+ @ Mock
58
+ private TokenProvider tokenProvider ;
57
59
@ Mock
58
- private static TokenProvider tokenProvider ;
60
+ private Pep pep ;
59
61
60
62
61
- private void mockTokenProvider () {
62
- when (tokenProvider .getUid ()).thenReturn ("A000000" );
63
+ @ BeforeEach
64
+ void mockTokenProvider () {
65
+ when (tokenProvider .getUid ()).thenReturn (BRUKER_IDENT );
66
+ when (tokenProvider .getOid ()).thenReturn (BRUKER_OID );
67
+ when (tokenProvider .getAnsattGrupper ()).thenReturn (Set .of ());
68
+ when (tokenProvider .getIdentType ()).thenReturn (IdentType .InternBruker );
63
69
when (tokenProvider .openIdToken ()).thenReturn (DUMMY_OPENID_TOKEN );
70
+ when (pep .pepId ()).thenReturn (PEP_ID );
64
71
}
65
72
66
73
@ Test
67
- void auditlogg_skal_logge_parametre_som_går_til_pdp_til_sporingslogg_ved_permit () throws Exception {
68
- final Auditlogger auditlogger = mockAuditLogger ();
69
- final AbacAuditlogger abacAuditlogger = new AbacAuditlogger (auditlogger );
70
-
71
- skal_logge_parametre_som_går_til_pdp_til_sporingslogg_ved_permit (abacAuditlogger );
72
- assertGotPattern (auditlogger ,
73
- "CEF:0|felles|felles-test|1.0|audit:create|ABAC Sporingslogg|INFO|act=create duid=00000000000 end=__NUMBERS__ request=/foo/aktoer_in requestContext=pip.tjeneste.kan.kun.kalles.av.pdp.servicebruker suid=A000000" );
74
- }
75
-
76
- private void skal_logge_parametre_som_går_til_pdp_til_sporingslogg_ved_permit (AbacAuditlogger abacAuditLogger ) throws Exception {
77
- mockTokenProvider ();
78
-
79
- BeskyttetRessursInterceptor interceptor = new BeskyttetRessursInterceptor (attributter -> {
80
- var ressurs = AppRessursData .builder ().leggTilAktørId (aktør1 .getAktørId ()).build ();
81
- return new Tilgangsbeslutning (AbacResultat .GODKJENT , attributter , ressurs );
82
- }, abacAuditLogger , tokenProvider );
74
+ void godkjent_aktør () throws Exception {
75
+ when (pep .vurderTilgang (braCaptor .capture ())).thenReturn (AbacResultat .GODKJENT );
76
+ var interceptor = new BeskyttetRessursInterceptor (pep , tokenProvider );
83
77
84
78
Method method = RestClass .class .getMethod ("aktoerIn" , AktørDto .class );
85
79
InvocationContext ic = new TestInvocationContext (method , new Object []{aktør1 });
86
80
interceptor .wrapTransaction (ic );
87
- }
88
81
89
- @ Test
90
- void auditlogg_skal_også_logge_input_parametre_til_sporingslogg_ved_permit () throws Exception {
91
- final Auditlogger auditlogger = mockAuditLogger ();
92
- final AbacAuditlogger abacAuditlogger = new AbacAuditlogger (auditlogger );
93
- skal_også_logge_input_parametre_til_sporingslogg_ved_permit (abacAuditlogger );
94
- assertGotPattern (auditlogger ,
95
- "CEF:0|felles|felles-test|1.0|audit:create|ABAC Sporingslogg|INFO|act=create duid=00000000000 end=__NUMBERS__ flexString2=1234 flexString2Label=Behandling request=/foo/behandling_id_in requestContext=pip.tjeneste.kan.kun.kalles.av.pdp.servicebruker suid=A000000" );
82
+ var bra = braCaptor .getValue ();
83
+ assertBeskyttetRessursAttributter (bra );
84
+ assertThat (bra .isSporingslogg ()).isTrue ();
96
85
}
97
86
98
- private void skal_også_logge_input_parametre_til_sporingslogg_ved_permit (AbacAuditlogger abacAuditLogger ) throws Exception {
99
- mockTokenProvider ();
100
-
101
- BeskyttetRessursInterceptor interceptor = new BeskyttetRessursInterceptor (attributter -> {
102
- var ressurs = AppRessursData .builder ().leggTilAktørId (aktør1 .getAktørId ()).build ();
103
- return new Tilgangsbeslutning (AbacResultat .GODKJENT , attributter , ressurs );
104
- }, abacAuditLogger , tokenProvider );
87
+ @ Test
88
+ void godkjent_behandling () throws Exception {
89
+ when (pep .vurderTilgang (braCaptor .capture ())).thenReturn (AbacResultat .GODKJENT );
90
+ var interceptor = new BeskyttetRessursInterceptor (pep , tokenProvider );
105
91
106
92
Method method = RestClass .class .getMethod ("behandlingIdIn" , BehandlingIdDto .class );
107
93
InvocationContext ic = new TestInvocationContext (method , new Object []{behandlingIdDto });
108
94
interceptor .wrapTransaction (ic );
109
- }
110
95
111
- @ Test
112
- void auditlog_skal_ikke_logge_parametre_som_går_til_pdp_til_sporingslogg_ved_permit_når_det_er_konfigurert_unntak_i_annotering () throws Exception {
113
- when (tokenProvider .openIdToken ()).thenReturn (DUMMY_OPENID_TOKEN );
114
- final Auditlogger auditlogger = mock (Auditlogger .class );
115
- final AbacAuditlogger abacAuditlogger = new AbacAuditlogger (auditlogger );
116
- skal_ikke_logge_parametre_som_går_til_pdp_til_sporingslogg_ved_permit_når_det_er_konfigurert_unntak_i_annotering (abacAuditlogger );
117
- verify (auditlogger , never ()).logg (Mockito .any ());
96
+ var bra = braCaptor .getValue ();
97
+ assertBeskyttetRessursAttributter (bra );
98
+ assertThat (bra .isSporingslogg ()).isTrue ();
118
99
}
119
100
120
- private void skal_ikke_logge_parametre_som_går_til_pdp_til_sporingslogg_ved_permit_når_det_er_konfigurert_unntak_i_annotering (AbacAuditlogger abacAuditLogger ) throws Exception {
121
- mockTokenProvider ();
122
- BeskyttetRessursInterceptor interceptor = new BeskyttetRessursInterceptor (attributter -> {
123
- var ressurs = AppRessursData .builder ().leggTilAktørId (aktør1 .getAktørId ()).build ();
124
- return new Tilgangsbeslutning (AbacResultat .GODKJENT , attributter , ressurs );
125
- }, abacAuditLogger , tokenProvider );
101
+
102
+ @ Test
103
+ void godkjent_uten_sporing () throws Exception {
104
+ when (pep .vurderTilgang (braCaptor .capture ())).thenReturn (AbacResultat .GODKJENT );
105
+ var interceptor = new BeskyttetRessursInterceptor (pep , tokenProvider );
126
106
127
107
Method method = RestClass .class .getMethod ("utenSporingslogg" , BehandlingIdDto .class );
128
108
InvocationContext ic = new TestInvocationContext (method , new Object []{behandlingIdDto });
129
109
interceptor .wrapTransaction (ic );
130
- }
131
110
132
- @ Test
133
- void auditlog_skal_logge_parametre_som_går_til_pdp_til_sporingslogg_ved_deny () throws Exception {
134
- mockTokenProvider ();
135
- final Auditlogger auditlogger = mockAuditLogger ();
136
- final AbacAuditlogger abacAuditlogger = new AbacAuditlogger (auditlogger );
137
- skal_logge_parametre_som_går_til_pdp_til_sporingslogg_ved_deny (abacAuditlogger );
138
- assertGotPattern (auditlogger ,
139
- "CEF:0|felles|felles-test|1.0|audit:create|ABAC Sporingslogg|WARN|act=create duid=00000000000 end=__NUMBERS__ request=/foo/aktoer_in requestContext=pip.tjeneste.kan.kun.kalles.av.pdp.servicebruker suid=A000000" );
111
+ var bra = braCaptor .getValue ();
112
+ assertBeskyttetRessursAttributter (bra );
113
+ assertThat (bra .isSporingslogg ()).isFalse ();
140
114
}
141
115
142
- private void skal_logge_parametre_som_går_til_pdp_til_sporingslogg_ved_deny (AbacAuditlogger abacAuditLogger ) throws Exception {
143
- BeskyttetRessursInterceptor interceptor = new BeskyttetRessursInterceptor (attributter -> {
144
- var ressurs = AppRessursData .builder ().leggTilAktørId (aktør1 .getAktørId ()).build ();
145
- return new Tilgangsbeslutning (AbacResultat .AVSLÅTT_KODE_6 , attributter , ressurs );
146
- }, abacAuditLogger , tokenProvider );
116
+ @ Test
117
+ void deny_aktør_gir_exception () throws Exception {
118
+ when (pep .vurderTilgang (braCaptor .capture ())).thenReturn (AbacResultat .AVSLÅTT_KODE_6 );
119
+ var interceptor = new BeskyttetRessursInterceptor (pep , tokenProvider );
147
120
148
121
Method method = RestClass .class .getMethod ("aktoerIn" , AktørDto .class );
149
122
InvocationContext ic = new TestInvocationContext (method , new Object []{aktør1 });
123
+ Assertions .assertThrowsExactly (PepNektetTilgangException .class , () -> interceptor .wrapTransaction (ic ), () -> "F-709170:Tilgangskontroll.Avslag.Kode6" );
150
124
151
- try {
152
- interceptor .wrapTransaction (ic );
153
- Fail .fail ("Skal få exception" );
154
- } catch (ManglerTilgangException e ) {
155
- // FORVENTET
156
- }
157
- }
158
-
159
- private void assertGotPattern (final Auditlogger auditlogger , String expected ) {
160
- verify (auditlogger ).logg (auditdataCaptor .capture ());
161
- final String actual = auditdataCaptor .getValue ().toString ();
162
- assertThat (actual ).matches (toAuditdataPattern (expected ));
163
- }
164
-
165
- private static Auditlogger mockAuditLogger () {
166
- final Auditlogger auditlogger = mock (Auditlogger .class );
167
- when (auditlogger .getDefaultVendor ()).thenReturn ("felles" );
168
- when (auditlogger .getDefaultProduct ()).thenReturn ("felles-test" );
169
- return auditlogger ;
170
- }
171
-
172
- private static final String toAuditdataPattern (String s ) {
173
- return Pattern .quote (s ).replaceAll ("__NUMBERS__" , unquoteInReplacement ("[0-9]*" ));
125
+ var bra = braCaptor .getValue ();
126
+ assertBeskyttetRessursAttributter (bra );
127
+ assertThat (bra .isSporingslogg ()).isTrue ();
174
128
}
175
129
176
- private static final String unquoteInReplacement (String s ) {
177
- return "\\ \\ E" + s + "\\ \\ Q" ;
130
+ private void assertBeskyttetRessursAttributter (BeskyttetRessursAttributter bra ) {
131
+ assertThat (bra .getBrukerId ()).isEqualTo (BRUKER_IDENT );
132
+ assertThat (bra .getBrukerOid ()).isEqualTo (BRUKER_OID );
133
+ assertThat (bra .getIdentType ()).isEqualTo (IdentType .InternBruker );
134
+ assertThat (bra .getAnsattGrupper ()).isEmpty ();
135
+ assertThat (bra .getActionType ()).isEqualTo (ActionType .CREATE );
136
+ assertThat (bra .getResourceType ()).isEqualTo (ResourceType .PIP );
137
+ assertThat (bra .getAvailabilityType ()).isEqualTo (AvailabilityType .INTERNAL );
138
+ assertThat (bra .getPepId ()).isEqualTo (PEP_ID );
139
+ assertThat (bra .getToken ().getOpenIDProvider ()).isEqualTo (OpenIDProvider .TOKENX );
140
+ assertThat (bra .getServicePath ()).startsWith ("/foo" );
141
+ assertThat (bra .getDataAttributter ().keySet ()).hasSize (1 );
178
142
}
179
143
180
144
@ Path ("foo" )
@@ -200,31 +164,15 @@ public void utenSporingslogg(@SuppressWarnings("unused") BehandlingIdDto param)
200
164
201
165
}
202
166
203
- private static class AktørDto implements AbacDto {
204
-
205
- private String aktørId ;
206
-
207
- public AktørDto (String aktørId ) {
208
- this .aktørId = aktørId ;
209
- }
210
-
211
- public String getAktørId () {
212
- return aktørId ;
213
- }
167
+ private record AktørDto (String aktørId ) implements AbacDto {
214
168
215
169
@ Override
216
170
public AbacDataAttributter abacAttributter () {
217
171
return AbacDataAttributter .opprett ().leggTil (StandardAbacAttributtType .AKTØR_ID , aktørId );
218
172
}
219
173
}
220
174
221
- private static class BehandlingIdDto implements AbacDto {
222
-
223
- private Long id ;
224
-
225
- public BehandlingIdDto (Long id ) {
226
- this .id = id ;
227
- }
175
+ private record BehandlingIdDto (Long id ) implements AbacDto {
228
176
229
177
@ Override
230
178
public AbacDataAttributter abacAttributter () {
0 commit comments