我想将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身份验证 下面是我的配置 我应该在哪里提到域名?