我正在寻找一种在JBoss 7.2上运行的Spring Security Web应用程序中针对Active Directory验证用户身份的方法。
关注that link,我总是得到“anonymousUser”,但希望看到我自己的用户名。当主要身份验证策略不起作用时,Spring Security似乎使用匿名身份验证。
这是我的设置:
SecurityConfig.java
@Configuration
@EnableWebMvcSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
public void registerGlobalAuthentication(AuthenticationManagerBuilder auth) throws Exception {
DefaultSpringSecurityContextSource context = new DefaultSpringSecurityContextSource("ldap://my_ldap_server:389");
context.setUserDn("MY_SERVICE_ACCOUNT_DISTINGUISHED_NAME");
context.setPassword("MY_SERVICE_ACCOUNT_PASSWORD");
context.afterPropertiesSet();
auth
.ldapAuthentication()
.contextSource(context)
.userDnPatterns("(sAMAccountName={0})")
.rolePrefix("");
}
@Override
protected void configure(HttpSecurity http) throws Exception {
/*
http
.authorizeRequests()
.anyRequest().authenticated();
*/
}
}
如果我取消注释configure(HttpSecurity http)方法体,我得到了403 Access Denied页面,这意味着(我猜)我没有经过身份验证。
LoginController.java
@Controller
public class LoginController {
@RequestMapping(value = "/login", method = RequestMethod.GET)
public String login() {
Authentication auth = SecurityContextHolder.getContext().getAuthentication();
String strRemoteUser = auth.getName();
System.out.println("[SPRING4BASE] Welcome " + strRemoteUser);
return "welcome";
}
}
的JBoss-web.xml中
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE policy PUBLIC
"-//JBoss//DTD JBOSS Security Config 3.0//EN"
"http://www.jboss.org/j2ee/dtd/security_config.dtd">
<jboss-web>
<security-domain>java:/jaas/other</security-domain>
</jboss-web>
JBoss安全域定义(standalone.xml):
<subsystem xmlns="urn:jboss:domain:security:1.2">
<security-domains>
<security-domain name="other" cache-type="default">
<authentication>
<login-module code="org.jboss.security.auth.spi.LdapExtLoginModule" flag="required">
<module-option name="java.naming.provider.url" value="ldap://my_ldap_server:389"/>
<module-option name="java.naming.security.authentication" value="simple"/>
<module-option name="java.naming.referral" value="follow"/>
<module-option name="bindDN" value="MY_SERVICE_ACCOUNT_DISTINGUISHED_NAME"/>
<module-option name="bindCredential" value="MY_SERVICE_ACCOUNT_PASSWORD"/>
<module-option name="baseCtxDN" value="MY_BASE_LDAP_CONTEXT"/>
<module-option name="baseFilter" value="(sAMAccountName={0})"/>
<module-option name="rolesCtxDN" value="MY_BASE_LDAP_CONTEXT"/>
<module-option name="roleFilter" value="(member={1})"/>
<module-option name="roleAttributeID" value="CN"/>
<module-option name="searchScope" value="SUBTREE_SCOPE"/>
<module-option name="allowEmptyPasswords" value="false"/>
</login-module>
</authentication>
</security-domain>
</security-domains>
</subsystem>
最后,我的要求是,如果当前用户在我的组织的网络上有活动会话,他必须有权访问该应用程序。然后,应用程序安全策略处理授权。
非常感谢您的帮助。