当前位置: 首页 > 面试题库 >

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

隗轶
2023-03-14
问题内容

我想将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.UserDetailsService并将其注入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之前保留用户身份验证的详细信息。正如我已经做过的那样,您可以将包装在其中的实体数据对象包括在内。

public class SecUserDetails implements UserDetails {

    private User user;

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

安全配置

自动连接我们之前创建的服务,并将其设置在 AuthenticationManagerBuilder

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

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


 类似资料:
  • 我可以使用shell命令在mongodb上进行身份验证: 目前,我正在从事一个项目,我想使用Hibernate OGM。我已设置文件: 正如您所看到的,我使用作为身份验证机制。 原因:org.hibernate.service.spi.serviceException:OGM000071:无法启动数据存储提供程序,原因:org.hibernate.hibernateException:OGM001

  • 我已经使用以下命令启动了,并创建了一个用户来执行此操作(正在工作,因为如果我手动执行工作),直到我添加了这个,它才开始工作,所以也许这就是我需要的。 我错过了什么?

  • 问题内容: 我需要从数据库对用户进行身份验证,Spring Security文档没有告诉您如何使用hibernate进行身份验证。那可能吗,我该怎么做? 问题答案: 您必须制作自己的自定义身份验证提供程序。 示例代码: 从Hibernate加载用户的服务: 将您的实体转换为spring用户对象的服务: 基于命名空间的application-context-security.xml如下所示:

  • 我想为登录创建自定义endpoint。 当密码和用户名正确时,它可以正常工作,但对于不正确的数据返回200和登录表单而不是401。 public-class-SecurityConfiguration扩展了WebSecurityConfigurerAdapter{private-final-UserDetailsService-UserDetailsService; }

  • 下面是我得到的错误(堆栈跟踪中列出的最后几个原因) 它似乎不喜欢contextSource bean的constructor-arg中列出的URL,尽管我不确定原因。 另外,我怀疑这个配置的其他部分是不正确的。例如,我在ldap-server标记和contextSource bean中定义了ldap服务器URL。这似乎是不必要的重复,但在示例中是这样做的。有人能好好看看配置,以确保它是正常的吗?

  • 我正在尝试使用spring security 2.0.3进行LDAP身份验证 下面是我的配置 我应该在哪里提到域名?