通过 Tomcat 的 Spring Boot LDAP 身份验证(预身份验证)
Posted
技术标签:
【中文标题】通过 Tomcat 的 Spring Boot LDAP 身份验证(预身份验证)【英文标题】:Spring Boot LDAP authentication over Tomcat (Pre-Authentication) 【发布时间】:2017-07-30 13:07:01 【问题描述】:我正在创建一个 Spring Boot 应用程序,它应该只能由 LDAP 中的用户访问。此应用程序应部署到 Tomcat 服务器(而不是嵌入式服务器)。 LDAP 的配置是在 Tomcat 本身中完成的:
<Realm className="org.apache.catalina.realm.LockOutRealm">
<Realm className="org.apache.catalina.realm.UserDatabaseRealm"
resourceName="UserDatabase"/>
<Realm className="org.apache.catalina.realm.JNDIRealm"
connectionURL="ldap://someldapserver:389"
userPattern="uid=0,dc=example,dc=com"
roleBase="dc=example,dc=com"
roleName="cn"
roleSearch="(uniqueMember=0)"/>
</Realm>
如果我尝试访问 Tomcat 管理器,我可以使用 LDAP 凭据进行身份验证,因此连接基本上可以正常工作。
这是我的配置:
@Configuration
@Order(SecurityProperties.ACCESS_OVERRIDE_ORDER)
public class SecurityConfiguration extends WebSecurityConfigurerAdapter
@Override
protected void configure(HttpSecurity http) throws Exception
http
.authorizeRequests()
.antMatchers("/test").permitAll()
.anyRequest().authenticated()
.and()
.formLogin().permitAll()
.and()
.logout().permitAll()
.and()
.csrf().disable();
我知道我可以直接在应用程序中配置 LDAP 连接 (authenticationManagerBuilder.ldapAuthentication()...
),但这不是我想要的。
我如何告诉 Spring Boot 使用来自 Tomcat 的 LDAP 身份验证来进行应用程序?
更新
看来我必须启用Pre-Authentication。这可以通过.and().jee().mappableRoles("ROLE_ADMIN")
完成。这似乎可行,但我仍然无法验证:No pre-authenticated principal found in request
。
我必须在 Tomcats 配置中添加一些东西吗?
【问题讨论】:
【参考方案1】:我找不到任何合适的解决方案,所以我完全删除了 Spring Security 并将约束添加到 web.xml
。使用context.xml
可以设置身份验证方法(例如,如果您希望切换到 tomcat-users.xml 身份验证,请参见下面的示例)。然后通过 Tomcat 进行身份验证。
web.xml:
<?xml version="1.0" encoding="UTF-8"?>
<web-app>
<security-constraint>
<web-resource-collection>
<web-resource-name>Authentication</web-resource-name>
<url-pattern>/test/test</url-pattern>
</web-resource-collection>
<auth-constraint>
<role-name>users</role-name>
</auth-constraint>
</security-constraint>
<login-config>
<auth-method>BASIC</auth-method>
</login-config>
<security-role>
<role-name>users</role-name>
</security-role>
</web-app>
context.xml:
<?xml version="1.0" encoding="UTF-8"?>
<Context>
<Realm className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase"/>
</Context>
【讨论】:
以上是关于通过 Tomcat 的 Spring Boot LDAP 身份验证(预身份验证)的主要内容,如果未能解决你的问题,请参考以下文章
Gradle Spring Boot 项目不能在 Tomcat 中作为 WAR 工作
通过 Tomcat 的 Spring Boot LDAP 身份验证(预身份验证)