TransWikia.com

Java Spring доступ на основе ролей/доменных групп Active Directory

Stack Overflow на русском Asked by kent on November 30, 2020

Задача предоставить доступ к определённой web странице только членам определённой группы Active Directory. Что бы при на каком-нибудь этапе авторизации проверялся memeberOf, например, и в зависимости от принадлежности пользователя к группе перенаправлялся на определённую Web page.
В web приложении уже имеются способы для аутентификации доменных пользователей

@Configuration
class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
    http
      .authorizeRequests()
  ---- some code ------
}
@Autowired
public void configureGlobal(AuthenticationManagerBuilder authBuilder) throws Exception {
    authBuilder
            .ldapAuthentication()
            .userSearchFilter("(sAMAccountName={0})")
            .userSearchBase("OU=Active,OU=Users,OU=nsk,DC=office,DC=ru")
            .groupSearchBase("OU=Groups,OU=nsk,DC=office,DC=ru")
            .groupSearchFilter("memberOf={0}")
            .contextSource()
            .url("ldap://regions.office.ru:389")
            .managerDn("CN=ldap_user_ro,OU=Service,OU=Users,OU=nsk,DC=office,DC=ru")
            .managerPassword("password");

и для поиска пользователей в домене:

public class LdapSearch {
public List<String> getAllPersonNames() {
    Hashtable env = new Hashtable();
    env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
    env.put(Context.PROVIDER_URL, "ldap://office.ru:389");
    env.put(Context.SECURITY_PRINCIPAL, "CN=ldap_user_ro,OU=Service,OU=Users,OU=nsk,DC=office,DC=ru");
    env.put(Context.SECURITY_CREDENTIALS, "password");

    DirContext ctx;
    try {
        ctx = new InitialDirContext(env);
    } catch (NamingException | javax.naming.NamingException e) {
        throw new RuntimeException(e);
    }

    List<String> list = new LinkedList<String>();
    NamingEnumeration results = null;
    try {
        SearchControls controls = new SearchControls();
        controls.setSearchScope(SearchControls.SUBTREE_SCOPE);
        results = ctx.search("OU=Active,OU=Users,OU=nsk,DC=office,DC=ru", "(objectclass=user)", controls);

        while (results.hasMore()) {
            SearchResult searchResult = (SearchResult) results.next();
            Attributes attributes = searchResult.getAttributes();
            Attribute attr = attributes.get("displayName");
            String cn = attr.get().toString();
            list.add(cn);
        }

Какой из этих модулей подойдёт для решения задачи? Логично предположить, что для этого нужен WebSecurityConfigurerAdapter, но в какую сторону копать не понимаю.

One Answer

Всем спасибо за помощь. Сопоставление доменных групп ролям:

public class AuthoritiesMapper implements GrantedAuthoritiesMapper {
@Override
public Collection<? extends GrantedAuthority> mapAuthorities(Collection<? extends 
GrantedAuthority> authorities) {
Set<Roles> roles = EnumSet.noneOf(Roles.class);

for (GrantedAuthority a: authorities) {
    if ("inventadmin".equals(a.getAuthority())) {
        roles.add(Roles.INVENTADMIN);
    } else if ("inventuser".equals(a.getAuthority())) {
        roles.add(Roles.INVENTUSER);
    }}
return roles;
}}

Enum с ролями:

public enum Roles implements GrantedAuthority {
INVENTADMIN,
INVENTUSER;

public String getAuthority() {
return name();
}}

WebSecurityconfig:

@Autowired
public void configureGlobal(AuthenticationManagerBuilder authBuilder) throws Exception {

authBuilder
        .ldapAuthentication()
        .userSearchFilter("(&(objectClass=person)(objectClass=user)(sAMAccountName={0})(|(memberOf=cn=inventadmin,OU=inventorization,OU=Groups,OU=nsk,DC=office,DC=ru)(memberOf=cn=inventuser,OU=inventorization,OU=Groups,OU=nsk,DC=office,DC=ru)))")
        .userSearchBase("OU=Active,OU=Users,OU=nsk,DC=office,DC=ru")
        .groupSearchBase("OU=inventorization,OU=Groups,OU=nsk,DC=office,DC=ru")
        .groupSearchFilter("(member={0})")
        .contextSource()
        .url("ldap://office.ru:389")
        .managerDn("CN=ldap_user_ro,OU=Service,OU=Users,OU=nsk,DC=office,DC=ru")
        .managerPassword("password");
 }

Correct answer by kent on November 30, 2020

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP