0

Я использую аутентификацию с использованием ldap. Если предоставленный идентификатор пользователя и пароль существуют в ldap, я смог получить логин пользователя. Я хотел бы ограничить это на основе атрибута memberOf пользователя в LDAP. Если у пользователя есть атрибут memberOf с определенным значением CN (CN = adminaccess или CN = superadminaccess), тогда аутентификация/авторизация должны пройти. Ошибка аутентификации/авторизации должна завершиться неудачей.Аутентификация подлинности с использованием ldap на основе атрибута memberOf

<security:http auto-config="true" use-expressions="true" access-denied-page="/admin/auth/denied"> 
    <security:intercept-url pattern="/admin/auth/login" access="permitAll" /> 
    <security:intercept-url pattern="/admin/dashboard/*" access="hasAnyRole('ROLE_ADMINACCESS','ROLE_SUPERADMINACCESS')"/> 
</security:http> 

<security:authentication-manager> 
    <security:ldap-authentication-provider user-dn-pattern="CN={0},CN=Users" group-search-base="CN=adminaccess,CN=Users" /> 
</security:authentication-manager> 

<bean id="ldapContext" 
     class="org.springframework.security.ldap.DefaultSpringSecurityContextSource"> 
    <constructor-arg value="ldap://xxx.ds.yyy.com:389/DC=xxx,DC=ds,DC=yyy,DC=com"/> 
    <property name="userDn" value="CN=aaa,CN=Users,DC=xxx,DC=ds,DC=yyy,DC=com"/> 
    <property name="password" value="thepassword"/> 
</bean> 

Я всегда перехожу на страницу «Отказано в доступе» с моей вышеуказанной конфигурацией. Если я удалю access = "hasAnyRole ('ROLE_ADMINACCESS', 'ROLE_SUPERADMINACCESS')" из security: intercept-url, я могу всегда иметь доступ с допустимым пользователем/паролем, даже если пользователь не является частью adminaccess (который Я надеялся, что это будет ограничено, потому что моя группа поиска-поиска указала CN = adminaccess). Хотите знать, что конфигурация должна быть:

  1. Чтобы ограничить доступ к только пользователям, которые memberOf CN = adminaccess и/или CN = superadminaccess
  2. Укажите правильную групповую поисковую базу. Если я укажу только CN = Пользователи, я получаю тайм-аут, поскольку это происходит против нашего корпоративного ldap. Когда я искал пользователей в браузере LDAP, я не мог найти «ou», который мог бы помочь. С моей вышеупомянутой конфигурационной группой-search-base = «CN = adminaccess, CN = Users», я не получаю таймаут, но я не думаю, что это правильно.
+0

Я ** не уверен **, что 'group-search-base' релевантно для * членства в группе * (т. атрибут 'memberOf' находится в записи учетной записи). –

+0

Спасибо, Пол. Удивление, если есть какой-либо другой способ, я мог бы ограничить мой поиск на основе членства в группе. Я в порядке, даже если аутентификация завершается с ошибкой (а не только авторизацией) для пользователей, не входящих в эти группы. – ignatan

+0

Возможно, можно использовать учетные данные пользователя для выполнения поиска LDAP для собственной учетной записи. Затем вы можете использовать фильтр LDAP, чтобы включить только учетные записи с определенным атрибутом memberOf. Однако для этого может потребоваться конфигурация ldap с пружинной безопасностью (т. Е. Без поддержки пространства имен). –

ответ

1

Не уверен, что есть лучший способ, но Я был в состоянии успешно получить эту работу, используя DefaultLdapAuthoritiesPopulator и обновление до следующей конфигурации:

<security:http auto-config="true" use-expressions="true" access-denied-page="/admin/auth/denied"> 
<security:intercept-url pattern="/admin/auth/login" access="permitAll" /> 
<security:intercept-url pattern="/admin/dashboard/*" access="hasAnyRole('ROLE_ADMINACCESS','ROLE_SUPERADMINACCESS')"/> 
</security:http> 

<security:authentication-manager> 
    <security:authentication-provider 
     ref="ldapAuthProvider"></security:authentication-provider> 
</security:authentication-manager> 

<bean id="ldapContext" 
    class="org.springframework.security.ldap.DefaultSpringSecurityContextSource"> 
<constructor-arg value="ldap://xxx.ds.yyy.com:389/DC=xxx,DC=ds,DC=yyy,DC=com"/> 
<property name="userDn" value="CN=aaa,CN=Users,DC=xxx,DC=ds,DC=yyy,DC=com"/> 
<property name="password" value="thepassword"/> 
</bean> 

<bean id="ldapAuthProvider" 
    class="org.springframework.security.ldap.authentication.LdapAuthenticationProvider"> 
    <constructor-arg> 
     <bean 
      class="org.springframework.security.ldap.authentication.BindAuthenticator"> 
      <constructor-arg ref="ldapContext" /> 
      <property name="userDnPatterns"> 
       <list> 
        <value>CN={0},CN=Users</value> 
       </list> 
      </property> 
     </bean> 
    </constructor-arg> 
    <constructor-arg> 
     <bean 
      class="org.springframework.security.ldap.userdetails.DefaultLdapAuthoritiesPopulator"> 
      <constructor-arg ref="ldapContext" /> 
      <constructor-arg value="CN=Users" /> 
      <property name="groupRoleAttribute" value="CN" /> 
     </bean> 
    </constructor-arg> 
</bean> 

при такой конфигурации, если Логин имя пользователя/пароль не является правильным, все группы, которые пользователь «memberOf» (рисунок CN = Пользователи, DC = xxx, DC = ds, DC = yyy, DC = com), загружаются как его «роли» (с префиксом ROLE_), и я могу управлять доступом к этим ролям с помощью security: intercept-url

+0

Вы получаете группы LDAP в качестве предоставленных полномочий из объекта SecurityContextHolder.getContext(). GetAuthentication()? Мои власти всегда пусты, и я пытаюсь достичь того же, что и вы. благодаря –

Смежные вопросы