我正在创建一个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配置添加内容?
答案 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>