Autenticação LDAP

LDAP Integration é ativada, incluindo a seguinte dependência na sobreposição da guerra do Maven:

autentica um nome de usuário / senha contra um diretório LDAP, como o Active DirectoryOR OpenLDAP. Existem inúmeras arquiteturas de diretório e fornecemos configuração para quatro casos comuns:

  1. Active Directory – Usuários autenticam com samaaccountname.
  2. autenticado Pesquisa – Gerenciador Bind / Search seguido por usuário simples Vincule.
  3. Busca anônima – pesquisa anônima seguida de vínculo simples do usuário.
  4. ligação direta – compute o usuário DN da string de formato e execute liga simples.

ver a documentação LDaptive para obter mais informações ou para acomodar outras situações.

Autenticação do Active Directory

A seguinte configuração autentica os usuários pelo SamaccountName sem executar uma pesquisa, que requer créditos de gerenciador / administrador na maioria dos casos. É, portanto, o mais performático e secureolution para a típica implantação do Active Directory. Observe que o ID principal resolvido, que se torna os aplicativos do cliente NetIDPass para CAS, é o samaccountname no exemplo a seguir. Descartei a configuração para deployerConfigContext.xml e forneça valores para reservas de propriedade.

<!-- | Change principalIdAttribute to use another directory attribute, | e.g. userPrincipalName, for the NetID --><bean class="org.jasig.cas.authentication.LdapAuthenticationHandler" p:principalIdAttribute="sAMAccountName" c:authenticator-ref="authenticator"> <property name="principalAttributeMap"> <map> <!-- | This map provides a simple attribute resolution mechanism. | Keys are LDAP attribute names, values are CAS attribute names. | Use this facility instead of a PrincipalResolver if LDAP is | the only attribute source. --> <entry key="displayName" value="displayName" /> <entry key="mail" value="mail" /> <entry key="memberOf" value="memberOf" /> </map> </property></bean><bean class="org.ldaptive.auth.Authenticator" c:resolver-ref="dnResolver" c:handler-ref="authHandler" p:entryResolver-ref="entryResolver" /><!-- Active Directory UPN format. --><bean class="org.ldaptive.auth.FormatDnResolver" c:format="%[email protected]${ldap.domain}" /><bean class="org.ldaptive.auth.PooledBindAuthenticationHandler" p:connectionFactory-ref="pooledLdapConnectionFactory" /><bean class="org.ldaptive.pool.PooledConnectionFactory" p:connectionPool-ref="connectionPool" /><bean class="org.ldaptive.pool.BlockingConnectionPool" init-method="initialize" p:poolConfig-ref="ldapPoolConfig" p:blockWaitTime="${ldap.pool.blockWaitTime}" p:validator-ref="searchValidator" p:pruneStrategy-ref="pruneStrategy" p:connectionFactory-ref="connectionFactory" /><bean class="org.ldaptive.pool.PoolConfig" p:minPoolSize="${ldap.pool.minSize}" p:maxPoolSize="${ldap.pool.maxSize}" p:validateOnCheckOut="${ldap.pool.validateOnCheckout}" p:validatePeriodically="${ldap.pool.validatePeriodically}" p:validatePeriod="${ldap.pool.validatePeriod}" /><bean class="org.ldaptive.DefaultConnectionFactory" p:connectionConfig-ref="connectionConfig" /><bean class="org.ldaptive.ConnectionConfig" p:ldapUrl="${ldap.url}" p:connectTimeout="${ldap.connectTimeout}" p:useStartTLS="${ldap.useStartTLS}" p:sslConfig-ref="sslConfig"/><bean class="org.ldaptive.ssl.SslConfig"> <property name="credentialConfig"> <bean class="org.ldaptive.ssl.X509CredentialConfig" p:trustCertificates="${ldap.trustedCert}" /> </property></bean><bean class="org.ldaptive.pool.IdlePruneStrategy" p:prunePeriod="${ldap.pool.prunePeriod}" p:idleTime="${ldap.pool.idleTime}" /><bean class="org.ldaptive.pool.SearchValidator" /><bean class="org.jasig.cas.authentication.support.UpnSearchEntryResolver" p:baseDn="${ldap.baseDn}" />

ldap exigindo a pesquisa autenticada

O snippet de configuração a seguir fornece um modelo para autenticação LDAP executada com as credenciais do Gerenciador. uma ligação. Copie a configuração para deployerConfigContext.xml e forneça valores para reservas de propriedade.

<bean class="org.jasig.cas.authentication.LdapAuthenticationHandler" p:principalIdAttribute="mail" c:authenticator-ref="authenticator"> <property name="principalAttributeMap"> <map> <!-- | This map provides a simple attribute resolution mechanism. | Keys are LDAP attribute names, values are CAS attribute names. | Use this facility instead of a PrincipalResolver if LDAP is | the only attribute source. --> <entry key="member" value="member" /> <entry key="mail" value="mail" /> <entry key="displayName" value="displayName" /> </map> </property></bean><bean class="org.ldaptive.auth.Authenticator" c:resolver-ref="dnResolver" c:handler-ref="authHandler" /><bean class="org.ldaptive.auth.PooledSearchDnResolver" p:baseDn="${ldap.baseDn}" p:subtreeSearch="true" p:allowMultipleDns="false" p:connectionFactory-ref="searchPooledLdapConnectionFactory" p:userFilter="${ldap.authn.searchFilter}" /><bean class="org.ldaptive.pool.PooledConnectionFactory" p:connectionPool-ref="searchConnectionPool" /><bean parent="abstractConnectionPool" p:connectionFactory-ref="searchConnectionFactory" /><bean class="org.ldaptive.DefaultConnectionFactory" p:connectionConfig-ref="searchConnectionConfig" /><bean parent="abstractConnectionConfig" p:connectionInitializer-ref="bindConnectionInitializer" /><bean class="org.ldaptive.BindConnectionInitializer" p:bindDn="${ldap.managerDn}"> <property name="bindCredential"> <bean class="org.ldaptive.Credential" c:password="${ldap.managerPassword}" /> </property></bean><bean abstract="true" class="org.ldaptive.pool.BlockingConnectionPool" init-method="initialize" p:poolConfig-ref="ldapPoolConfig" p:blockWaitTime="${ldap.pool.blockWaitTime}" p:validator-ref="searchValidator" p:pruneStrategy-ref="pruneStrategy" /><bean abstract="true" class="org.ldaptive.ConnectionConfig" p:ldapUrl="${ldap.url}" p:connectTimeout="${ldap.connectTimeout}" p:useStartTLS="${ldap.useStartTLS}" p:sslConfig-ref="sslConfig" /><bean class="org.ldaptive.pool.PoolConfig" p:minPoolSize="${ldap.pool.minSize}" p:maxPoolSize="${ldap.pool.maxSize}" p:validateOnCheckOut="${ldap.pool.validateOnCheckout}" p:validatePeriodically="${ldap.pool.validatePeriodically}" p:validatePeriod="${ldap.pool.validatePeriod}" /><bean class="org.ldaptive.ssl.SslConfig"> <property name="credentialConfig"> <bean class="org.ldaptive.ssl.X509CredentialConfig" p:trustCertificates="${ldap.trustedCert}" /> </property></bean><bean class="org.ldaptive.pool.IdlePruneStrategy" p:prunePeriod="${ldap.pool.prunePeriod}" p:idleTime="${ldap.pool.idleTime}" /><bean class="org.ldaptive.pool.SearchValidator" /><bean class="org.ldaptive.auth.PooledBindAuthenticationHandler" p:connectionFactory-ref="bindPooledLdapConnectionFactory" /><bean class="org.ldaptive.pool.PooledConnectionFactory" p:connectionPool-ref="bindConnectionPool" /><bean parent="abstractConnectionPool" p:connectionFactory-ref="bindConnectionFactory" /><bean class="org.ldaptive.DefaultConnectionFactory" p:connectionConfig-ref="bindConnectionConfig" /><bean parent="abstractConnectionConfig" />

ldap Suportando a pesquisa anônima

O snippet de configuração a seguir fornece um modelo para a autenticação LDAP realizada com uma pesquisa anônimaCollowed por uma ligação. Copie a configuração para deployerConfigContext.xml e forneça valores para reservas de propriedade.

<bean class="org.jasig.cas.authentication.LdapAuthenticationHandler" p:principalIdAttribute="mail" c:authenticator-ref="authenticator"> <property name="principalAttributeMap"> <map> <!-- | This map provides a simple attribute resolution mechanism. | Keys are LDAP attribute names, values are CAS attribute names. | Use this facility instead of a PrincipalResolver if LDAP is | the only attribute source. --> <entry key="member" value="member" /> <entry key="mail" value="mail" /> <entry key="displayName" value="displayName" /> </map> </property></bean><bean class="org.ldaptive.auth.Authenticator" c:resolver-ref="dnResolver" c:handler-ref="authHandler" /><bean class="org.ldaptive.auth.PooledSearchDnResolver" p:baseDn="${ldap.baseDn}" p:subtreeSearch="true" p:allowMultipleDns="false" p:connectionFactory-ref="searchPooledLdapConnectionFactory" p:userFilter="${ldap.authn.searchFilter}" /><bean class="org.ldaptive.pool.PooledConnectionFactory" p:connectionPool-ref="searchConnectionPool" /><bean parent="abstractConnectionPool" /><bean abstract="true" class="org.ldaptive.pool.BlockingConnectionPool" init-method="initialize" p:poolConfig-ref="ldapPoolConfig" p:blockWaitTime="${ldap.pool.blockWaitTime}" p:validator-ref="searchValidator" p:pruneStrategy-ref="pruneStrategy" p:connectionFactory-ref="connectionFactory" /><bean class="org.ldaptive.pool.PoolConfig" p:minPoolSize="${ldap.pool.minSize}" p:maxPoolSize="${ldap.pool.maxSize}" p:validateOnCheckOut="${ldap.pool.validateOnCheckout}" p:validatePeriodically="${ldap.pool.validatePeriodically}" p:validatePeriod="${ldap.pool.validatePeriod}" /><bean class="org.ldaptive.DefaultConnectionFactory" p:connectionConfig-ref="connectionConfig" /><bean class="org.ldaptive.ConnectionConfig" p:ldapUrl="${ldap.url}" p:connectTimeout="${ldap.connectTimeout}" p:useStartTLS="${ldap.useStartTLS}" p:sslConfig-ref="sslConfig" /><bean class="org.ldaptive.ssl.SslConfig"> <property name="credentialConfig"> <bean class="org.ldaptive.ssl.X509CredentialConfig" p:trustCertificates="${ldap.trustedCert}" /> </property></bean><bean class="org.ldaptive.pool.IdlePruneStrategy" p:prunePeriod="${ldap.pool.prunePeriod}" p:idleTime="${ldap.pool.idleTime}" /><bean class="org.ldaptive.pool.SearchValidator" /><bean class="org.ldaptive.auth.PooledBindAuthenticationHandler" p:connectionFactory-ref="bindPooledLdapConnectionFactory" /><bean class="org.ldaptive.pool.PooledConnectionFactory" p:connectionPool-ref="bindConnectionPool" /><bean parent="abstractConnectionPool" />

ldap Apoiamento de ligação direta

O snippet de configuração a seguir fornece um modelo para autenticação LDAP, onde nenhuma busca é necessária para confirmar o DN necessário para uma operação de ligação. Existem dois requisitos para este caso de uso:

  1. Todos os usuários estão em uma única filial no diretório, e. ou=Users,dc=example,dc=org
  2. O nome de usuário fornecido no formulário de login CAS faz parte do DN, e. uid=%s,ou=Users,dc=exmaple,dc=org

Copie a configuração para deployerConfigContext.xml e forneça valores para reservas de propriedade.

<bean class="org.jasig.cas.authentication.LdapAuthenticationHandler" p:principalIdAttribute="uid" c:authenticator-ref="authenticator"> <property name="principalAttributeMap"> <map> <!-- | This map provides a simple attribute resolution mechanism. | Keys are LDAP attribute names, values are CAS attribute names. | Use this facility instead of a PrincipalResolver if LDAP is | the only attribute source. --> <entry key="member" value="member" /> <entry key="mail" value="mail" /> <entry key="displayName" value="displayName" /> </map> </property></bean><bean class="org.ldaptive.auth.Authenticator" c:resolver-ref="dnResolver" c:handler-ref="authHandler" /><!-- | The following DN format works for many directories, but may need to be | customized. --><bean class="org.ldaptive.auth.FormatDnResolver" c:format="uid=%s,${ldap.baseDn}" /><bean class="org.ldaptive.auth.PooledBindAuthenticationHandler" p:connectionFactory-ref="pooledLdapConnectionFactory" /><bean class="org.ldaptive.pool.PooledConnectionFactory" p:connectionPool-ref="connectionPool" /><bean class="org.ldaptive.pool.BlockingConnectionPool" init-method="initialize" p:poolConfig-ref="ldapPoolConfig" p:blockWaitTime="${ldap.pool.blockWaitTime}" p:validator-ref="searchValidator" p:pruneStrategy-ref="pruneStrategy" p:connectionFactory-ref="connectionFactory" /><bean class="org.ldaptive.pool.PoolConfig" p:minPoolSize="${ldap.pool.minSize}" p:maxPoolSize="${ldap.pool.maxSize}" p:validateOnCheckOut="${ldap.pool.validateOnCheckout}" p:validatePeriodically="${ldap.pool.validatePeriodically}" p:validatePeriod="${ldap.pool.validatePeriod}" /><bean class="org.ldaptive.DefaultConnectionFactory" p:connectionConfig-ref="connectionConfig" /><bean class="org.ldaptive.ConnectionConfig" p:ldapUrl="${ldap.url}" p:connectTimeout="${ldap.connectTimeout}" p:useStartTLS="${ldap.useStartTLS}" p:sslConfig-ref="sslConfig" /><bean class="org.ldaptive.ssl.SslConfig"> <property name="credentialConfig"> <bean class="org.ldaptive.ssl.X509CredentialConfig" p:trustCertificates="${ldap.trustedCert}" /> </property></bean><bean class="org.ldaptive.pool.IdlePruneStrategy" p:prunePeriod="${ldap.pool.prunePeriod}" p:idleTime="${ldap.pool.idleTime}" /><bean class="org.ldaptive.pool.SearchValidator" />

LDAP Propriedades Starter

As seguintes propriedades de configuração LDAP fornecem um ponto de partida razoável para configurar o manipulador LDAPauthentication. A propriedade ldap.url deve ser alterada em um minumum. As propriedades LDAP podem ser adicionadas ao arquivo cas.properties Alternativamente, eles podem ser isolados em um arquivo ldap.properties e loadedinto o contexto do aplicativo de mola modificando o arquivo propertyFileConfigurer.xml

#========================================# General properties#========================================ldap.url=ldap://directory.ldaptive.org# LDAP connection timeout in millisecondsldap.connectTimeout=3000# Whether to use StartTLS (probably needed if not SSL connection)ldap.useStartTLS=true#========================================# LDAP connection pool configuration#========================================ldap.pool.minSize=3ldap.pool.maxSize=10ldap.pool.validateOnCheckout=falseldap.pool.validatePeriodically=true# Amount of time in milliseconds to block on pool exhausted condition# before giving up.ldap.pool.blockWaitTime=3000# Frequency of connection validation in seconds# Only applies if validatePeriodically=trueldap.pool.validatePeriod=300# Attempt to prune connections every N secondsldap.pool.prunePeriod=300# Maximum amount of time an idle connection is allowed to be in# pool before it is liable to be removed/destroyedldap.pool.idleTime=600#========================================# Authentication#========================================# Base DN of users to be authenticatedldap.authn.baseDn=ou=Users,dc=example,dc=org# Manager DN for authenticated searchesldap.authn.managerDN=uid=manager,ou=Users,dc=example,dc=org# Manager password for authenticated searchesldap.authn.managerPassword=nonsense# Search filter used for configurations that require searching for DNs#ldap.authn.searchFilter=(&(uid={user})(accountState=active))ldap.authn.searchFilter=(uid={user})# Search filter used for configurations that require searching for DNs#ldap.authn.format=uid=%s,ou=Users,dc=example,dc=orgldap.authn.format=%[email protected]

PrincipalResolver vs. authenticationHandler

A maquinaria de resolução principal fornecida por AuthenticationHandler Os componentes devem ser usados de preferênciaPrincipalResolver Em qualquer situação em que o primeiro fornece funcionalidade adequada.Se o diretor que é resolvido pelos handlersuffes de autenticação, então um valor pode ser passado No lugar do Resolver Bean ID:

LDAP Política de senha Implementação

O propósito do LPPE é duplo:

  • detecta um número de cenários que de outra forma impediriam a autenticação do usuário, usando especificamente uma instância LDAP como a principal fonte de contas de usuário.
  • Warn usuários cujo status da conta está perto de uma configuração Data de expiração e redirecionar o fluxo para um sistema externo de gerenciamento de identidade.

refletindo o status da conta LDAP

Os cenários abaixo são por padrão considerados erros que impedem a autenticação de maneira genérica através do fluxo normal de login CAS. O LPPE intercepta o fluxo de autenticação, detectando os códigos de erro padrão acima. Os códigos de erro são então traduzidos em mensagens adequadas no fluxo de login do CAS e permitiriam que o usuário assuma a ação adequada, explicando totalmente a natureza do problema.

  • ACCOUNT_LOCKED
  • ACCOUNT_DISABLED
  • INVALID_LOGON_HOURS
  • INVALID_WORKSTATION
  • PASSWORD_MUST_CHANGE
  • PASSWORD_EXPIRED

A tradução de erros de LDAP no fluxo de trabalho CAS é tudo tratado por LDaptive.

conta Notificação de expiração

LPPE também é capaz de avisar o usuário quando a conta estiver prestes a expirar.A política de expiração é determinada por meio de atributos LDAP pré-configurados com valores padrão no lugar.

Nenhum gerenciamento de senha!

LPPE não é sobre o gerenciamento de senha. Se você estiver procurando por esse tipo de capacidade integrando com CAS, você pode estar interessado em:

  • https://github.com/Unicon/cas-password-manager
  • http://code.google.com/p/pwm/

Configuração

LPPE é por padrão desligado. Para ativar o funcionalmente, navegue para src/main/webapp/WEB-INF/unused-spring-configuration e mova o arquivo lppe-configuration.xml XML para o spring-configuration diretório.

<bean class="org.jasig.cas.authentication.support.LdapPasswordPolicyConfiguration" p:alwaysDisplayPasswordExpirationWarning="${password.policy.warnAll}" p:passwordWarningNumberOfDays="${password.policy.warningDays}" p:passwordPolicyUrl="${password.policy.url}" p:accountStateHandler-ref="accountStateHandler" /> <!-- This component is suitable for most cases but can be replaced with a custom component for special cases. --><bean class="org.jasig.cas.authentication.support.DefaultAccountStateHandler" />

Em seguida, no seu ldapAuthenticationHandler bean, configure a senha Configuração de política acima:

<bean class="org.jasig.cas.authentication.LdapAuthenticationHandler" p:passwordPolicyConfiguration-ref="passwordPolicy"> ...</bean>

Em seguida, você precisa definir explicitamente um manipulador de resposta específico do LDAP em seu Authenticator .Para instância, para um diretório OpenLDAP (use ActiveDirectoryAuthenticationResponseHandler Em vez disso para o Active Directory):

<bean class="org.ldaptive.auth.Authenticator" c:resolver-ref="dnResolver" c:handler-ref="authHandler"> <property name="authenticationResponseHandlers"> <util:list> <bean class="org.ldaptive.auth.ext.PasswordPolicyAuthenticationResponseHandler" /> </util:list> </property></bean>

por último, para o OpenLDAP, você tem que lidar com os controles PasswordPolicy no BindAuthenticationHandler

<bean class="org.ldaptive.auth.PooledBindAuthenticationHandler" p:connectionFactory-ref="bindPooledLdapConnectionFactory"> <property name="authenticationControls"> <util:list> <bean class="org.ldaptive.control.PasswordPolicyControl" /> </util:list> </property></bean>

componentes

DefaultAccountStateHandler

O manipulador de estado da conta padrão, que calcula a senha Período de aviso de expiração, mapeia erros do LDAP para o fluxo de trabalho CAS.

OptionalWarningAccountStateHandler

suporta ambos os avisos opt-in e opt-out em uma base por usuário.

<bean class="org.jasig.cas.authentication.support.OptionalWarningAccountStateHandler" p:warningAttributeName="${password.warning.attr.name}" p:warningAttributeValue="${password.warning.attr.value}" p:displayWarningOnMatch="${password.warning.display.match}" />

Os dois primeiros parâmetros definem um atributo A entrada do usuário para corresponder, e o terceiro parâmetro determina os avisos de expiração de senha devem ser exibidos na correspondência.

Nota: os implantadores devem configurar componentes LDAP para fornecer O conjunto de atributos retornou da consulta LDAP para detalhes do usuário.

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *