Tomcat上的Spring Boot LDAP身份验证(预身份验证)

时间:2017-03-09 13:52:16

标签: tomcat authentication spring-boot spring-security ldap

我正在创建一个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 Manager,我可以使用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();
    }
}

我知道我可以直接在应用程序(authenticationManagerBuilder.ldapAuthentication()...)中配置LDAP连接,但这不是我想要的。

如何告诉Spring Boot使用Tomcat的LDAP身份验证来获取应用程序?

更新

看起来我必须启用Pre-Authentication。这可以使用.and().jee().mappableRoles("ROLE_ADMIN")完成。这似乎有效,但我仍然无法进行身份验证:No pre-authenticated principal found in request

我是否必须向Tomcats配置添加内容?

1 个答案:

答案 0 :(得分:2)

我找不到任何合适的解决方案,所以我完全删除了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>