使用Java配置的SpringLDAP
我正在遵循,并试图将使用Java配置的SpringLDAP,java,spring,spring-boot,spring-java-config,spring-ldap,Java,Spring,Spring Boot,Spring Java Config,Spring Ldap,我正在遵循,并试图将xml配置转换为Java配置 我正在尝试在LDAP服务器上执行CRUD操作 我能够弄明白以下几点 这是应用程序的xml配置,我希望将其转换为Java配置 和 @Configuration public class AuthenticationConfiguration extends GlobalAuthenticationConfigurerAdapter { @Autowired Environment env; @Ove
xml
配置转换为Java配置
我正在尝试在LDAP服务器上执行CRUD操作
我能够弄明白以下几点
这是应用程序的xml配置,我希望将其转换为Java配置
和
@Configuration
public class AuthenticationConfiguration extends
GlobalAuthenticationConfigurerAdapter {
@Autowired
Environment env;
@Override
public void init(AuthenticationManagerBuilder auth) throws Exception {
auth.ldapAuthentication()
// .userDetailsContextMapper(userDetailsContextMapper())
.userDnPatterns(
env.getRequiredProperty("ldap.user_dn_patterns"))
.groupSearchBase(
env.getRequiredProperty("ldap.group_search_base"))
.contextSource().ldif("classpath:setup_data.ldif")
.url(env.getRequiredProperty("sample.ldap.url"))
.managerDn("sample.ldap.userDn")
.managerPassword("sample.ldap.password").port(10389);
}
}
但当我运行应用程序时
我得到以下错误
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'groupRepo': Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: Not an managed type: class com.cazysystems.appstore.model.Group
但是在com.cazysystems.appstore.model
包下
我有
public interface GroupRepo extends LdapRepository<Group>, GroupRepoExtension {
public final static String USER_GROUP = "ROLE_USER";
Group findByName(String groupName);
@Query("(member={0})")
Collection<Group> findByMember(Name member);
}
我在pom中使用以下依赖项
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-ldap</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.ldap</groupId>
<artifactId>spring-ldap-core</artifactId>
<version>2.0.3.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.ldap</groupId>
<artifactId>spring-ldap-core-tiger</artifactId>
<version>2.0.3.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-commons</artifactId>
</dependency>
org.springframework.security
spring安全ldap
org.springframework.ldap
SpringLDAP核心
2.0.3.1发布
org.springframework.ldap
春之虎
2.0.3.1发布
org.springframework.data
spring数据共享
我不确定我做错了什么,因为这方面的文档很难找到。如果你知道这些,请帮忙
编辑:
这是我的控制器类
@Controller
public class GroupController {
@Autowired
private GroupRepo groupRepo;
@Autowired
private UserService userService;
@RequestMapping(value = "/groups", method = GET)
public String listGroups(ModelMap map) {
map.put("groups", groupRepo.getAllGroupNames());
return "listGroups";
}
@RequestMapping(value = "/newGroup", method = GET)
public String initNewGroup() {
return "newGroup";
}
@RequestMapping(value = "/groups", method = POST)
public String newGroup(Group group) {
groupRepo.create(group);
return "redirect:groups/" + group.getName();
}
@RequestMapping(value = "/groups/{name}", method = GET)
public String editGroup(@PathVariable String name, ModelMap map) {
Group foundGroup = groupRepo.findByName(name);
map.put("group", foundGroup);
final Set<User> groupMembers = userService.findAllMembers(foundGroup.getMembers());
map.put("members", groupMembers);
Iterable<User> otherUsers = Iterables.filter(userService.findAll(), new Predicate<User>() {
@Override
public boolean apply(User user) {
return !groupMembers.contains(user);
}
});
map.put("nonMembers", Lists.newLinkedList(otherUsers));
return "editGroup";
}
@RequestMapping(value = "/groups/{name}/members", method = POST)
public String addUserToGroup(@PathVariable String name, @RequestParam String userId) {
Group group = groupRepo.findByName(name);
group.addMember(userService.toAbsoluteDn(LdapUtils.newLdapName(userId)));
groupRepo.save(group);
return "redirect:/groups/" + name;
}
@RequestMapping(value = "/groups/{name}/members", method = DELETE)
public String removeUserFromGroup(@PathVariable String name, @RequestParam String userId) {
Group group = groupRepo.findByName(name);
group.removeMember(userService.toAbsoluteDn(LdapUtils.newLdapName(userId)));
groupRepo.save(group);
return "redirect:/groups/" + name;
}
}
@控制器
公共类组控制器{
@自动连线
私人集团回购集团回购;
@自动连线
私人用户服务;
@RequestMapping(value=“/groups”,method=GET)
公共字符串列表组(模型映射){
map.put(“groups”,groupRepo.getAllGroupNames());
返回“列表组”;
}
@RequestMapping(value=“/newGroup”,method=GET)
公共字符串initNewGroup(){
返回“newGroup”;
}
@请求映射(value=“/groups”,method=POST)
公共字符串newGroup(组){
groupRepo.create(集团);
返回“redirect:groups/”+group.getName();
}
@RequestMapping(value=“/groups/{name}”,method=GET)
公共字符串编辑组(@PathVariable字符串名称,ModelMap){
groupfoundgroup=groupRepo.findByName(名称);
map.put(“组”,foundGroup);
final Set groupMembers=userService.findAllMembers(foundGroup.getMembers());
map.put(“成员”,groupMembers);
Iterable otherUsers=Iterables.filter(userService.findAll(),new Predicate()){
@凌驾
公共布尔应用(用户){
return!groupMembers.contains(用户);
}
});
map.put(“非成员”,list.newLinkedList(其他用户));
返回“编辑组”;
}
@RequestMapping(value=“/groups/{name}/members”,method=POST)
公共字符串addUserToGroup(@PathVariable字符串名称,@RequestParam字符串用户ID){
Group Group=groupRepo.findByName(名称);
addMember(userService.toabsolutiondn(LdapUtils.newLdapName(userId));
集团回购保存(集团);
返回“重定向:/groups/”+名称;
}
@RequestMapping(value=“/groups/{name}/members”,method=DELETE)
公共字符串removeUserFromGroup(@PathVariable字符串名称,@RequestParam字符串用户ID){
Group Group=groupRepo.findByName(名称);
group.removember(userService.toabsolutiondn(LdapUtils.newLdapName(userId));
集团回购保存(集团);
返回“重定向:/groups/”+名称;
}
}
编辑:
以下是完整的堆栈跟踪
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'groupController': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private com.cazysystems.appstore.domain.GroupRepo com.eazysystems.appstore.controller.GroupController.groupRepo; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'groupRepo': Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: Not an managed type: class com.cazysystems.appstore.domain.Group
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:334)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1210)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:537)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:476)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:303)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:299)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:194)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:755)
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:757)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:480)
at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:118)
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:686)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:320)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:957)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:946)
at com.eazysystems.appstore.Application.main(Application.java:20)
Caused by: org.springframework.beans.factory.BeanCreationException: Could not autowire field: private com.cazysystems.appstore.domain.GroupRepo com.eazysystems.appstore.controller.GroupController.groupRepo; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'groupRepo': Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: Not an managed type: class com.eazysystems.appstore.domain.Group
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:561)
at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:88)
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:331)
... 16 common frames omitted
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'groupRepo': Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: Not an managed type: class com.eazysystems.appstore.domain.Group
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1574)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:539)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:476)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:303)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:299)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:194)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.findAutowireCandidates(DefaultListableBeanFactory.java:1120)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1044)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:942)
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:533)
... 18 common frames omitted
Caused by: java.lang.IllegalArgumentException: Not an managed type: class com.cazysystems.appstore.domain.Group
at org.hibernate.jpa.internal.metamodel.MetamodelImpl.managedType(MetamodelImpl.java:219)
at org.springframework.data.jpa.repository.support.JpaMetamodelEntityInformation.<init>(JpaMetamodelEntityInformation.java:68)
at org.springframework.data.jpa.repository.support.JpaEntityInformationSupport.getMetadata(JpaEntityInformationSupport.java:67)
at org.springframework.data.jpa.repository.support.JpaRepositoryFactory.getEntityInformation(JpaRepositoryFactory.java:145)
at org.springframework.data.jpa.repository.support.JpaRepositoryFactory.getTargetRepository(JpaRepositoryFactory.java:89)
at org.springframework.data.jpa.repository.support.JpaRepositoryFactory.getTargetRepository(JpaRepositoryFactory.java:69)
at org.springframework.data.repository.core.support.RepositoryFactorySupport.getRepository(RepositoryFactorySupport.java:173)
at org.springframework.data.repository.core.support.RepositoryFactoryBeanSupport.initAndReturn(RepositoryFactoryBeanSupport.java:239)
at org.springframework.data.repository.core.support.RepositoryFactoryBeanSupport.afterPropertiesSet(RepositoryFactoryBeanSupport.java:225)
at org.springframework.data.jpa.repository.support.JpaRepositoryFactoryBean.afterPropertiesSet(JpaRepositoryFactoryBean.java:92)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1633)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1570)
... 28 common frames omitted
org.springframework.beans.factory.BeanCreationException:创建名为“groupController”的bean时出错:自动连线依赖项的注入失败;嵌套异常为org.springframework.beans.factory.BeanCreationException:无法自动连线字段:private com.cazystems.appstore.domain.GroupRepo com.eazystems.appstore.controller.GroupController.GroupRepo;嵌套异常为org.springframework.beans.factory.BeanCreationException:创建名为“groupRepo”的bean时出错:调用init方法失败;嵌套异常为java.lang.IllegalArgumentException:不是托管类型:class com.cazysystems.appstore.domain.Group
位于org.springframework.beans.factory.annotation.AutoWiredNotationBeanPostProcessor.postProcessPropertyValues(AutoWiredNotationBeanPostProcessor.java:334)
位于org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1210)
位于org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:537)
位于org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:476)
位于org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:303)
位于org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
位于org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:299)
位于org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:194)
位于org.springframework.beans.factory.support.DefaultListableBeanFactory.PreInstanceSingleton(DefaultListableBeanFactory.java:755)
位于org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:757)
位于org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:480)
位于org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:118)
位于org.springframework.boot.SpringApplication.refresh(SpringApplication.java:686)
位于org.springframework.boot.SpringApplication.run(SpringApplication.java:320)
位于org.springframework.boot.SpringApplication.run(SpringApplication.java:957)
位于org.springframework.boot.SpringApplication.run(SpringApplication.java:946)
位于com.eazystems.appstore.Application.main(Application.java:20)
原因:org.springframework.beans.factory.BeanCreationException:无法启动
@EnableLdapRepositories("com.cazysystems.appstore.model")
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-ldap</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.ldap</groupId>
<artifactId>spring-ldap-core</artifactId>
<version>2.0.3.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.ldap</groupId>
<artifactId>spring-ldap-core-tiger</artifactId>
<version>2.0.3.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-commons</artifactId>
</dependency>
@Controller
public class GroupController {
@Autowired
private GroupRepo groupRepo;
@Autowired
private UserService userService;
@RequestMapping(value = "/groups", method = GET)
public String listGroups(ModelMap map) {
map.put("groups", groupRepo.getAllGroupNames());
return "listGroups";
}
@RequestMapping(value = "/newGroup", method = GET)
public String initNewGroup() {
return "newGroup";
}
@RequestMapping(value = "/groups", method = POST)
public String newGroup(Group group) {
groupRepo.create(group);
return "redirect:groups/" + group.getName();
}
@RequestMapping(value = "/groups/{name}", method = GET)
public String editGroup(@PathVariable String name, ModelMap map) {
Group foundGroup = groupRepo.findByName(name);
map.put("group", foundGroup);
final Set<User> groupMembers = userService.findAllMembers(foundGroup.getMembers());
map.put("members", groupMembers);
Iterable<User> otherUsers = Iterables.filter(userService.findAll(), new Predicate<User>() {
@Override
public boolean apply(User user) {
return !groupMembers.contains(user);
}
});
map.put("nonMembers", Lists.newLinkedList(otherUsers));
return "editGroup";
}
@RequestMapping(value = "/groups/{name}/members", method = POST)
public String addUserToGroup(@PathVariable String name, @RequestParam String userId) {
Group group = groupRepo.findByName(name);
group.addMember(userService.toAbsoluteDn(LdapUtils.newLdapName(userId)));
groupRepo.save(group);
return "redirect:/groups/" + name;
}
@RequestMapping(value = "/groups/{name}/members", method = DELETE)
public String removeUserFromGroup(@PathVariable String name, @RequestParam String userId) {
Group group = groupRepo.findByName(name);
group.removeMember(userService.toAbsoluteDn(LdapUtils.newLdapName(userId)));
groupRepo.save(group);
return "redirect:/groups/" + name;
}
}
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'groupController': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private com.cazysystems.appstore.domain.GroupRepo com.eazysystems.appstore.controller.GroupController.groupRepo; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'groupRepo': Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: Not an managed type: class com.cazysystems.appstore.domain.Group
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:334)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1210)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:537)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:476)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:303)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:299)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:194)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:755)
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:757)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:480)
at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:118)
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:686)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:320)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:957)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:946)
at com.eazysystems.appstore.Application.main(Application.java:20)
Caused by: org.springframework.beans.factory.BeanCreationException: Could not autowire field: private com.cazysystems.appstore.domain.GroupRepo com.eazysystems.appstore.controller.GroupController.groupRepo; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'groupRepo': Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: Not an managed type: class com.eazysystems.appstore.domain.Group
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:561)
at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:88)
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:331)
... 16 common frames omitted
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'groupRepo': Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: Not an managed type: class com.eazysystems.appstore.domain.Group
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1574)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:539)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:476)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:303)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:299)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:194)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.findAutowireCandidates(DefaultListableBeanFactory.java:1120)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1044)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:942)
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:533)
... 18 common frames omitted
Caused by: java.lang.IllegalArgumentException: Not an managed type: class com.cazysystems.appstore.domain.Group
at org.hibernate.jpa.internal.metamodel.MetamodelImpl.managedType(MetamodelImpl.java:219)
at org.springframework.data.jpa.repository.support.JpaMetamodelEntityInformation.<init>(JpaMetamodelEntityInformation.java:68)
at org.springframework.data.jpa.repository.support.JpaEntityInformationSupport.getMetadata(JpaEntityInformationSupport.java:67)
at org.springframework.data.jpa.repository.support.JpaRepositoryFactory.getEntityInformation(JpaRepositoryFactory.java:145)
at org.springframework.data.jpa.repository.support.JpaRepositoryFactory.getTargetRepository(JpaRepositoryFactory.java:89)
at org.springframework.data.jpa.repository.support.JpaRepositoryFactory.getTargetRepository(JpaRepositoryFactory.java:69)
at org.springframework.data.repository.core.support.RepositoryFactorySupport.getRepository(RepositoryFactorySupport.java:173)
at org.springframework.data.repository.core.support.RepositoryFactoryBeanSupport.initAndReturn(RepositoryFactoryBeanSupport.java:239)
at org.springframework.data.repository.core.support.RepositoryFactoryBeanSupport.afterPropertiesSet(RepositoryFactoryBeanSupport.java:225)
at org.springframework.data.jpa.repository.support.JpaRepositoryFactoryBean.afterPropertiesSet(JpaRepositoryFactoryBean.java:92)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1633)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1570)
... 28 common frames omitted
@Component
public class UserService implements BaseLdapNameAware {
@Autowired
private UserRepo userRepo;
@Autowired
private GroupRepo groupRepo;
private LdapName baseLdapPath;
@Autowired
@Value("${sample.ldap.directory.type}")
private DirectoryType directoryType;
/*
* @Autowired public UserService(UserRepo userRepo, GroupRepo groupRepo) {
* this.userRepo = userRepo; this.groupRepo = groupRepo; }
*/
public Group getUserGroup() {
return groupRepo.findByName(GroupRepo.USER_GROUP);
}
public void setDirectoryType(DirectoryType directoryType) {
this.directoryType = directoryType;
}
@Override
public void setBaseLdapPath(LdapName baseLdapPath) {
this.baseLdapPath = baseLdapPath;
}
public Iterable<User> findAll() {
return userRepo.findAll();
}
public User findUser(String userId) {
return userRepo.findOne(LdapUtils.newLdapName(userId));
}
public User createUser(User user) {
User savedUser = userRepo.save(user);
Group userGroup = getUserGroup();
// The DN the member attribute must be absolute
userGroup.addMember(toAbsoluteDn(savedUser.getId()));
groupRepo.save(userGroup);
return savedUser;
}
public LdapName toAbsoluteDn(Name relativeName) {
return LdapNameBuilder.newInstance(baseLdapPath).add(relativeName)
.build();
}
/**
* This method expects absolute DNs of group members. In order to find the
* actual users the DNs need to have the base LDAP path removed.
*
* @param absoluteIds
* @return
*/
public Set<User> findAllMembers(Iterable<Name> absoluteIds) {
return Sets.newLinkedHashSet(userRepo
.findAll(toRelativeIds(absoluteIds)));
}
public Iterable<Name> toRelativeIds(Iterable<Name> absoluteIds) {
return Iterables.transform(absoluteIds, new Function<Name, Name>() {
@Override
public Name apply(Name input) {
return LdapUtils.removeFirst(input, baseLdapPath);
}
});
}
public User updateUser(String userId, User user) {
LdapName originalId = LdapUtils.newLdapName(userId);
User existingUser = userRepo.findOne(originalId);
existingUser.setFirstName(user.getFirstName());
existingUser.setLastName(user.getLastName());
existingUser.setFullName(user.getFullName());
existingUser.setEmail(user.getEmail());
existingUser.setPhone(user.getPhone());
existingUser.setTitle(user.getTitle());
existingUser.setDepartment(user.getDepartment());
existingUser.setUnit(user.getUnit());
if (directoryType == DirectoryType.AD) {
return updateUserAd(originalId, existingUser);
} else {
return updateUserStandard(originalId, existingUser);
}
}
/**
* Update the user and - if its id changed - update all group references to
* the user.
*
* @param originalId
* the original id of the user.
* @param existingUser
* the user, populated with new data
*
* @return the updated entry
*/
private User updateUserStandard(LdapName originalId, User existingUser) {
User savedUser = userRepo.save(existingUser);
if (!originalId.equals(savedUser.getId())) {
// The user has moved - we need to update group references.
LdapName oldMemberDn = toAbsoluteDn(originalId);
LdapName newMemberDn = toAbsoluteDn(savedUser.getId());
Collection<Group> groups = groupRepo.findByMember(oldMemberDn);
updateGroupReferences(groups, oldMemberDn, newMemberDn);
}
return savedUser;
}
/**
* Special behaviour in AD forces us to get the group membership before the
* user is updated, because AD clears group membership for removed entries,
* which means that once the user is update we've lost track of which groups
* the user was originally member of, preventing us to update the membership
* references so that they point to the new DN of the user.
*
* This is slightly less efficient, since we need to get the group
* membership for all updates even though the user may not have been moved.
* Using our knowledge of which attributes are part of the distinguished
* name we can do this more efficiently if we are implementing specifically
* for Active Directory - this approach is just to highlight this quite
* significant difference.
*
* @param originalId
* the original id of the user.
* @param existingUser
* the user, populated with new data
*
* @return the updated entry
*/
private User updateUserAd(LdapName originalId, User existingUser) {
LdapName oldMemberDn = toAbsoluteDn(originalId);
Collection<Group> groups = groupRepo.findByMember(oldMemberDn);
User savedUser = userRepo.save(existingUser);
LdapName newMemberDn = toAbsoluteDn(savedUser.getId());
if (!originalId.equals(savedUser.getId())) {
// The user has moved - we need to update group references.
updateGroupReferences(groups, oldMemberDn, newMemberDn);
}
return savedUser;
}
private void updateGroupReferences(Collection<Group> groups,
Name originalId, Name newId) {
for (Group group : groups) {
group.removeMember(originalId);
group.addMember(newId);
groupRepo.save(group);
}
}
public List<User> searchByNameName(String lastName) {
return userRepo.findByFullNameContains(lastName);
}
}
@Configuration
public class LdapManagerConfiguration {
@Autowired
Environment ldapProperties;
@Bean
public LdapContextSource contextSourceTarget() {
LdapContextSource ldapContextSource = new LdapContextSource();
ldapContextSource.setUrl(ldapProperties.getProperty("auth.ldap.url"));
ldapContextSource.setBase(ldapProperties.getProperty("auth.ldap.base"));
ldapContextSource.setUserDn(ldapProperties
.getProperty("auth.ldap.userdn"));
ldapContextSource.setPassword(ldapProperties
.getProperty("auth.ldap.password"));
return ldapContextSource;
}
@Bean
public LdapTemplate ldapTemplate() {
return new LdapTemplate(contextSourceTarget());
}
@Bean
public InetOrgPersonContextMapper inetOrgPersonContextMapper() {
return new InetOrgPersonContextMapper();
}
@Bean
public DefaultLdapUsernameToDnMapper defaultLdapUsernameToDnMapper() {
return new DefaultLdapUsernameToDnMapper(
ldapProperties.getProperty("auth.ldap.groupbase"),
ldapProperties.getProperty("auth.ldap.attributename.username"));// "uid"
}
@Bean
public LdapUserDetailsManager ldapUserDetailManager() {
LdapUserDetailsManager userManager = new LdapUserDetailsManager(
contextSourceTarget());
userManager.setGroupSearchBase(ldapProperties
.getProperty("auth.ldap.groupbase"));
userManager.setUserDetailsMapper(inetOrgPersonContextMapper());
userManager.setUsernameMapper(defaultLdapUsernameToDnMapper());
userManager.setGroupRoleAttributeName(ldapProperties
.getProperty("auth.ldap.attributename.grouprole"));
userManager.setGroupMemberAttributeName(ldapProperties
.getProperty("auth.ldap.attributename.groupmemeber"));
return userManager;
}
}
Logger logger = LoggerFactory.getLogger(LdapUserManagerImpl.class);
@Autowired
LdapTemplate ldapTemplate;
@Autowired
Environment ldapProperties;
final String passwordAttribute = "userPassword";
@Override
public boolean createUser(final String user,
final String defaultPasswordPolicy)
throws UserAlreadyExistsAsInactive {
boolean created = false;
String inactivePeople = ldapProperties.getProperty(
"auth.ldap.inactive.groupbase").replace("ou=", "");
String activePeople = ldapProperties.getProperty("auth.ldap.groupbase")
.replace("ou=", "");
if (existsUser(user, inactivePeople)) {
logger.error("User " + user
+ " already exists in ldap but it's incative");
throw new UserAlreadyExistsAsInactive(user);
}
if (existsUser(user, activePeople)) {
logger.error("User " + user
+ " already exists in ldap and is Active");
return false;
}
try {
ldapTemplate.bind(buildDn(user, inactivePeople), null,
createUserDetails(user, defaultPasswordPolicy));
created = true;
} catch (Exception e) {
logger.error(
"Unexpected exception when trying to create user in LdapException",
e);
return created;
}
return created;
}
public UserI findUser(String userName, String group) {
try {
String dn = buildDN(userName, group);
User user = ldapTemplate.lookup(dn, new UserAttributesMapper());
return user;
} catch (NameNotFoundException e) {
return new UserNullObject();
}
}
@Override
public void changeUserGroup(String userName, String oldGroup,
String newGroup) throws ReLocoException {
UserI user = findUser(userName, oldGroup);
if (!user.isEmpty()) {
try {
Object password = getLdapPassword(userName, oldGroup);
ldapTemplate.unbind(buildDN(userName, oldGroup));
String defaultPasswordPolicy = ldapProperties
.getProperty("auth.ldap.default.userpollicy");
ldapTemplate.bind(buildDN(userName, newGroup), null,
createUserDetails(userName, defaultPasswordPolicy));
applyPasswordToUser(userName, password, newGroup);
} catch (Exception e) {
logger.error("Error on change user from incative to active people group "
+ e);
throw new ConfirmAccountValidationCodeException(userName);
}
} else {
throw new UserNotFoundException(
"The username provided for the given group '" + oldGroup
+ "' does not exist");
}
}