Merge pull request #21 from corsoft/master
spring-security-mvc-ldap - initial version
This commit is contained in:
		
						commit
						e60010dd76
					
				
							
								
								
									
										20
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										20
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							| @ -4,3 +4,23 @@ | ||||
| *.jar | ||||
| *.war | ||||
| *.ear | ||||
| 
 | ||||
| 
 | ||||
| # Eclipse | ||||
| .classpath | ||||
| .project | ||||
| .settings/ | ||||
| .prefs | ||||
| *.prefs | ||||
| 
 | ||||
| # Intellij | ||||
| .idea/ | ||||
| *.iml | ||||
| *.iws | ||||
| 
 | ||||
| # Mac | ||||
| .DS_Store | ||||
| 
 | ||||
| # Maven | ||||
| log/ | ||||
| target/ | ||||
|  | ||||
							
								
								
									
										17
									
								
								spring-security-mvc-ldap/README.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								spring-security-mvc-ldap/README.md
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,17 @@ | ||||
| 
 | ||||
| ## Spring Security with LDAP Example Project | ||||
| 
 | ||||
| 
 | ||||
| ### Relevant Article:  | ||||
| - [Spring Security - security none, filters none, access permitAll](http://www.baeldung.com/security-none-filters-none-access-permitAll) | ||||
| - [Spring Security Basic Authentication](http://www.baeldung.com/spring-security-basic-authentication) | ||||
| 
 | ||||
| 
 | ||||
| ### Notes | ||||
| - the project uses Spring Boot - simply run 'SampleLDAPApplication.java' to start up Spring Boot with a Tomcat container and embedded LDAP server. | ||||
| - Once started, open 'http://localhost:8080' | ||||
| - This will display the publicly available Home Page | ||||
| - Navigate to 'Secure Page' to trigger authentication | ||||
| - Username: 'baeldung', password: 'password' | ||||
| - This will authenticate you, and display your allocated roles (as defined in the 'users.ldif' file) | ||||
| 
 | ||||
							
								
								
									
										75
									
								
								spring-security-mvc-ldap/pom.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										75
									
								
								spring-security-mvc-ldap/pom.xml
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,75 @@ | ||||
| <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/xsd/maven-4.0.0.xsd"> | ||||
| 	<modelVersion>4.0.0</modelVersion> | ||||
| 	<groupId>org.baeldung</groupId> | ||||
| 	<artifactId>spring-security-mvc-ldap</artifactId> | ||||
| 	<version>0.1-SNAPSHOT</version> | ||||
| 
 | ||||
| 	<name>spring-security-mvc-ldap</name> | ||||
| 	<packaging>war</packaging> | ||||
| 
 | ||||
| 	<parent> | ||||
| 		<groupId>org.springframework.boot</groupId> | ||||
| 		<artifactId>spring-boot-starter-parent</artifactId> | ||||
| 		<version>1.1.1.RELEASE</version> | ||||
| 	</parent> | ||||
| 
 | ||||
| 	<dependencies> | ||||
| 
 | ||||
| 		<!-- Spring Boot Dependencies --> | ||||
| 		<dependency> | ||||
| 			<groupId>org.springframework.boot</groupId> | ||||
| 			<artifactId>spring-boot-starter-security</artifactId> | ||||
| 		</dependency> | ||||
| 		<dependency> | ||||
| 			<groupId>org.springframework.boot</groupId> | ||||
| 			<artifactId>spring-boot-starter-thymeleaf</artifactId> | ||||
| 		</dependency> | ||||
| 
 | ||||
| 		<!-- LDAP Dependencies --> | ||||
| 		<dependency> | ||||
| 			<groupId>org.springframework.security</groupId> | ||||
| 			<artifactId>spring-security-ldap</artifactId> | ||||
| 			<version>3.2.4.RELEASE</version> | ||||
| 		</dependency> | ||||
| 
 | ||||
| 		<dependency> | ||||
| 			<groupId>org.springframework.ldap</groupId> | ||||
| 			<artifactId>spring-ldap-core</artifactId> | ||||
| 			<version>2.0.2.RELEASE</version> | ||||
| 		</dependency> | ||||
| 		<dependency> | ||||
| 			<groupId>org.springframework.ldap</groupId> | ||||
| 			<artifactId>spring-ldap-core-tiger</artifactId> | ||||
| 			<version>2.0.2.RELEASE</version> | ||||
| 		</dependency> | ||||
| 
 | ||||
| 		<dependency> | ||||
| 			<!-- Is the ApacheDS server - 1.5.6 and 1.5.7 don't work --> | ||||
| 			<groupId>org.apache.directory.server</groupId> | ||||
| 			<artifactId>apacheds-server-jndi</artifactId> | ||||
| 			<version>1.5.5</version> | ||||
| 		</dependency> | ||||
| 		<dependency> | ||||
| 			<groupId>org.apache.mina</groupId> | ||||
| 			<artifactId>mina-core</artifactId> | ||||
| 			<version>2.0.7</version> | ||||
| 		</dependency> | ||||
| 
 | ||||
| 	</dependencies> | ||||
| 
 | ||||
| 	<build> | ||||
| 		<finalName>spring-security-mvc-ldap</finalName> | ||||
| 		<resources> | ||||
| 			<resource> | ||||
| 				<directory>src/main/resources</directory> | ||||
| 				<filtering>true</filtering> | ||||
| 			</resource> | ||||
| 		</resources> | ||||
| 	</build> | ||||
| 
 | ||||
| 	<properties> | ||||
| 
 | ||||
| 	</properties> | ||||
| 
 | ||||
| </project> | ||||
| @ -0,0 +1,27 @@ | ||||
| package org.baeldung; | ||||
| 
 | ||||
| import org.springframework.boot.SpringApplication; | ||||
| import org.springframework.boot.autoconfigure.EnableAutoConfiguration; | ||||
| import org.springframework.context.annotation.ComponentScan; | ||||
| import org.springframework.web.servlet.config.annotation.ViewControllerRegistry; | ||||
| import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; | ||||
| 
 | ||||
| /** | ||||
|  * Main Application Class - uses Spring Boot. Just run this as a normal Java | ||||
|  * class to run up a Jetty Server (on http://localhost:8080) | ||||
|  *  | ||||
|  */ | ||||
| @EnableAutoConfiguration | ||||
| @ComponentScan("org.baeldung") | ||||
| public class SampleLDAPApplication extends WebMvcConfigurerAdapter { | ||||
| 
 | ||||
| 	public static void main(String[] args) { | ||||
| 		SpringApplication.run(SampleLDAPApplication.class, args); | ||||
| 	} | ||||
| 
 | ||||
| 	@Override | ||||
| 	public void addViewControllers(ViewControllerRegistry registry) { | ||||
| 		registry.addViewController("/login").setViewName("login"); | ||||
| 	} | ||||
| 
 | ||||
| } | ||||
| @ -0,0 +1,74 @@ | ||||
| package org.baeldung.controller; | ||||
| 
 | ||||
| import java.security.Principal; | ||||
| import java.util.Arrays; | ||||
| import java.util.Collection; | ||||
| import java.util.HashSet; | ||||
| import java.util.List; | ||||
| import java.util.Map; | ||||
| import java.util.Set; | ||||
| 
 | ||||
| import org.springframework.security.core.Authentication; | ||||
| import org.springframework.security.core.GrantedAuthority; | ||||
| import org.springframework.security.core.userdetails.UserDetails; | ||||
| import org.springframework.stereotype.Controller; | ||||
| import org.springframework.web.bind.annotation.RequestMapping; | ||||
| 
 | ||||
| /** | ||||
|  * Spring Controller Definitions. | ||||
|  */ | ||||
| @Controller | ||||
| public class MyController { | ||||
| 
 | ||||
| 	@RequestMapping("/") | ||||
| 	public String init(Map<String, Object> model, Principal principal) { | ||||
| 		model.put("title", "PUBLIC AREA"); | ||||
| 		model.put("message", "Any user can view this page"); | ||||
| 	    model.put("username", getUserName(principal)); | ||||
| 	    model.put("userroles", getUserRoles(principal)); | ||||
| 		return "home"; | ||||
| 	} | ||||
| 
 | ||||
| 	@RequestMapping("/secure") | ||||
| 	public String secure(Map<String, Object> model, Principal principal) {	 | ||||
| 		model.put("title", "SECURE AREA"); | ||||
| 		model.put("message", "Only Authorised Users Can See This Page"); | ||||
| 		model.put("username", getUserName(principal)); | ||||
| 		model.put("userroles", getUserRoles(principal)); | ||||
| 		return "home"; | ||||
| 	} | ||||
| 	 | ||||
| 	private String getUserName(Principal principal){ | ||||
| 		 | ||||
| 		if(principal == null){ | ||||
| 			return "anonymous"; | ||||
| 		}else{ | ||||
| 			 | ||||
| 			final UserDetails currentUser = (UserDetails) ((Authentication) principal).getPrincipal();  | ||||
| 			Collection<? extends GrantedAuthority> authorities = currentUser.getAuthorities(); | ||||
| 			for(GrantedAuthority grantedAuthority : authorities) { | ||||
| 				System.out.println(grantedAuthority.getAuthority()); | ||||
| 			} | ||||
| 			return principal.getName(); | ||||
| 		} | ||||
| 	} | ||||
| 	 | ||||
| 	private Collection<String> getUserRoles(Principal principal){ | ||||
| 		 | ||||
| 		if(principal == null){ | ||||
| 			return Arrays.asList("none"); | ||||
| 		}else{ | ||||
| 			 | ||||
| 			Set<String> roles = new HashSet<String>(); | ||||
| 			 | ||||
| 			final UserDetails currentUser = (UserDetails) ((Authentication) principal).getPrincipal();  | ||||
| 			Collection<? extends GrantedAuthority> authorities = currentUser.getAuthorities(); | ||||
| 			for(GrantedAuthority grantedAuthority : authorities) { | ||||
| 				roles.add(grantedAuthority.getAuthority()); | ||||
| 			} | ||||
| 			return roles; | ||||
| 		} | ||||
| 	} | ||||
| 	 | ||||
| } | ||||
| 
 | ||||
| @ -0,0 +1,51 @@ | ||||
| package org.baeldung.security; | ||||
| 
 | ||||
| import org.springframework.boot.autoconfigure.EnableAutoConfiguration; | ||||
| import org.springframework.context.annotation.ComponentScan; | ||||
| import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; | ||||
| import org.springframework.security.config.annotation.web.builders.HttpSecurity; | ||||
| import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; | ||||
| import org.springframework.stereotype.Controller; | ||||
| 
 | ||||
| /** | ||||
|  * Security Configuration - LDAP and HTTP Authorizations. | ||||
|  */ | ||||
| @EnableAutoConfiguration | ||||
| @ComponentScan | ||||
| @Controller | ||||
| public class SecurityConfig extends WebSecurityConfigurerAdapter { | ||||
| 
 | ||||
| 	@Override | ||||
| 	protected void configure(AuthenticationManagerBuilder auth) | ||||
| 			throws Exception { | ||||
| 		 | ||||
| 		auth.ldapAuthentication() | ||||
| 		.userSearchBase("ou=people") | ||||
| 		.userSearchFilter("(uid={0})") | ||||
| 		.groupSearchBase("ou=groups") | ||||
| 		.groupSearchFilter("member={0}") | ||||
| 		.contextSource() | ||||
| 		.root("dc=baeldung,dc=com") | ||||
| 		.ldif("classpath:users.ldif"); | ||||
| 		 | ||||
| 	} | ||||
| 	 | ||||
| 	@Override | ||||
| 	protected void configure(HttpSecurity http) throws Exception { | ||||
| 
 | ||||
|         http | ||||
|         .authorizeRequests() | ||||
|             .antMatchers("/", "/home").permitAll() | ||||
|             .anyRequest().authenticated(); | ||||
| 		http | ||||
|         .formLogin() | ||||
|             .loginPage("/login") | ||||
|             .permitAll() | ||||
|             .and() | ||||
|         .logout() | ||||
|             .logoutSuccessUrl("/"); | ||||
| 
 | ||||
| 	 | ||||
| 	} | ||||
| 	 | ||||
| } | ||||
							
								
								
									
										22
									
								
								spring-security-mvc-ldap/src/main/resources/logback.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								spring-security-mvc-ldap/src/main/resources/logback.xml
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,22 @@ | ||||
| <configuration> | ||||
| 
 | ||||
| 	<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> | ||||
| 		<encoder> | ||||
| 			<pattern>web - %date [%thread] %-5level %logger{36} - %message%n | ||||
| 			</pattern> | ||||
| 		</encoder> | ||||
| 	</appender> | ||||
| 
 | ||||
| 	<logger name="org.springframework" level="WARN" /> | ||||
| 	<logger name="org.springframework.transaction" level="WARN" /> | ||||
| 
 | ||||
| 	<logger name="org.springframework.web.servlet.mvc" level="WARN" /> | ||||
| 
 | ||||
| 	<logger name="org.springframework.boot" level="WARN" /> | ||||
| 	<logger name="org.springframework.security" level="WARN" /> | ||||
| 
 | ||||
| 	<root level="INFO"> | ||||
| 		<appender-ref ref="STDOUT" /> | ||||
| 	</root> | ||||
| 
 | ||||
| </configuration> | ||||
							
								
								
									
										13
									
								
								spring-security-mvc-ldap/src/main/resources/static/css/bootstrap.min.css
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								spring-security-mvc-ldap/src/main/resources/static/css/bootstrap.min.css
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							| @ -0,0 +1,32 @@ | ||||
| <!DOCTYPE html> | ||||
| <html xmlns:th="http://www.thymeleaf.org"> | ||||
| <head> | ||||
| <title>Error</title> | ||||
| <link rel="stylesheet" th:href="@{/css/bootstrap.min.css}" | ||||
| 	href="../../css/bootstrap.min.css" /> | ||||
| </head> | ||||
| <body> | ||||
| 	<div class="container"> | ||||
| 		<div class="navbar"> | ||||
| 			<div class="navbar-inner"> | ||||
| 				<a class="brand" href="http://www.thymeleaf.org"> Thymeleaf - | ||||
| 					Plain </a> | ||||
| 				<ul class="nav"> | ||||
| 					<li><a th:href="@{/}" href="home.html"> Home </a></li> | ||||
| 					<li><a th:href="@{/secure}" href="secure.html"> Secure Page </a></li> | ||||
| 				</ul> | ||||
| 			</div> | ||||
| 		</div> | ||||
| 		<h1 th:text="${title}"></h1> | ||||
| 		<div id="created" th:text="${#dates.format(timestamp)}"></div> | ||||
| 		<div> | ||||
| 			There was an unexpected error (type=<span th:text="${error}">Bad</span>, status=<span th:text="${status}">500</span>). | ||||
| 		</div> | ||||
| 		<div th:text="${message}">Fake content</div> | ||||
| 		<div> | ||||
| 			Please contact the operator with the above information. | ||||
| 		</div> | ||||
| 		 | ||||
| 	</div> | ||||
| </body> | ||||
| </html> | ||||
| @ -0,0 +1,37 @@ | ||||
| <!DOCTYPE html> | ||||
| <html xmlns:th="http://www.thymeleaf.org"> | ||||
| <head> | ||||
| <title th:text="${title}">Title</title> | ||||
| <link rel="stylesheet" th:href="@{/css/bootstrap.min.css}" | ||||
| 	href="../../css/bootstrap.min.css" /> | ||||
| </head> | ||||
| <body> | ||||
| 	<div class="container"> | ||||
| 	 | ||||
| 		<div class="navbar"> | ||||
| 			<div class="navbar-inner"> | ||||
| 				<a class="brand" href="http://www.thymeleaf.org"> Thymeleaf - | ||||
| 					Plain </a> | ||||
| 				<ul class="nav"> | ||||
| 					<li><a th:href="@{/}" href="home.html"> Home </a></li> | ||||
| 					<li><a th:href="@{/secure}" href="home.html"> Secure Page </a></li> | ||||
| 				</ul> | ||||
| 			</div> | ||||
| 		</div> | ||||
| 		 | ||||
| 		 | ||||
| 		<div id="content"> | ||||
| 			<p> | ||||
| 				<h1 th:text="${title}"></h1> | ||||
| 				<h2 th:text="${message}"></h2> | ||||
| 			</p> | ||||
| 		</div> | ||||
| 		 | ||||
| 		<div id="footer"> | ||||
| 			<p> | ||||
| 				Logged in as: <span th:text="${username}"></span>, Roles: <span th:text="${userroles}"></span> | ||||
| 			</p> | ||||
| 		</div> | ||||
| 	</div> | ||||
| </body> | ||||
| </html> | ||||
| @ -0,0 +1,36 @@ | ||||
| <!DOCTYPE html> | ||||
| <html xmlns:th="http://www.thymeleaf.org"> | ||||
| <head> | ||||
| <title>Login</title> | ||||
| <link rel="stylesheet" th:href="@{/css/bootstrap.min.css}" | ||||
| 	href="../../css/bootstrap.min.css" /> | ||||
| </head> | ||||
| <body onload="document.f.username.focus();"> | ||||
| 	<div class="container"> | ||||
| 		<div class="navbar"> | ||||
| 			<div class="navbar-inner"> | ||||
| 				<a class="brand" href="http://www.thymeleaf.org"> Thymeleaf - | ||||
| 					Plain </a> | ||||
| 				<ul class="nav"> | ||||
| 					<li><a th:href="@{/}" href="home.html"> Home </a></li> | ||||
| 					<li><a th:href="@{/secure}" href="home.html"> Secure Page </a></li> | ||||
| 				</ul> | ||||
| 			</div> | ||||
| 		</div> | ||||
| 		<div class="content"> | ||||
| 			<p th:if="${param.logout}" class="alert">You have been logged out</p> | ||||
| 			<p th:if="${param.error}" class="alert alert-error">There was an error, please try again</p> | ||||
| 			<h2>Login with Username and Password</h2> | ||||
| 			<form name="form" th:action="@{/login}" action="/login" method="POST"> | ||||
| 				<fieldset> | ||||
| 					<input type="text" name="username" value="" placeholder="Username" /> | ||||
| 					<input type="password" name="password" placeholder="Password" /> | ||||
| 				</fieldset> | ||||
| 				<input type="submit" id="login" value="Login" | ||||
| 					class="btn btn-primary" /> | ||||
| 			</form> | ||||
| 		</div> | ||||
| 		 | ||||
| 	</div> | ||||
| </body> | ||||
| </html> | ||||
							
								
								
									
										31
									
								
								spring-security-mvc-ldap/src/main/resources/users.ldif
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										31
									
								
								spring-security-mvc-ldap/src/main/resources/users.ldif
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,31 @@ | ||||
| dn: ou=groups,dc=baeldung,dc=com | ||||
| objectclass: top | ||||
| objectclass: organizationalUnit | ||||
| ou: groups | ||||
| 
 | ||||
| dn: ou=people,dc=baeldung,dc=com | ||||
| objectclass: top | ||||
| objectclass: organizationalUnit | ||||
| ou: people | ||||
| 
 | ||||
| dn: uid=baeldung,ou=people,dc=baeldung,dc=com | ||||
| objectclass: top | ||||
| objectclass: person | ||||
| objectclass: organizationalPerson | ||||
| objectclass: inetOrgPerson | ||||
| cn: Jim Beam | ||||
| sn: Beam | ||||
| uid: baeldung | ||||
| userPassword: password | ||||
| 
 | ||||
| dn: cn=admin,ou=groups,dc=baeldung,dc=com | ||||
| objectclass: top | ||||
| objectclass: groupOfNames | ||||
| cn: admin | ||||
| member: uid=baeldung,ou=people,dc=baeldung,dc=com | ||||
| 
 | ||||
| dn: cn=user,ou=groups,dc=baeldung,dc=com | ||||
| objectclass: top | ||||
| objectclass: groupOfNames | ||||
| cn: user | ||||
| member: uid=baeldung,ou=people,dc=baeldung,dc=com | ||||
							
								
								
									
										13
									
								
								spring-security-mvc-ldap/src/test/resources/.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								spring-security-mvc-ldap/src/test/resources/.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,13 @@ | ||||
| *.class | ||||
| 
 | ||||
| #folders# | ||||
| /target | ||||
| /neoDb* | ||||
| /data | ||||
| /src/main/webapp/WEB-INF/classes | ||||
| */META-INF/* | ||||
| 
 | ||||
| # Packaged files # | ||||
| *.jar | ||||
| *.war | ||||
| *.ear | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user