实体签到jhipster

时间:2017-03-15 08:57:32

标签: angular spring-boot jhipster

我使用angular 2,mongodb创建了一个新的项目jhipster。 我创建了一个名为doctor的实体,其中包含属性名称(字符串),登录(字符串),密码(字符串)和专业(字符串)。 我想使用此实体的登录名和密码登录我的应用程序,这可能吗?

1 个答案:

答案 0 :(得分:3)

有两种方法可供选择。

第一种方式即将解决您实际要求的问题:除了经典之外的其他用户管理(据我所知,您没有说您不想删除普通用户的登录)。它不是理想的模型,但有时会有用例。但是在Spring中,所有这些魔法都应该在你实现的UserDetailsService(来自spring-security的接口)中发生。 JHipster为“src / main / java / package / security / DomainUserDetailsS​​ervice.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没有真正的关系管理,但仍有模式来模拟事实,用户可能是医生(例如,作为嵌套属性),因此添加医生功能,在这个事实上。