SpringBoot不使用Active Directory进行身份验证

时间:2018-03-02 21:16:40

标签: java spring-boot active-directory ldap

我是通过Spring启动新的Active Directory身份验证MS 2008服务器,但无法找到有效的干净示例。我已经尝试了几个无济于事。希望有人能正确地做到这一点,并告诉我我做错了什么或错过了什么。使用登录过程,不会返回用户信息,也不会对ADS进行身份验证。此外,如果有一种方法可以将用户从活动目录中拉出来填充用户表。根据安全配置,我可以获得登录页面,但它似乎没有进行身份验证,也没有根据通过调试器查看数据来提取用户配置文件。使用Spring STS IDE开发。感谢提前

**Application.Properties
######### LDAP security for company   ###############

spring.ldap.urls=ldap://dc1.domain.com:389/
spring.ldap.base= dc=domain, dc=com
spring.ldap.username=srvcacct
spring.ldap.password=password
spring.ldap.user.dn.pattern = uid={0}
spring.ldap.enabled=true

spring.ldap.embedded.base-dn=dc=domain,dc=com
spring.ldap.embedded.port=389
server.port=8443

server.ssl.trust-store=tomcat.cer
server.ssl.trust-store-password=tomcat2018
server.ssl.trust-store-provider=domain.com

*** WebSecurity ***
@Override
public void configure(WebSecurity web) throws Exception {
    web.ignoring().antMatchers("/static/**");
}

@Override
protected void configure(HttpSecurity http) throws Exception {
http
    .authorizeRequests()
    .antMatchers("/login**").permitAll()
    .antMatchers("/profile/**").fullyAuthenticated() 
    .antMatchers("/").permitAll()
    //.antMatchers("/index**").permitAll()
    //.antMatchers("/static**").permitAll()
    //.antMatchers("/**").fullyAuthenticated()
    .and()
    .formLogin()
            .loginPage("/login")
            .failureUrl("/login?error")
            .permitAll()
            .and()
    .logout()
            .invalidateHttpSession(true)
            .deleteCookies("JSESSIONID")
            .permitAll();

        http.csrf().disable();
    }

    @Autowired
    protected void configure(AuthenticationManagerBuilder authManagerBuilder) throws Exception {
        authManagerBuilder.authenticationProvider(activeDirectoryLdapAuthenticationProvider()).userDetailsService(userDetailsService());
    }

    @Bean
    public AuthenticationManager authenticationManager() {
        return new ProviderManager(Arrays.asList(activeDirectoryLdapAuthenticationProvider()));
    }

    @Bean
    public AuthenticationProvider activeDirectoryLdapAuthenticationProvider() {
        ActiveDirectoryLdapAuthenticationProvider provider = new ActiveDirectoryLdapAuthenticationProvider(ldapBaseDn, ldapURL);
        provider.setConvertSubErrorCodesToExceptions(true);
        provider.setUseAuthenticationRequestCredentials(true);
        provider.setAuthoritiesMapper(new SimpleAuthorityMapper());
        System.out.print("In AuthenticationProvider: " + provider + ldapBaseDn + ldapURL);
        return provider;
    }

}

** POM file
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>com.domain</groupId>
  <artifactId>lean</artifactId>
  <packaging>war</packaging>
  <version>0.0.1-SNAPSHOT</version>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.6.RELEASE</version> 
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
    </properties>

  <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>jstl</artifactId>
        </dependency>
        <dependency>
            <groupId>org.apache.tomcat.embed</groupId>
            <artifactId>tomcat-embed-jasper</artifactId>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <dependency>
            <groupId>com.microsoft.sqlserver</groupId>
            <artifactId>mssql-jdbc</artifactId>
            <version>6.2.2.jre8</version><!--$NO-MVN-MAN-VER$-->
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-orm</artifactId>
        </dependency>

        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-entitymanager</artifactId>
        </dependency>

        <!--  This is for the Security Spring Boot -->      
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.ldap</groupId>
            <artifactId>spring-ldap-core</artifactId>
        </dependency>   

        <dependency>
            <groupId>org.springframework.security</groupId>
            <artifactId>spring-security-ldap</artifactId>
        </dependency>

    <!-- JSON -->
        <dependency>
            <groupId>org.json</groupId>
            <artifactId>json</artifactId>
        </dependency>           

        <!-- Embedded H2 database used for testing -->
        <!-- test? -->

        <dependency>
            <groupId>org.hsqldb</groupId>
            <artifactId>hsqldb</artifactId>
            <scope>runtime</scope>  
        </dependency>

  </dependencies>
  <build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
    <finalName>lean</finalName>
  </build>
</project>

**Login Page **
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>


<c:set var="contextPath" value="${pageContext.request.contextPath}"/>

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <!-- The above 3 meta tags *must* come first in the head; any other head content must come *after* these tags -->
    <meta name="description" content="">
    <meta name="author" content="">

    <title>Log in with your credentials</title>

    <link rel="stylesheet" href="static/css/bootstrap.min.css">
</head>

<body>

<div class="container">

    <form method="POST" action="${contextPath}/login" class="form-signin">
        <h2 class="form-heading">Lean Log in</h2>

        <div class="form-group ${error != null ? 'has-error' : ''}">
            <span></span>
            <input name="username" required="" onchange="try{setCustomValidity('')}catch(e){}" oninvalid="setCustomValidity('Please enter a valid userID!')" type="text" class="form-control" placeholder="username"
                   autofocus="true"/>
            <input name="password" required="" onchange="try{setCustomValidity('')}catch(e){}" oninvalid="setCustomValidity('Please enter a password!')" type="password" class="form-control" placeholder="password"/>
            <span>${errorMsg}</span>

            <button class="btn btn-lg btn-primary btn-block" type="submit">Log In</button>
        </div>

    </form>

</div>
<!-- /container -->
<script src="static/js/jquery-3.2.1.slim.min.js"></script>
<script src="static/js/bootstrap.min.js"></script></body>
</html>

这就是我解决问题的方法部分问题在于我使用的是Spring 5.6版本。 这是我的修复:

 @Override
  protected void configure(HttpSecurity http) throws Exception {

    http
        .authorizeRequests()
            .antMatchers("/admin/**").hasAnyAuthority("ADMIN")
            .antMatchers("/user/**").hasAnyAuthority("ADMIN", "USER")
            .antMatchers("/profile/**").fullyAuthenticated() 
            .antMatchers("/static/**").permitAll()
            .antMatchers("/**").fullyAuthenticated()
        .and()
          .formLogin()
                .loginPage("/login")
                .failureUrl("/login?error")
                .permitAll()
                .and()
          .logout()
                .invalidateHttpSession(true)
                .deleteCookies("JSESSIONID")
                .permitAll();

        http.csrf().disable();
  }

  @Configuration
  protected static class AuthenticationConfiguration extends
          GlobalAuthenticationConfigurerAdapter {

      @Override
      public void init(AuthenticationManagerBuilder auth) throws Exception {
          ActiveDirectoryLdapAuthenticationProvider provider=
                  new ActiveDirectoryLdapAuthenticationProvider("mydomain.com", "ldap://domaincontroller.mydomain.com:389");
          provider.setConvertSubErrorCodesToExceptions(true);
          provider.setUseAuthenticationRequestCredentials(true);

          auth.authenticationProvider(provider);
      }
  }

}

0 个答案:

没有答案