11package io .kafbat .ui .service .rbac .extractor ;
22
3- import io .kafbat .ui .config .auth .LdapProperties ;
43import io .kafbat .ui .model .rbac .Role ;
54import io .kafbat .ui .model .rbac .provider .Provider ;
65import io .kafbat .ui .service .rbac .AccessControlService ;
7- import java .util .List ;
8- import java .util .Map ;
96import java .util .Set ;
107import java .util .stream .Collectors ;
118import lombok .extern .slf4j .Slf4j ;
1411import org .springframework .ldap .core .support .BaseLdapPathContextSource ;
1512import org .springframework .security .core .GrantedAuthority ;
1613import org .springframework .security .core .authority .SimpleGrantedAuthority ;
17- import org .springframework .security .ldap .userdetails .DefaultLdapAuthoritiesPopulator ;
18- import org .springframework .util .Assert ;
14+ import org .springframework .security .ldap .userdetails .NestedLdapAuthoritiesPopulator ;
1915
2016@ Slf4j
21- public class RbacLdapAuthoritiesExtractor extends DefaultLdapAuthoritiesPopulator {
17+ public class RbacLdapAuthoritiesExtractor extends NestedLdapAuthoritiesPopulator {
2218
2319 private final AccessControlService acs ;
24- private final LdapProperties props ;
2520
2621 public RbacLdapAuthoritiesExtractor (ApplicationContext context ,
2722 BaseLdapPathContextSource contextSource , String groupFilterSearchBase ) {
2823 super (contextSource , groupFilterSearchBase );
2924 this .acs = context .getBean (AccessControlService .class );
30- this .props = context .getBean (LdapProperties .class );
3125 }
3226
3327 @ Override
3428 protected Set <GrantedAuthority > getAdditionalRoles (DirContextOperations user , String username ) {
35- var ldapGroups = getRoles (user .getNameInNamespace (), username );
29+ var ldapGroups = super .getGroupMembershipRoles (user .getNameInNamespace (), username )
30+ .stream ()
31+ .map (GrantedAuthority ::getAuthority )
32+ .peek (group -> log .trace ("Found LDAP group [{}] for user [{}]" , group , username ))
33+ .collect (Collectors .toSet ());
3634
3735 return acs .getRoles ()
3836 .stream ()
@@ -47,32 +45,4 @@ protected Set<GrantedAuthority> getAdditionalRoles(DirContextOperations user, St
4745 .map (SimpleGrantedAuthority ::new )
4846 .collect (Collectors .toSet ());
4947 }
50-
51- private Set <String > getRoles (String userDn , String username ) {
52- var groupSearchBase = props .getGroupFilterSearchBase ();
53- Assert .notNull (groupSearchBase , "groupSearchBase is empty" );
54-
55- var groupRoleAttribute = props .getGroupRoleAttribute ();
56- if (groupRoleAttribute == null ) {
57-
58- groupRoleAttribute = "cn" ;
59- }
60-
61- log .trace (
62- "Searching for roles for user [{}] with DN [{}], groupRoleAttribute [{}] and filter [{}] in search base [{}]" ,
63- username , userDn , groupRoleAttribute , getGroupSearchFilter (), groupSearchBase );
64-
65- var ldapTemplate = getLdapTemplate ();
66- ldapTemplate .setIgnoreNameNotFoundException (true );
67-
68- Set <Map <String , List <String >>> userRoles = ldapTemplate .searchForMultipleAttributeValues (
69- groupSearchBase , getGroupSearchFilter (), new String [] {userDn , username },
70- new String [] {groupRoleAttribute });
71-
72- return userRoles .stream ()
73- .map (record -> record .get (getGroupRoleAttribute ()).get (0 ))
74- .peek (group -> log .trace ("Found LDAP group [{}] for user [{}]" , group , username ))
75- .collect (Collectors .toSet ());
76- }
77-
7848}
0 commit comments