使用 Jboss 和 Spring 引导的基于容器的 LDAP 身份验证

Container based LDAP authentication with Jboss and Spring boot

我有一个简单的 API 即 returns 一个字符串。我的 objective 是使用 LDAP 身份验证来保护我的 API。我在安全域下的 JBoss EAP 7.1 中配置了我的 LDAP。我在 web.xml 中定义了我的安全约束,在我的 jboss-web.xml 中定义了相应的安全域这是我第一次将 LDAP 与 REST API 集成。不确定出了什么问题,但是当我从浏览器中点击 API 时,它不断提示输入凭据 3 次,然后给出以下错误。

Whitelabel Error Page
This application has no explicit mapping for /error, so you are seeing this as a fallback.

Tue Feb 22 13:42:54 EST 2022
There was an unexpected error (type=Unauthorized, status=401).
Full authentication is required to access this resource 

如果我从邮递员那里点击,它会以 json 格式给出类似的错误...

{
"timestamp": 1645553512290,
"status": 401,
"error": "Unauthorized",
"message": "Bad credentials",
"path": "/SecureAPI/mypath"
}

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
   <security-constraint>
    <web-resource-collection>
      <web-resource-name>WebServiceSecurity</web-resource-name>
      <url-pattern>/</url-pattern>
      <http-method>GET</http-method>     
    </web-resource-collection>
    <auth-constraint>
      <role-name>ROLE_ADMIN</role-name>
    </auth-constraint>
    <user-data-constraint>
      <transport-guarantee>NONE</transport-guarantee>
    </user-data-constraint>
  </security-constraint>
  <security-role>
    <role-name>ROLE_ADMIN</role-name>
  </security-role>
  <login-config>
    <auth-method>BASIC</auth-method>
    <realm-name>basic ldap realm</realm-name>
  </login-config> 
</web-app>

jboss-web.xml

<?xml version="1.0" encoding="UTF-8"?>
<jboss-web xmlns="http://www.jboss.com/xml/ns/javaee"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation="
      http://www.jboss.com/xml/ns/javaee
      http://www.jboss.org/j2ee/schema/jboss-web_5_2.xsd">
  <context-root>SecureAPI</context-root>    
  <security-domain>java:/jaas/ldapLogin</security-domain>
</jboss-web> 

API

@RestController
public class SecuredController {
    
    @GetMapping("/mypath")
    public String sayHi() {
        return "This API is Secured";
    }

}

独立-完整-ha.xml 配置:

<security-domain name="ldapLogin">
                    <authentication>
                        <login-module code="org.jboss.security.auth.spi.LdapLoginModule" flag="required">
                            <module-option name="java.naming.factory.initial" value="com.sun.jndi.ldap.LdapCtxFactory"/>
                            <module-option name="java.naming.provider.url" value="ldaps://<ldapserver>:<port>"/>
                            <module-option name="java.naming.security.authentication" value="simple"/>
                            <module-option name="principalDNPrefix" value="uid="/>
                            <module-option name="principalDNSuffix" value=",ou=users,dc=bcn,dc=com"/>
                            <module-option name="rolesCtxDN" value="ou=groups,dc=bcn,dc=com"/>
                            <module-option name="uidAttributeID" value="uniqueMember"/>
                            <module-option name="matchOnUserDN" value="true"/>
                            <module-option name="roleAttributeID" value="cn"/>
                            <module-option name="roleAttributeIsDN" value="false"/>
                            <module-option name="unauthenticatedIdentity" value="guest"/>
                        </login-module>
                    </authentication>
                </security-domain>

我在 pom.xml 中的依赖项是:

<dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <version>${spring-boot.version}</version>
            <exclusions>
                <exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-tomcat</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>4.0.1</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
            <version>${spring-boot.version}</version>
        </dependency>
    </dependencies>

我的问题是,为什么从浏览器访问时 API 会多次提示输入凭据?我确认所提供的凭据没有任何问题。此外,json 响应表明存在一些未处理的异常。不确定,它来自哪里。任何建议都会有所帮助。

相同的配置适用于基于 SOAP 的服务。对于 REST,它不起作用。有区别吗?

spring 安全依赖性在我的 LDAP 身份验证之上增加了额外的安全性。我删除了依赖项并且它起作用了。