身份验证模式

默认情况下,目录使用内部数据库进行用户管理和身份验证。但是,还有其他一些可用的身份验证机制:

要使用的模式是在哪种模式下配置的 WEB-INF/config-security/config-security.xml 或通过环境变量 config.security.type

取消注释中的相关行 WEB-INF/config-security/config-security.xml

<import resource="config-security-{mode}.xml"/>

配置LDAP

Lightweight Directory Access Protocol (LDAP) 使GeoNetwork能够验证远程身份存储的用户名和密码。LDAP实施使用默认的地理网络登录用户界面元素。

GeoNetwork目前有两种配置LDAP的方法。另请验证中的替代方法 配置LDAP-层次结构

LDAP配置在中定义 WEB-INF/config-security/config-security.properties ,然后可以配置环境以更新上一个文件或重写文件中的属性 WEB-INF/config-security/config-security-overrides.properties .

  1. 定义LDAP连接:

    • ldap.base.provider.url :这告诉门户LDAP服务器所在的位置。确保具有目录的计算机可以与具有LDAP服务器的计算机进行连接。检查以确保适当的端口已打开等。

    • ldap.base.dn :这通常看起来像:“dc= [此处显示组织名称] ,dc=组织”

    • ldap.security.principal / ldap.security.credentials :定义用于绑定到LDAP的LDAP管理员用户。如果未定义,则进行匿名绑定。Principal是用户名,credentials属性是密码。

    # LDAP security properties
    ldap.base.provider.url=ldap://localhost:389
    ldap.base.dn=dc=fao,dc=org
    ldap.security.principal=cn=admin,dc=fao,dc=org
    ldap.security.credentials=ldap
    

    要验证设置是否正确,请尝试使用LDAP浏览器应用程序连接到LDAP服务器。

  2. 定义在LDAP结构中查找用户进行身份验证的位置:

    • ldap.base.search.base :这是目录将查找用户进行身份验证的位置。

    • ldap.base.dn.pattern :这是用户要绑定的可分辨名称。{0}将替换为在登录屏幕中键入的用户名。

    ldap.base.search.base=ou=people
    ldap.base.dn.pattern=uid={0},${ldap.base.search.base}
    #ldap.base.dn.pattern=mail={0},${ldap.base.search.base}
    

授权设置

使用LDAP时,可以从LDAP属性中定义GeoNetwork的用户信息和权限。

用户信息

用户信息可以从LDAP配置中为目录数据库中与LDAP属性匹配的每个用户属性检索。如果属性为空或未定义,则可以定义默认值。属性值由两部分组成,用 , 性格。第一部分是属性名称,第二部分是默认值,以防属性名称未定义或LDAP中的属性值为空。

配置如下:

# Map user information to LDAP attributes and default values
# ldapUserContextMapper.mapping[name]=ldap_attribute,default_value
ldapUserContextMapper.mapping[name]=cn,
ldapUserContextMapper.mapping[surname]=givenName,
ldapUserContextMapper.mapping[mail]=mail,data@myorganization.org
ldapUserContextMapper.mapping[organisation]=,myorganization
ldapUserContextMapper.mapping[kind]=,
ldapUserContextMapper.mapping[address]=,
ldapUserContextMapper.mapping[zip]=,
ldapUserContextMapper.mapping[state]=,
ldapUserContextMapper.mapping[city]=,
ldapUserContextMapper.mapping[country]=,

权限配置

用户组和用户配置文件可以根据LDAP信息随意设置。默认情况下,用户权限是从本地数据库管理的。如果应该使用LDAP信息定义用户权限,请设置 ldap.privilege.import 属性 true

ldap.privilege.import=true

从LDAP导入权限时,目录管理员可以决定创建在LDAP中定义的组,而不是在本地数据库中定义的组。为此,请将以下属性设置为true:

ldap.privilege.create.nonexisting.groups=false

要定义用户是哪些组的成员以及哪些配置文件是用户:

ldapUserContextMapper.mapping[privilege]=groups,sample
# If not set, the default profile is RegisteredUser
# Valid profiles are http://geonetwork-opensource.org/manuals/trunk/eng/developer/apidocs/geonetwork/org/fao/geonet/constants/Geonet.Profile.html
ldapUserContextMapper.mapping[profile]=privileges,RegisteredUser

属性配置:

  • 特权属性包含此用户所属的组。允许多个组。

  • profile属性包含用户的配置文件。

用户有效配置文件包括:

  • 管理员

  • UserAdmin

  • 审核人

  • 编辑

  • RegisteredUser

  • 客人

如果包含配置文件的LDAP属性与目录配置文件列表不匹配,则可以定义映射:

# Map LDAP custom profiles to catalog profiles. Not used if ldap.privilege.pattern is defined.
ldapUserContextMapper.profileMapping[Admin]=Administrator
ldapUserContextMapper.profileMapping[Editor]=Reviewer
ldapUserContextMapper.profileMapping[Public]=RegisteredUser

例如,在前面的配置中,属性值 Admin 将映射到 Administrator (这是目录的有效配置文件)。

属性可以定义用户的概要文件和组。要提取此信息,可以定义一个自定义模式来根据该属性填充用户权限:

  1. 为配置文件定义一个属性,为中的组定义一个属性 WEB-INF/config-security/config-security-overrides.properties

# In config-security-overrides.properties
ldapUserContextMapper.mapping[privilege]=cat_privileges,sample
  1. 为特权定义一个属性并定义自定义模式:

# In config-security.properties
ldap.privilege.pattern=CAT_(.*)_(.*)
ldap.privilege.pattern.idx.group=1
ldap.privilege.pattern.idx.profil=2

启用bean ldapUserContextMapper 对于 LDAPUserDetailsContextMapperWithPattern 在 ``WEB-INF/config-security/config-security-ldap.xml`

  <!--<bean id="ldapUserContextMapper"
      class="org.fao.geonet.kernel.security.ldap.LDAPUserDetailsContextMapper">
      <property name="mapping">
        <map/>
      </property>
      <property name="profileMapping">
        <map/>
      </property>
      <property name="ldapBaseDn" value="${ldap.base.dn}"/>
      <property name="importPrivilegesFromLdap" value="${ldap.privilege.import}"/>
      <property name="createNonExistingLdapGroup"
                value="${ldap.privilege.create.nonexisting.groups}"/>
      <property name="createNonExistingLdapUser" value="${ldap.privilege.create.nonexisting.users}"/>
      <property name="ldapManager" ref="ldapUserDetailsService"/>
      <property name="contextSource" ref="contextSource"/>
      <property name="ldapUsernameCaseInsensitive" value="${ldap.usernameCaseInsensitive:#{true}}"/>
  </bean>-->

  <bean id="ldapUserContextMapper" class="org.fao.geonet.kernel.security.ldap.LDAPUserDetailsContextMapperWithPattern">
    <property name="mapping">
        <map/>
    </property>
    <property name="profileMapping">
        <map/>
    </property>
    <property name="importPrivilegesFromLdap" value="${ldap.privilege.import}"/>
    <property name="createNonExistingLdapGroup" value="${ldap.privilege.create.nonexisting.groups}" />
    <property name="createNonExistingLdapUser" value="${ldap.privilege.create.nonexisting.users}" />

    <property name="ldapManager" ref="ldapUserDetailsService" />

    <property name="privilegePattern" value="${ldap.privilege.pattern}" />
    <property name="groupIndexInPattern" value="${ldap.privilege.pattern.idx.group}"/>
    <property name="profilIndexInPattern" value="${ldap.privilege.pattern.idx.profil}"/>

    <property name="contextSource" ref="contextSource" />
</bean>
  1. 定义用于提取组和角色的自定义位置(不支持组/角色组合)(在配置中使用LDAPUserDetailsContextMapperWithProfileSearch-安全.xml).

ldap.privilege.search.group.attribute=cn
ldap.privilege.search.group.object=ou=groups
#ldap.privilege.search.group.query=(&(objectClass=*)(memberUid=uid={0},${ldap.base.search.base},${ldap.base.dn})(cn=EL_*))
ldap.privilege.search.group.queryprop=memberuid
ldap.privilege.search.group.query=(&(objectClass=*)(memberUid=uid={0},${ldap.base.search.base},${ldap.base.dn})(|(cn=SP_*)(cn=EL_*)))
ldap.privilege.search.group.pattern=EL_(.*)
ldap.privilege.search.privilege.attribute=cn
ldap.privilege.search.privilege.object=ou=groups
ldap.privilege.search.privilege.query=(&(objectClass=*)(memberUid=uid={0},${ldap.base.search.base},${ldap.base.dn})(cn=SV_*))
ldap.privilege.search.privilege.pattern=SV_(.*)

LDAP属性可以包含以下配置,以定义不同类型的用户,例如:

cat_privileges=CAT_ALL_Administrator

-- Define a reviewer for the group GRANULAT
cat_privileges=CAT_GRANULAT_Reviewer

-- Define a reviewer for the group GRANULAT and editor for MIMEL
cat_privileges=CAT_GRANULAT_Reviewer
cat_privileges=CAT_MIMEL_Editor

-- Define a reviewer for the group GRANULAT and editor for MIMEL and RegisteredUser for NATURA2000
cat_privileges=CAT_GRANULAT_Reviewer
cat_privileges=CAT_MIMEL_Reviewer
cat_privileges=CAT_NATURA2000_RegisteredUser

-- Only a registered user for GRANULAT
cat_privileges=CAT_GRANULAT_RegisteredUser

同步

同步任务负责删除可能被删除的LDAP用户。例如:

  • T0:用户A登录目录。在用户数据库中创建本地用户A。

  • T1:用户A已从LDAP中删除(用户A无法再登录目录)。

  • T2:同步任务将检查LDAP中是否存在所有本地LDAP用户:

    • 如果用户没有任何记录,它将被删除。

    • 如果用户拥有元数据记录,则会向目录日志记录系统写入一条警告消息。在任务可以删除当前所有者之前,应将记录的所有者更改为其他用户。

默认情况下,任务每天运行一次。这可以在以下属性中更改:

# Run LDAP sync every day at 23:30
ldap.sync.cron=0 30 23 * * ?

以下属性允许对同步过程进行高级配置:

ldap.sync.user.search.base=${ldap.base.search.base}
ldap.sync.user.search.filter=(&(objectClass=*)(mail=*@*)(givenName=*))
ldap.sync.user.search.attribute=uid
ldap.sync.group.search.base=ou=groups
ldap.sync.group.search.filter=(&(objectClass=posixGroup)(cn=EL_*))
ldap.sync.group.search.attribute=cn
ldap.sync.group.search.pattern=EL_(.*)

调试

如果连接失败,请尝试在中增加LDAP的日志记录级别 WEB-INF/classes/log4j.xml

<logger name="geonetwork.ldap" additivity="false">
    <level value="DEBUG"/>
</logger>

或从配置设置中设置 Log levelDEV 暂时:

../../_images/setting-log-level.png

配置LDAP-层次结构

在2020年年中引入了一种稍有不同的LDAP配置方法。

这扩展了原始的配置基础设施(原始配置仍然可以正常工作,没有任何更改)。

在开始配置之前,您需要知道;

  1. LDAP服务器的URL

  2. 登录LDAP服务器(执行查询)的用户名/密码

  3. 查找用户的LDAP查询(给定用户在登录屏幕上输入的内容)

  4. 如何将用户的LDAP属性转换为用户的网络属性

  5. 查找用户所属组的LDAP查询

  6. 如何将LDAP组转换为GeoNetwork组/配置文件

注解

有一个 video developer chat 这将详细介绍如何配置LDAP,包括设置一个预先配置的LDAP服务器(使用apachedirectorystudio)进行测试/调试/学习。

注解

我应该使用层次结构还是原始配置?

如果您已经有一个现有的(原始)配置,就不需要移动到新的配置。两者之间的大部分代码是相同的。

如果您正在启动一个新的配置,我建议您使用层次结构配置。它更简单一些,并且由测试用例和测试基础设施支持。它还支持ldap,其中用户/组位于多个目录中。

配置LDAP bean(层次结构)

GeoNetwork附带了一个示例LDAP配置,您可以在ApacheDirectoryStudio中使用它来创建测试用例中使用的相同的LDAP服务器。还有一个连接到这个LDAP服务器的geonnetwork配置示例。请看 README.mdvideo developer chat 以获取指示。

注解

要使用此配置,请取消对“<import resource=“config security ldap”的注释-递归.xml“/>”行输入 web/src/main/webapp/WEB-INF/config-security/config-security.xml

  1. 配置 contextSource bean,其中包含对LDAP服务器的引用和可以执行LDAP查询的用户。

    <bean id="contextSource"   class="org.springframework.security.ldap.DefaultSpringSecurityContextSource">
        <constructor-arg value=“ldap://localhost:3333/dc=example,dc=com"/>
    
        <property name="userDn" value="cn=admin,ou=GIS Department,ou=Corporate Users,dc=example,dc=com"/>
        <property name="password" value="admin1"/>
    </bean>
    
  2. 配置 ldapUserSearch 带有用于查找用户的查询的bean(给定在登录页面中键入的内容)。

    注:设置 searchSubtreetrue 对LDAP进行递归搜索。使用 searchBase 控制搜索从哪个目录开始(“”表示从根目录开始)。

    <bean id="ldapUserSearch" class="…">
       <constructor-arg name="searchBase" value=""/>
       <constructor-arg name="searchFilter" value="(sAMAccountName={0})"/>
       <constructor-arg name="contextSource" ref="contextSource"/>
    
       <property name="searchSubtree" value="true"/>
    </bean>
    
  3. 配置 ldapUserContextMapper 如何将LDAP用户的属性转换为geonnetwork用户属性的bean(请参阅上面的原始配置文档)。

    注:该 value 部分有两部分。第一部分是LDAP属性的名称(可以为空)。如果LDAP属性丢失或为空,则第二部分是默认值(请参阅上面的原始配置文档)。

    <bean id="ldapUserContextMapper" class=“LDAPUserDetailsContextMapperWithProfileSearchEnhanced">
    
        <property name="mapping">
          <map>
            <entry key="name" value="cn,"/>
            <entry key="surname" value="sn,"/>
            <entry key="mail" value="mail,"/>
            <entry key="organisation" value=","/>
            <entry key="address" value=","/>
            <entry key="zip" value=","/>
            <entry key="state" value=","/>
            <entry key="city" value=","/>
            <entry key="country" value=","/>
    
            <entry key="profile" value=",RegisteredUser"/>
            <entry key="privilege" value=",none"/>
          </map>
        </property>
    
    </bean>
    
  4. 继续配置 ldapUserContextMapper 这样LDAP也可以为用户提供组/配置文件角色。

    注:该 ldapMembershipQuery 成员资格查询将在其中启动的LDAP目录(“”表示从LDAP的根目录开始)。

    <bean id="ldapUserContextMapper" class="LDAPUserDetailsContextMapperWithProfileSearchEnhanced">
    
        <property name="importPrivilegesFromLdap" value=“true"/>
    
        <!-- typically, don't want GN to modify the LDAP server! -->
        <property name="createNonExistingLdapGroup" value="false" />
        <property name="createNonExistingLdapUser" value="false" />
        <property name="ldapManager" ref="ldapUserDetailsService" />
    
        <property name="membershipSearchStartObject" value=""/>
        <property name="ldapMembershipQuery" value="(&amp;(objectClass=*)(member=cn={2})(cn=GCAT_*))"/>
    
    </bean>
    
  5. 继续配置 ldapUserContextMapper 这样LDAP角色就可以转换为GeoNetwork组/配置文件。

    注意:您可以使用多个 ldapRoleConverters .

    <bean id="ldapUserContextMapper" class="LDAPUserDetailsContextMapperWithProfileSearchEnhanced">
    
       <property name="ldapRoleConverters">
         <util:list>
           <ref bean="ldapRoleConverterGroupNameParser"/>
         </util:list>
       </property>
    
    </bean>
    

目前有两种方法可以将LDAP组转换为GeoNetwork组/概要文件。

  • 这个 LDAPRoleConverterGroupNameParser ,其工作原理与原始LDAP配置相同。它使用正则表达式将LDAP组名解析为GeoNetwork组/概要文件。这将转换LDAP角色 GCAT_GENERAL_EDITOR 加入GeoNetwork组 GENERAL 带侧断面 Editor.

    <bean id="ldapRoleConverterGroupNameParser"  class="LDAPRoleConverterGroupNameParser">
    
        <property name="ldapMembershipQueryParser" value="GCAT_(.*)_(.*)"/>
        <property name="groupIndexInPattern" value="1"/>
        <property name="profileIndexInPattern" value=“2"/>
    
        <property name="profileMapping">
          <map>
            <entry key="ADMIN" value="Administrator"/>
            <entry key="EDITOR" value="Editor"/>
          </map>
        </property>
    
    </bean>
    
  • 还有一种更直接的方法 LDAPRoleConverterGroupNameConverter . 这将直接将LDAP组名转换为geonnetwork组/概要文件的列表。

    <bean id=“ldapRoleConverterGroupNameParser" class="LDAPRoleConverterGroupNameConverter">
    
        <property name="convertMap">
          <map>
    
            <entry>
                <key>
                    <value>HGIS_GeoNetwork_Admin</value>
                </key>
                <list>
    
                    <bean class="org.fao.geonet.kernel.security.ldap.LDAPRole">
                      <constructor-arg name="groupName" type="java.lang.String" value="myGroup"/>
                      <constructor-arg name="profileName" type="java.lang.String" value="Administrator"/>
                    </bean>
    
                </list>
            </entry>
            <entry>
              <key>
                    <value>HGIS_GeoNetwork_Editor</value>
              </key>
              <list>
    
                <bean class="org.fao.geonet.kernel.security.ldap.LDAPRole">
                  <constructor-arg name="groupName" type="java.lang.String" value=“myGroup"/>
                  <constructor-arg name="profileName" type="java.lang.String" value="Editor"/>
                </bean>
    
              </list>
            </entry>
          </map>
        </property>
    </bean>
    

配置CA

要启用CAS,请通过包括 WEB-INF/config-security/config-security-cas.xml 在里面 WEB-INF/config-security/config-security.xml ,取消注释以下行:

<import resource="config-security-cas.xml"/>
<import resource="config-security-cas-ldap.xml"/>

CAS可以使用LDAP或数据库进行用户管理。要使用数据库,请取消对以下行的注释:

<import resource="config-security-cas.xml"/>
<import resource="config-security-cas-database.xml"/>

CAS配置在中定义 WEB-INF/config-security/config-security.properties . 可以通过更新上一个文件或在文件中定义属性重写来配置环境 WEB-INF/config-security/config-security-overrides.properties

cas.baseURL=https://localhost:8443/cas
cas.ticket.validator.url=${cas.baseURL}
cas.login.url=${cas.baseURL}/login
cas.logout.url=${cas.baseURL}/logout?url=${geonetwork.https.url}/

配置密钥罩

Keycloak 是一种软件解决方案,可方便存储身份验证详细信息、用户联合、身份代理和社交登录。可以将GeoNetwork设置为使用密钥罩实例进行身份验证。

根据说明安装KeyCloak,或在Docker https://www.keycloak.org/getting-started/getting-started-docker中使用此示例设置

密钥罩详细信息是通过环境变量定义的

KEYCLOAK_AUTH_SERVER_URL={keycloak url}
KEYCLOAK_REALM={realm name}
KEYCLOAK_RESOURCE={client name}
KEYCLOAK_SECRET={client secret}
KEYCLOAK_DISABLE_TRUST_MANAGER={true|false}

您可以通过编辑该文件来设置更多高级密钥遮盖设置 WEB-INF/config-security/keycloak.json

GeonNetwork客户端URL配置

确保在配置客户端时设置了有效的重定向URI,以将URI重定向到Geonnetwork安装。即https://localhost:8443/geonetwork/*.如果设置不正确,您可能会收到指示提供了错误的重定向URI的错误信息。此外,如果要测试客户端反向通道注销,请确保还将管理员URL设置为geonnetwork安装。

示例用户/角色/组设置

角色设置示例

在您的客户端角色设置中(Clients->MyClient->Roles)。添加以下角色

Administrator
RegisteredUser
Guest
sample:UserAdmin
sample:Reviewer
sample:Editor
sample:RegisteredUser

样例组配置

  1. 转到钥匙披风组(左侧菜单)。

  2. 创建名为“Administrator”的新组

  3. 编辑组。转到Role Mappings->Client Roles(Myclient)->选择管理员角色,然后单击“Add Selected”任何加入管理员组的用户都将成为Geonnetwork管理员。

示例用户配置

  1. 转到键盘遮盖用户(左侧菜单)

  2. 添加或选择现有用户。然后转到该用户。

  3. 转到Role Mappings->Client Roles(Myclient)->选择要应用的可用角色,然后单击“Add Selected”或转到Groups->Available Groups->单击Administrator Group,然后单击“Join”

中描述了Geoserver的类似设置 geoserver documentation

配置Shibboleth

目录可以在SAML安全联盟中操作。Shibboleth应该安装在Apache中,如前所述 here . 目录是通过Apache访问的。通过包括 WEB-INF/config-security/config-security-shibboleth.xml 在里面 WEB-INF/config-security/config-security.xml . 然后可以在中配置环境 config-security-shibboleth-overrides.properties .