使用 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 身份验证之上增加了额外的安全性。我删除了依赖项并且它起作用了。
我有一个简单的 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 身份验证之上增加了额外的安全性。我删除了依赖项并且它起作用了。