java - 使用 Spring Security + Spring 数据 + MongoDB 进行身份验证

标签 java spring mongodb spring-security mongodb-java

我想将 Spring 安全性与 MongoDB 一起使用(使用 Spring 数据)并从我自己的数据库中检索用户以实现 Spring 安全性。但是,我不能这样做,因为我的用户服务类型似乎不受支持。

这是我的 UserService 类:

public class UserService {
    private ApplicationContext applicationContext;
    private MongoOperations mongoOperations;

    public UserService() {
        applicationContext = new AnnotationConfigApplicationContext(MongoConfig.class);
        mongoOperations = (MongoOperations) applicationContext.getBean("mongoTemplate");
    }

    public User find(String username) {
        return mongoOperations.findOne(Query.query(Criteria.where("username").is(username)), User.class);
    }
}

还有我的 SecurityConfig 类:

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    @Autowired
    UserService userService;

    @Autowired
    public void configAuthBuilder(AuthenticationManagerBuilder builder) throws Exception {
        builder.userDetailsService(userService); //THIS DOES NOT WORK
        builder.inMemoryAuthentication().withUser("username").password("password").roles("USER");
    }

}

我评论的那行说:

The inferred type UserService is not a valid substitute for the bounded parameter <T extends UserDetailsService>.

我该如何解决这个问题,以便我可以从我自己的数据库中检索用户?

最佳答案

服务层

您必须创建一个单独的 service 实现 org.springframework.security.core.userdetails.UserDetailsS​​ervice 并将其注入(inject)到 AuthenticationManagerBuilder 中。

@Component
public class SecUserDetailsService implements UserDetailsService{

    @Autowired
    private UserRepository userRepository;

    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        /*Here add user data layer fetching from the MongoDB.
          I have used userRepository*/
        User user = userRepository.findByUsername(username);
        if(user == null){
            throw new UsernameNotFoundException(username);
        }else{
            UserDetails details = new SecUserDetails(user);
            return details;
        }
    }
}

型号

UserDetails 也应该实现。这是 POJO,它将通过 Spring 保留用户经过身份验证的详细信息。您可以像我所做的那样将您的 Entity 数据对象包含在其中。

public class SecUserDetails implements UserDetails {

    private User user;

    public SecUserDetails(User user) {
        this.user = user;
    }
    ......
    ......
    ......
}

安全配置

Autowiring 我们之前创建的服务并将其设置在 AuthenticationManagerBuilder

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    @Autowired
    SecUserDetailsService userDetailsService ;

    @Autowired
    public void configAuthBuilder(AuthenticationManagerBuilder builder) throws Exception {
        builder.userDetailsService(userDetailsService); 
    }
}

关于java - 使用 Spring Security + Spring 数据 + MongoDB 进行身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29606290/

相关文章:

java - token 编码/解码问题 - Spring

spring - Spring MVC错误404错误请求Kotlin

node.js - express , Mongoose : OverwriteModelError : Cannot Overwrite 'xxxxx' model once compiled

node.js - ID 的序列号

java - 在java中将EST时间转换为本地时间

java - 无法解析方法 setVisibility(int)

Java 小程序和缓存问题

java - 将 LineChart(javafx) 样式设置为子元素

java - 如何在hibernate中使用条件转换mysql连接查询

mongodb - Mongo按实际上是数字的字符串值排序