Spring boot:使用 MongoDB 创建用户 [关闭]
Posted
技术标签:
【中文标题】Spring boot:使用 MongoDB 创建用户 [关闭]【英文标题】:Spring boot : Create a User with MongoDB [closed] 【发布时间】:2017-08-13 03:55:45 【问题描述】:好的,我有一个问题:
如何使用 spring 创建用户?
我学到了一些信息,最好的方法是使用 UserDetails ... 但我找不到要使用良好做法的信息:UserDetails with mongodb。
当我有我的用户详细信息时,如何创建正确的注册/登录休息方法?
我还有一个关于休息安全的问题:
我有 spring 的其余模块,但是如何保护用户的存储库?我的意思是,每个登录的用户只能看到/编辑他的所有者。
使用 rest 模块,您可以使用具有 Spring 安全性的角色保护路径,但您不能将资源分配给用户。 (我的意思是用户详细信息)
我真的需要帮助,因为它是一个框架,我不想重做 spring 所做的,因为它是一个框架......但我是新手!
如果您需要更多详细信息,我可以准确说明您不明白的内容,但我是法国人,所以我的英语并不完美。
【问题讨论】:
【参考方案1】:我认为this answer 可以帮助您解决问题,即使您不使用 Spring Data MongoDB。
基本上,您需要实现UserDetailsService
接口并将其注释为@Component
或@Service
bean。
那你需要自己实现一个UserDetails
POJO(例子很多)。
最后,您需要使用自定义的 UserService 配置 Spring Security,这对于 Spring Boot 来说非常简单。
因此,如果您还没有使用Spring Boot
,我强烈建议您这样做。它使 Spring 开发人员的生活变得如此轻松。
为了保护您的 REST 端点,您可以创建某种 PermissionService
(常规 Spring @Service
bean)来检查当前用户是否被允许访问/编辑资源。
例子:
@Slf4j
@Service
public class PermissionService
public boolean hasPermission(String userId, String resourceId)
log.debug("Checking permission for [] on resource []", userId, resourceId);
hasText(userId);
hasText(resourceId);
return resourceId == 1;
在任何 @RestController
中,您现在可以添加 Spring Security 注释并使用 SPEL
(Spring 表达式语言)来评估条件:
@RestController
@RequestMapping("/api/resource")
public class ResourceController
@GetMapping("/id")
@PreAuthorize("@permissionService.hasPermission(userDetails.userId, resourceId)")
public ResponseEntity findResource(@PathVariable("id") String resourceId, @MyUser SecUserDetails userDetails)
return ResponseEntity.ok(resourceRepository.findById(resourceId));
现在,你一定在想:这个奇怪的@MyUser
注释是什么?嗯,它是一个自定义注解,可以将当前 Spring Security UserDetails 实例注入到控制器方法中。
你可以这样定义:
@Slf4j
@Component
public class MyUserMethodArgumentResolver implements HandlerMethodArgumentResolver
private final UserService userService;
@Autowired
public MyUserMethodArgumentResolver(UserDetailsService userDetailsService)
this.userDetailsService = userDetailsService;
@Override
public boolean supportsParameter(MethodParameter methodParameter)
return methodParameter.getParameterAnnotation(MyUser.class) != null
&& methodParameter.getParameterType().equals(SecUserDetails.class);
@Override
public Object resolveArgument(MethodParameter methodParameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest,
WebDataBinderFactory binderFactory) throws Exception
if (this.supportsParameter(methodParameter))
return this.userService.getCurrentUser();
else
return WebArgumentResolver.UNRESOLVED;
因此,每当控制器找到此 @MyUser
注释时,它都会调用此 WebArgumentResolver 来检索当前用户详细信息(SecUserDetails
实例)并将其注入控制器方法中。
然后可以在PermissionService
中使用它来检查访问权限。
【讨论】:
问题是org.springframework.boot:spring-boot-starter-data-rest
用MongoRepository<User, Long>
自动生成所有资源的休息路径,我不知道如何控制它们! :c
你不一定需要spring-boot-starter-data-rest
,你可以使用spring-boot-starter-data
(Spring Data) 创建你自己的Repository接口并从MongoRepository
扩展。以上是关于Spring boot:使用 MongoDB 创建用户 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章
Spring Boot 2.3.0 - MongoDB 库不会自动创建索引
使用 Spring Boot 和 mongodb 运行 camunda