我使用angular 2,mongodb创建了一个新的项目jhipster。 我创建了一个名为doctor的实体,其中包含属性名称(字符串),登录(字符串),密码(字符串)和专业(字符串)。 我想使用此实体的登录名和密码登录我的应用程序,这可能吗?
答案 0 :(得分:3)
有两种方法可供选择。
第一种方式即将解决您实际要求的问题:除了经典之外的其他用户管理(据我所知,您没有说您不想删除普通用户的登录)。它不是理想的模型,但有时会有用例。但是在Spring中,所有这些魔法都应该在你实现的UserDetailsService
(来自spring-security的接口)中发生。 JHipster为“src / main / java / package / security / DomainUserDetailsService.java”中的经典场景执行此操作。
对于您的情况,您应该有DoctorRepository
这样:
@SuppressWarnings("unused")
public interface DoctorRepository extends MongoRepository<Doctor,Long> {
//...
Optional<Doctor> fineOneByLogin(@Param String login);
//...
}
因此您可以将loadByUsername重建为
@Transactional
public UserDetails loadUserByUsername(final String login) {
log.debug("Authenticating {}", login);
String lowercaseLogin = login.toLowerCase(Locale.ENGLISH);
Optional<User> userFromDatabase = userRepository.findOneWithAuthoritiesByLogin(lowercaseLogin);
return userFromDatabase.map(user -> {
if (!user.getActivated()) {
throw new UserNotActivatedException("User " + lowercaseLogin + " was not activated");
}
List<GrantedAuthority> grantedAuthorities = user.getAuthorities().stream()
.map(authority -> new SimpleGrantedAuthority(authority.getName()))
.collect(Collectors.toList());
return new org.springframework.security.core.userdetails.User(lowercaseLogin,
user.getPassword(),
grantedAuthorities);
}).orElseGet(() -> {
List<GrantedAuthority> grantedAuthorities = null; // add your logic for that here
return doctorRepository.findOneByLogin(String login).map(doctor -> {
return new org.springframework.security.core.userdetails.User(lowercaseLogin,
doctor.getPassword(),
grantedAuthorities);
}).orElseThrow(() -> new UsernameNotFoundException("User " + lowercaseLogin + " was not found in the " +
"database"));
});
}
(源自思想的源代码,未经测试)
请记住,您必须根据配置的PasswordEncoder
虽然mongo没有真正的关系管理,但仍有模式来模拟事实,用户可能是医生(例如,作为嵌套属性),因此添加医生功能,在这个事实上。