Skip to content

Commit 57d1937

Browse files
feat: introduce regex option
1 parent cf819d9 commit 57d1937

File tree

9 files changed

+34
-27
lines changed

9 files changed

+34
-27
lines changed

api/src/main/java/io/kafbat/ui/model/rbac/Subject.java

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,32 +4,37 @@
44
import static com.google.common.base.Preconditions.checkNotNull;
55

66
import io.kafbat.ui.model.rbac.provider.Provider;
7+
import java.util.Objects;
78
import lombok.Getter;
9+
import lombok.Setter;
810

911
@Getter
1012
public class Subject {
1113

1214
Provider provider;
15+
@Setter
1316
String type;
17+
@Setter
1418
String value;
19+
@Setter
20+
boolean isRegex;
1521

1622
public void setProvider(String provider) {
1723
this.provider = Provider.fromString(provider.toUpperCase());
1824
}
1925

20-
public void setType(String type) {
21-
this.type = type;
22-
}
23-
24-
public void setValue(String value) {
25-
this.value = value;
26-
}
27-
2826
public void validate() {
2927
checkNotNull(type, "Subject type cannot be null");
3028
checkNotNull(value, "Subject value cannot be null");
3129

3230
checkArgument(!type.isEmpty(), "Subject type cannot be empty");
3331
checkArgument(!value.isEmpty(), "Subject value cannot be empty");
3432
}
33+
34+
public boolean matches(final String attribute) {
35+
if (isRegex()) {
36+
return Objects.nonNull(attribute) && attribute.matches(getValue());
37+
}
38+
return getValue().equalsIgnoreCase(attribute);
39+
}
3540
}

api/src/main/java/io/kafbat/ui/service/rbac/extractor/CognitoAuthorityExtractor.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ private Set<String> extractUsernameRoles(AccessControlService acs, DefaultOAuth2
5050
.stream()
5151
.filter(s -> s.getProvider().equals(Provider.OAUTH_COGNITO))
5252
.filter(s -> s.getType().equals("user"))
53-
.anyMatch(s -> principal.getName().matches(s.getValue())))
53+
.anyMatch(s -> s.matches(principal.getName())))
5454
.map(Role::getName)
5555
.collect(Collectors.toSet());
5656

@@ -76,7 +76,7 @@ private Set<String> extractGroupRoles(AccessControlService acs, DefaultOAuth2Use
7676
.filter(s -> s.getType().equals("group"))
7777
.anyMatch(subject -> groups
7878
.stream()
79-
.anyMatch(cognitoGroup -> cognitoGroup.matches(subject.getValue()))
79+
.anyMatch(subject::matches)
8080
))
8181
.map(Role::getName)
8282
.collect(Collectors.toSet());

api/src/main/java/io/kafbat/ui/service/rbac/extractor/GithubAuthorityExtractor.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ private Set<String> extractUsernameRoles(DefaultOAuth2User principal, AccessCont
9090
.stream()
9191
.filter(s -> s.getProvider().equals(Provider.OAUTH_GITHUB))
9292
.filter(s -> s.getType().equals("user"))
93-
.anyMatch(s -> username.matches(s.getValue())))
93+
.anyMatch(s -> s.matches(username)))
9494
.map(Role::getName)
9595
.collect(Collectors.toSet());
9696

@@ -131,7 +131,7 @@ private Mono<Set<String>> getOrganizationRoles(DefaultOAuth2User principal, Map<
131131
.filter(s -> s.getType().equals(ORGANIZATION))
132132
.anyMatch(subject -> orgsMap.stream()
133133
.map(org -> org.get(ORGANIZATION_NAME).toString())
134-
.anyMatch(orgName -> orgName.matches(subject.getValue()))
134+
.anyMatch(subject::matches)
135135
))
136136
.map(Role::getName)
137137
.collect(Collectors.toSet()));
@@ -189,7 +189,7 @@ private Mono<Set<String>> getTeamRoles(WebClient webClient, Map<String, Object>
189189
.filter(s -> s.getProvider().equals(Provider.OAUTH_GITHUB))
190190
.filter(s -> s.getType().equals("team"))
191191
.anyMatch(subject -> teams.stream()
192-
.anyMatch(teamName -> teamName.matches(subject.getValue()))
192+
.anyMatch(subject::matches)
193193
))
194194
.map(Role::getName)
195195
.collect(Collectors.toSet()));

api/src/main/java/io/kafbat/ui/service/rbac/extractor/GoogleAuthorityExtractor.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ private Set<String> extractUsernameRoles(AccessControlService acs, DefaultOAuth2
5252
.filter(s -> s.getType().equals("user"))
5353
.anyMatch(s -> {
5454
String email = principal.getAttribute(EMAIL_ATTRIBUTE_NAME);
55-
return email != null && email.matches(s.getValue());
55+
return s.matches(email);
5656
}))
5757
.map(Role::getName)
5858
.collect(Collectors.toSet());
@@ -71,7 +71,7 @@ private Set<String> extractDomainRoles(AccessControlService acs, DefaultOAuth2Us
7171
.stream()
7272
.filter(s -> s.getProvider().equals(Provider.OAUTH_GOOGLE))
7373
.filter(s -> s.getType().equals("domain"))
74-
.anyMatch(s -> domain.matches(s.getValue())))
74+
.anyMatch(s -> s.matches(domain)))
7575
.map(Role::getName)
7676
.collect(Collectors.toSet());
7777
}

api/src/main/java/io/kafbat/ui/service/rbac/extractor/OauthAuthorityExtractor.java

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -58,9 +58,7 @@ private Set<String> extractUsernameRoles(AccessControlService acs, DefaultOAuth2
5858
.stream()
5959
.filter(s -> s.getProvider().equals(Provider.OAUTH))
6060
.filter(s -> s.getType().equals("user"))
61-
.peek(s -> log.trace("[{}] matches [{}]? [{}]", s.getValue(), principalName,
62-
principalName.matches(s.getValue())))
63-
.anyMatch(s -> principalName.matches(s.getValue())))
61+
.anyMatch(s -> s.matches(principalName)))
6462
.map(Role::getName)
6563
.collect(Collectors.toSet());
6664

@@ -94,7 +92,7 @@ private Set<String> extractRoles(AccessControlService acs, DefaultOAuth2User pri
9492
.stream()
9593
.filter(s -> s.getProvider().equals(Provider.OAUTH))
9694
.filter(s -> s.getType().equals("role"))
97-
.anyMatch(subject -> principalRoles.stream().anyMatch(s -> s.matches(subject.getValue()))))
95+
.anyMatch(subject -> principalRoles.stream().anyMatch(subject::matches)))
9896
.map(Role::getName)
9997
.collect(Collectors.toSet());
10098

api/src/main/java/io/kafbat/ui/service/rbac/extractor/RbacActiveDirectoryAuthoritiesExtractor.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,8 @@ public Collection<? extends GrantedAuthority> getGrantedAuthorities(DirContextOp
3737
.stream()
3838
.filter(subject -> subject.getProvider().equals(Provider.LDAP_AD))
3939
.anyMatch(subject -> switch (subject.getType()) {
40-
case "user" -> username.equalsIgnoreCase(subject.getValue());
41-
case "group" -> adGroups.contains(subject.getValue());
40+
case "user" -> subject.matches(username);
41+
case "group" -> adGroups.stream().anyMatch(subject::matches);
4242
default -> false;
4343
})
4444
)

api/src/main/java/io/kafbat/ui/service/rbac/extractor/RbacLdapAuthoritiesExtractor.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,8 +39,8 @@ protected Set<GrantedAuthority> getAdditionalRoles(DirContextOperations user, St
3939
.stream()
4040
.filter(subject -> subject.getProvider().equals(Provider.LDAP))
4141
.anyMatch(subject -> switch (subject.getType()) {
42-
case "user" -> username.equalsIgnoreCase(subject.getValue());
43-
case "group" -> ldapGroups.contains(subject.getValue());
42+
case "user" -> subject.matches(username);
43+
case "group" -> ldapGroups.stream().anyMatch(subject::matches);
4444
default -> false;
4545
})
4646
)

api/src/test/java/io/kafbat/ui/config/RegexBasedProviderAuthorityExtractorTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -174,7 +174,7 @@ void extractGoogleAuthorities() {
174174

175175
OAuth2User oauth2User = new DefaultOAuth2User(
176176
AuthorityUtils.createAuthorityList("SCOPE_message:read"),
177-
Map.of("hd", "test.domain.com", "email", "[email protected]"),
177+
Map.of("hd", "memelord.lol", "email", "[email protected]"),
178178
"email");
179179

180180
HashMap<String, Object> additionalParams = new HashMap<>();

api/src/test/resources/roles_definition.yaml

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,13 @@
33
- provider: 'OAUTH'
44
value: 'ROLE-[A-Z]+'
55
type: 'role'
6+
isRegex: 'true'
67
- provider: 'OAUTH_COGNITO'
7-
value: 'ROLE-[A-Z]+'
8+
value: 'ROLE-ADMIN'
89
type: 'group'
910
- provider: 'OAUTH_GOOGLE'
10-
value: '.*.domain.com'
1111
type: 'domain'
12+
value: 'memelord.lol'
1213
clusters:
1314
- local
1415
- remote
@@ -23,14 +24,17 @@
2324
- provider: 'OAUTH'
2425
value: '.*@kafka.com'
2526
type: 'user'
27+
isRegex: 'true'
2628
- provider: 'OAUTH_COGNITO'
2729
value: '.*@kafka.com'
2830
type: 'user'
31+
isRegex: 'true'
2932
- provider: 'OAUTH_GITHUB'
3033
value: '.*@kafka.com'
3134
type: 'user'
35+
isRegex: 'true'
3236
- provider: 'OAUTH_GOOGLE'
33-
value: '.*@kafka.com'
37+
value: 'john@kafka.com'
3438
type: 'user'
3539
clusters:
3640
- remote

0 commit comments

Comments
 (0)