diff --git a/src/main/java/de/thm/arsnova/controller/LoginController.java b/src/main/java/de/thm/arsnova/controller/LoginController.java index 53f3d4d77d81bf4e48011b5d98fd51e641af8a8c..3b494d777dcd599acf15fcf8869691b1689bad36 100644 --- a/src/main/java/de/thm/arsnova/controller/LoginController.java +++ b/src/main/java/de/thm/arsnova/controller/LoginController.java @@ -38,11 +38,13 @@ import org.springframework.security.authentication.UsernamePasswordAuthenticatio 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.AuthenticationException; 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.core.userdetails.UserDetails; import org.springframework.security.ldap.authentication.LdapAuthenticationProvider; import org.springframework.security.web.context.HttpSessionSecurityContextRepository; import org.springframework.security.web.util.UrlUtils; @@ -144,23 +146,36 @@ public class LoginController extends AbstractController { return null; } - @RequestMapping(value = { "/auth/login", "/doLogin" }, method = RequestMethod.POST) + @RequestMapping(value = { "/auth/ldaplogin" }, method = RequestMethod.POST) public final View doLdapLogin( @RequestParam("type") final String type, - @RequestParam(value = "user", required = false) final String userName, + @RequestParam(value = "user") final String userName, @RequestParam(value = "referer", required = false) final String forcedReferer, - @RequestParam(value = "password", required = false) final String password, + @RequestParam(value = "password") final String password, final HttpServletRequest request, final HttpServletResponse response - ) throws IOException, ServletException { - if ("ldap".equals(type)) { + ) { + if ("ldap".equals(type) && password != null) { + String referer = request.getHeader("referer"); + if (null != forcedReferer && null != referer && !UrlUtils.isAbsoluteUrl(referer)) { + referer = forcedReferer; + } + if (null == referer) { + referer = "/"; + } org.springframework.security.core.userdetails.User user = new org.springframework.security.core.userdetails.User( - userName, password, true, true, true, true, this.getAuthorities() + userName, password, true, true, true, true, this.getAuthorities() ); - Authentication token = new UsernamePasswordAuthenticationToken(user, null, getAuthorities()); - ldapAuthenticationProvider.authenticate(token); + Authentication token = new UsernamePasswordAuthenticationToken(user, password, getAuthorities()); + try { + ldapAuthenticationProvider.authenticate(token); + return new RedirectView(referer + "#auth/checkLogin"); + } + catch (AuthenticationException e) { + e.printStackTrace(); + } } return null; } diff --git a/src/main/webapp/WEB-INF/spring/spring-security.xml b/src/main/webapp/WEB-INF/spring/spring-security.xml index 7f77bfac04048f1bc49175d9ff30cd61dc174c69..c3412ddfdfe652bbeecb072cbcb8ced08316e5a7 100644 --- a/src/main/webapp/WEB-INF/spring/spring-security.xml +++ b/src/main/webapp/WEB-INF/spring/spring-security.xml @@ -10,14 +10,16 @@ http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd"> <security:authentication-manager alias="authenticationManager"> + <security:ldap-authentication-provider + user-search-filter="${security.ldap.user-search-filter}" + user-search-base="${security.ldap.user-search-base}" /> <security:authentication-provider ref="facebookAuthProvider" /> <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"> + <security:http entry-point-ref="loginUrlAuthenticationEntryPoint"> <security:custom-filter ref="facebookFilter" before="CAS_FILTER" /> <security:custom-filter ref="twitterFilter" after="CAS_FILTER" /> <security:custom-filter ref="googleFilter" before="FORM_LOGIN_FILTER" /> @@ -27,11 +29,13 @@ </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}" /> + + <bean id="loginUrlAuthenticationEntryPoint" + class="org.springframework.security.web.authentication.LoginUrlAuthenticationEntryPoint"> + <property name="loginFormUrl" value="/login.html" /> + <property name="forceHttps" value="false" /> + </bean> <!-- ######################### FACEBOOK ######################### --> <bean id="facebookEntryPoint" class="com.github.leleuj.ss.oauth.client.web.OAuthAuthenticationEntryPoint" diff --git a/src/main/webapp/login.html b/src/main/webapp/login.html new file mode 100644 index 0000000000000000000000000000000000000000..d50b27caab7804543fc25c287b5abbdc77f6a8ea --- /dev/null +++ b/src/main/webapp/login.html @@ -0,0 +1,9 @@ +<html> + <h1>LDAP-Login</h1> + <form action="auth/ldaplogin" method="post"> + <div><input type="text" name="user" placeholder="Username" /></div> + <div><input type="password" name="password" placeholder="Password" /></div> + <div><input type="submit" value="Login" /></div> + <input type="hidden" name="type" value="ldap" /> + </form> +</html> \ No newline at end of file diff --git a/src/test/resources/arsnova.properties.example b/src/test/resources/arsnova.properties.example index f6b818d06c9a997d55c0026f526b61887ab6a94c..df77f33e61c3ace0d15b97c2a2c4557027029eea 100644 --- a/src/test/resources/arsnova.properties.example +++ b/src/test/resources/arsnova.properties.example @@ -14,6 +14,10 @@ security.ssl=false security.keystore=/etc/arsnova.thm.de.jks security.storepass=arsnova +security.ldap.url=ldap://example.com:389/dc=example,dc=com +security.ldap.user-search-filter=(uid={0}) +security.ldap.user-search-base= + couchdb.host=localhost couchdb.port=5984 couchdb.name=arsnova