使用Spring Security和JBoss 7.2进行身份验证

时间:2014-10-07 15:09:37

标签: spring spring-mvc jboss spring-security

我正在寻找一种在JBoss 7.2上运行的Spring Security Web应用程序中针对Active Directory验证用户身份的方法。

关注that link,我总是得到“anonymousUser”,但希望看到我自己的用户名。当主要身份验证策略不起作用时,Spring Security似乎使用匿名身份验证。

这是我的设置:

  • Spring 4.0.6
  • Spring Security 3.2.4

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>

最后,我的要求是,如果当前用户在我的组织的网络上有活动会话,他必须有权访问该应用程序。然后,应用程序安全策略处理授权。

非常感谢您的帮助。

0 个答案:

没有答案