From b296014ba480bc49565b2e9aad2dac2584277def Mon Sep 17 00:00:00 2001
From: Paul-Christian Volkmer <paul-christian.volkmer@mni.thm.de>
Date: Fri, 12 Apr 2013 13:57:08 +0200
Subject: [PATCH] Added basic support for LDAP authentication

---
 .gitignore                                    |  1 +
 pom.xml                                       |  5 +++
 .../arsnova/controller/LoginController.java   | 33 +++++++++++++++++++
 .../webapp/WEB-INF/spring/spring-security.xml |  8 +++++
 src/main/webapp/arsnova.properties.example    |  5 +++
 5 files changed, 52 insertions(+)

diff --git a/.gitignore b/.gitignore
index 043004ca4..fb7773093 100644
--- a/.gitignore
+++ b/.gitignore
@@ -4,3 +4,4 @@
 target/*
 chromedriver.log
 .checkstyle
+/target
diff --git a/pom.xml b/pom.xml
index 897842bf5..25badea9e 100644
--- a/pom.xml
+++ b/pom.xml
@@ -199,6 +199,11 @@
 			<artifactId>spring-security-cas</artifactId>
 			<version>${org.springframework.security-version}</version>
 		</dependency>
+		<dependency>
+			<groupId>org.springframework.security</groupId>
+			<artifactId>spring-security-ldap</artifactId>
+			<version>${org.springframework.security-version}</version>
+		</dependency>
 		<dependency>
 			<groupId>jstl</groupId>
 			<artifactId>jstl</artifactId>
diff --git a/src/main/java/de/thm/arsnova/controller/LoginController.java b/src/main/java/de/thm/arsnova/controller/LoginController.java
index ba7b932a7..e5304986e 100644
--- a/src/main/java/de/thm/arsnova/controller/LoginController.java
+++ b/src/main/java/de/thm/arsnova/controller/LoginController.java
@@ -20,6 +20,7 @@ package de.thm.arsnova.controller;
 
 import java.io.IOException;
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.List;
 
 import javax.servlet.ServletException;
@@ -38,9 +39,11 @@ import org.springframework.security.cas.authentication.CasAuthenticationToken;
 import org.springframework.security.cas.web.CasAuthenticationEntryPoint;
 import org.springframework.security.core.Authentication;
 import org.springframework.security.core.GrantedAuthority;
+import org.springframework.security.core.authority.GrantedAuthorityImpl;
 import org.springframework.security.core.authority.SimpleGrantedAuthority;
 import org.springframework.security.core.context.SecurityContextHolder;
 import org.springframework.security.core.token.Sha512DigestUtils;
+import org.springframework.security.ldap.authentication.LdapAuthenticationProvider;
 import org.springframework.security.web.context.HttpSessionSecurityContextRepository;
 import org.springframework.security.web.util.UrlUtils;
 import org.springframework.stereotype.Controller;
@@ -67,6 +70,9 @@ public class LoginController extends AbstractController {
 
 	@Autowired
 	private FacebookProvider facebookProvider;
+	
+	@Autowired
+	private LdapAuthenticationProvider ldapAuthenticationProvider;
 
 	@Autowired
 	private CasAuthenticationEntryPoint casEntryPoint;
@@ -136,6 +142,27 @@ public class LoginController extends AbstractController {
 		}
 		return null;
 	}
+	
+	@RequestMapping(value = { "/auth/login", "/doLogin" }, method = RequestMethod.POST)
+	public final View doLdapLogin(
+			@RequestParam("type") final String type,
+			@RequestParam(value = "user", required = false) final String userName,
+			@RequestParam(value = "referer", required = false) final String forcedReferer,
+			@RequestParam(value = "password", required = false) final String password,
+			final HttpServletRequest request,
+			final HttpServletResponse response
+	) throws IOException, ServletException {
+		if ("ldap".equals(type)) {
+			org.springframework.security.core.userdetails.User user =
+					new org.springframework.security.core.userdetails.User(
+							userName, password, true, true, true, true, this.getAuthorities()
+					);
+			
+			Authentication token = new UsernamePasswordAuthenticationToken(user, null, getAuthorities());
+			ldapAuthenticationProvider.authenticate(token);
+		}
+		return null;
+	}
 
 	@RequestMapping(value = { "/auth/", "/whoami" }, method = RequestMethod.GET)
 	@ResponseBody
@@ -153,4 +180,10 @@ public class LoginController extends AbstractController {
 		}
 		return new RedirectView(request.getHeader("referer") != null ? request.getHeader("referer") : "/");
 	}
+	
+	private Collection<? extends GrantedAuthority> getAuthorities() {
+		List<GrantedAuthority> authList = new ArrayList<GrantedAuthority>(2);
+		authList.add(new GrantedAuthorityImpl("ROLE_USER"));
+		return authList;
+	}
 }
diff --git a/src/main/webapp/WEB-INF/spring/spring-security.xml b/src/main/webapp/WEB-INF/spring/spring-security.xml
index ecd7f7669..7f77bfac0 100644
--- a/src/main/webapp/WEB-INF/spring/spring-security.xml
+++ b/src/main/webapp/WEB-INF/spring/spring-security.xml
@@ -14,6 +14,7 @@
         <security:authentication-provider ref="twitterAuthProvider" />
         <security:authentication-provider ref="googleAuthProvider" />
         <security:authentication-provider ref="casAuthenticationProvider" />
+        <security:authentication-provider ref="ldapAuthProvider" />
     </security:authentication-manager>
 
     <security:http entry-point-ref="facebookEntryPoint">
@@ -25,6 +26,13 @@
 		<security:custom-filter ref="requestSingleLogoutFilter" before="LOGOUT_FILTER" />  
     </security:http>
 
+    <!-- ######################### LDAP ############################# -->
+  
+	<security:ldap-server url="${security.ldap.url}" />
+	<security:ldap-authentication-provider id="ldapAuthProvider"
+		user-search-filter="${security.ldap.user-search-filter}"
+		user-search-base="${security.ldap.user-search-base}" />
+    
     <!-- ######################### FACEBOOK ######################### -->
     <bean id="facebookEntryPoint" class="com.github.leleuj.ss.oauth.client.web.OAuthAuthenticationEntryPoint"
         p:provider-ref="facebookProvider" />
diff --git a/src/main/webapp/arsnova.properties.example b/src/main/webapp/arsnova.properties.example
index 84060f6e4..8d6516561 100644
--- a/src/main/webapp/arsnova.properties.example
+++ b/src/main/webapp/arsnova.properties.example
@@ -10,6 +10,11 @@ security.twitter.secret=mC0HOvxiEgqwdDWCcDoy3q75nUQPu1bYRp1ncHWGd0
 security.google.key=110959746118.apps.googleusercontent.com
 security.google.secret=CkzUJZswY8rjWCCYnHVovyGA
 
+security.ldap.url=ldap://example.com:389/dc=example,dc=com
+security.ldap.user-search-filter=(uid={0})
+security.ldap.user-search-base="ou=people"
+
+
 security.ssl=false
 security.keystore=/etc/arsnova.thm.de.jks
 security.storepass=arsnova
-- 
GitLab