Přidána podpora pro přihlašování proti Active Directory, loginem shodným
s uživatelem a heslem do windows domény. Původní LDAP přihlašování funguje proti obecnému LDAP serveu- bind na LDAP dělá přes CN uživatele.multitenant
							parent
							
								
									2a11599cb3
								
							
						
					
					
						commit
						ae31914b9a
					
				@ -0,0 +1,59 @@
 | 
				
			|||||||
 | 
					package info.bukova.isspst.services.users;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import info.bukova.isspst.Constants;
 | 
				
			||||||
 | 
					import info.bukova.isspst.data.User;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import java.util.Collection;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import org.slf4j.Logger;
 | 
				
			||||||
 | 
					import org.slf4j.LoggerFactory;
 | 
				
			||||||
 | 
					import org.springframework.ldap.core.DirContextAdapter;
 | 
				
			||||||
 | 
					import org.springframework.ldap.core.DirContextOperations;
 | 
				
			||||||
 | 
					import org.springframework.security.core.GrantedAuthority;
 | 
				
			||||||
 | 
					import org.springframework.security.core.userdetails.UserDetails;
 | 
				
			||||||
 | 
					import org.springframework.security.core.userdetails.UsernameNotFoundException;
 | 
				
			||||||
 | 
					import org.springframework.security.ldap.authentication.ad.ActiveDirectoryLdapAuthenticationProvider;
 | 
				
			||||||
 | 
					import org.springframework.security.ldap.userdetails.UserDetailsContextMapper;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * Mapovač doménových uživatelů Active Directory na uživatele aplikace. Pokud uživatel není v aplikační databází,
 | 
				
			||||||
 | 
					 * importu je se tam pomoci {@link LdapUserImporter}. Tento objekt se předává do {@link ActiveDirectoryLdapAuthenticationProvider}.
 | 
				
			||||||
 | 
					 * 
 | 
				
			||||||
 | 
					 * @author pepa
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					public class AdUserCtxMapper implements UserDetailsContextMapper {
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						private UserService userService;
 | 
				
			||||||
 | 
						private RoleService roleService;
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						private final static Logger logger = LoggerFactory.getLogger(AdUserCtxMapper.class);
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						public AdUserCtxMapper(UserService userService, RoleService roleService) {
 | 
				
			||||||
 | 
							this.userService = userService;
 | 
				
			||||||
 | 
							this.roleService = roleService;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						@Override
 | 
				
			||||||
 | 
						public UserDetails mapUserFromContext(DirContextOperations userData,
 | 
				
			||||||
 | 
								String username, Collection<? extends GrantedAuthority> authorities) {
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
							try {
 | 
				
			||||||
 | 
								User user = (User) userService.loadUserByUsername(username);
 | 
				
			||||||
 | 
								return user;
 | 
				
			||||||
 | 
							} catch (UsernameNotFoundException e) {
 | 
				
			||||||
 | 
								logger.info("Importing user from Active Directory");
 | 
				
			||||||
 | 
								LdapUserImporter importer = new LdapUserImporter(userService);
 | 
				
			||||||
 | 
								importer.importUser(username, userData, roleService.getRoleByAuthority(Constants.ROLE_USER));
 | 
				
			||||||
 | 
								
 | 
				
			||||||
 | 
								return userService.loadUserByUsername(username);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						@Override
 | 
				
			||||||
 | 
						public void mapUserToContext(UserDetails user, DirContextAdapter ctx) {
 | 
				
			||||||
 | 
							throw new UnsupportedOperationException("LdapUserDetailsMapper only supports reading from a context. Please" +
 | 
				
			||||||
 | 
					                "use a subclass if mapUserToContext() is required.");
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@ -0,0 +1,90 @@
 | 
				
			|||||||
 | 
					package info.bukova.isspst.services.users;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import info.bukova.isspst.data.Role;
 | 
				
			||||||
 | 
					import info.bukova.isspst.data.User;
 | 
				
			||||||
 | 
					import info.bukova.isspst.data.UsersAddress;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import javax.naming.NamingException;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import org.slf4j.Logger;
 | 
				
			||||||
 | 
					import org.slf4j.LoggerFactory;
 | 
				
			||||||
 | 
					import org.springframework.ldap.core.DirContextOperations;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * Pomocná třída pro import uživatele z LDAP serveru (nebo Active Directory) do databáze aplikace
 | 
				
			||||||
 | 
					 * 
 | 
				
			||||||
 | 
					 * @author pepa
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					public class LdapUserImporter {
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						private UserService userService;
 | 
				
			||||||
 | 
						private final static Logger logger = LoggerFactory.getLogger(LdapUserImporter.class);
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						public LdapUserImporter(UserService userService) {
 | 
				
			||||||
 | 
							this.userService = userService;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						/**
 | 
				
			||||||
 | 
						 * Provede import uživatele z LDAP do aplikační databáze
 | 
				
			||||||
 | 
						 * 
 | 
				
			||||||
 | 
						 * @param login - login uživatele
 | 
				
			||||||
 | 
						 * @param userData - objekt reprezentujízí data z LDAP
 | 
				
			||||||
 | 
						 * @param defaultRole - role, která má být přidělena novému uživateli
 | 
				
			||||||
 | 
						 */
 | 
				
			||||||
 | 
						public void importUser(String login, DirContextOperations userData, Role defaultRole) {
 | 
				
			||||||
 | 
							User user = new User();
 | 
				
			||||||
 | 
							user.setUsername(login);
 | 
				
			||||||
 | 
							user.addAuthority(defaultRole);
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
							if (userData.attributeExists("givenName")) {
 | 
				
			||||||
 | 
								try {
 | 
				
			||||||
 | 
									user.setFirstName(userData.getAttributes().get("givenName").get().toString());
 | 
				
			||||||
 | 
								} catch (NamingException e1) {
 | 
				
			||||||
 | 
									logger.info("LDAP object has no 'givenName' attribute");
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							if (userData.attributeExists("sn")) {
 | 
				
			||||||
 | 
								try {
 | 
				
			||||||
 | 
									user.setLastName(userData.getAttributes().get("sn").get().toString());
 | 
				
			||||||
 | 
								} catch (NamingException e1) {
 | 
				
			||||||
 | 
									logger.info("LDAP object has no 'sn' attribute");
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							if (userData.attributeExists("mail")) {
 | 
				
			||||||
 | 
								try {
 | 
				
			||||||
 | 
									user.setEmail(userData.getAttributes().get("mail").get().toString());
 | 
				
			||||||
 | 
									user.setNotify(true);
 | 
				
			||||||
 | 
								} catch (NamingException e1) {
 | 
				
			||||||
 | 
									logger.info("LDAP object has no 'mail' attribute");
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
							UsersAddress address = new UsersAddress();
 | 
				
			||||||
 | 
							boolean hasAddress = false;
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
							if (userData.attributeExists("streetAddress")) {
 | 
				
			||||||
 | 
								address.setStreet(userData.getStringAttribute("streetAddress"));
 | 
				
			||||||
 | 
								hasAddress = true;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							if (userData.attributeExists("l")) {
 | 
				
			||||||
 | 
								address.setCity(userData.getStringAttribute("l"));
 | 
				
			||||||
 | 
								hasAddress = true;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							if (userData.attributeExists("postalCode")) {
 | 
				
			||||||
 | 
								address.setZipCode(userData.getStringAttribute("postalCode"));
 | 
				
			||||||
 | 
								hasAddress = true;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
							if (hasAddress) {
 | 
				
			||||||
 | 
								user.setAddress(address);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
							user.setEnabled(true);
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
							userService.grantAdmin(); // povýšit práva pro toto vlákno
 | 
				
			||||||
 | 
							userService.add(user);
 | 
				
			||||||
 | 
							userService.removeAccess();
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@ -0,0 +1,2 @@
 | 
				
			|||||||
 | 
					ad.domain=bukova.net
 | 
				
			||||||
 | 
					ad.ldapUrl=ldap://192.168.25.110/
 | 
				
			||||||
@ -0,0 +1,23 @@
 | 
				
			|||||||
 | 
					<?xml version="1.0" encoding="UTF-8"?>
 | 
				
			||||||
 | 
					<beans xmlns="http://www.springframework.org/schema/beans"
 | 
				
			||||||
 | 
						xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 | 
				
			||||||
 | 
						xmlns:security="http://www.springframework.org/schema/security"
 | 
				
			||||||
 | 
						xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
 | 
				
			||||||
 | 
							http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security.xsd">
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						<security:authentication-manager>
 | 
				
			||||||
 | 
							<security:authentication-provider ref="adAuthProvider"/>
 | 
				
			||||||
 | 
						</security:authentication-manager>
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						<bean id="adAuthProvider" class="org.springframework.security.ldap.authentication.ad.ActiveDirectoryLdapAuthenticationProvider">
 | 
				
			||||||
 | 
							<constructor-arg name="domain" value="${ad.domain}"/>
 | 
				
			||||||
 | 
							<constructor-arg name="url" value="${ad.ldapUrl}"/>
 | 
				
			||||||
 | 
							<property name="userDetailsContextMapper" ref="adUserMapper"/>
 | 
				
			||||||
 | 
						</bean>
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						<bean id="adUserMapper" class="info.bukova.isspst.services.users.AdUserCtxMapper">
 | 
				
			||||||
 | 
							<constructor-arg name="userService" ref="userService"/>
 | 
				
			||||||
 | 
							<constructor-arg name="roleService" ref="roleService"/>
 | 
				
			||||||
 | 
						</bean>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					</beans>
 | 
				
			||||||
					Loading…
					
					
				
		Reference in New Issue