2017-03-21 179 views
0
創建用戶

好了,所以我有一個問題:春季啓動:用MongoDB的

如何創建和春天有個用戶?

我瞭解一些信息,並做它使用的UserDetails ... 最好的方式,但我不能找到的信息與良好做法使用:是UserDetails MongoDB的。

當我有我的UserDetails,如何創建一個正確的註冊/登錄休息方法?

我對其餘的安全性的其他問題:

我有其他模塊春天,但如何通過用戶來確保存儲庫?我的意思是,每個登錄用戶只能看到/編輯他是誰的所有者。

通過其他模塊,您可以使用Spring安全保護具有角色的路徑,但無法爲用戶分配資源。 (userDetails我的意思是)

我真的需要幫助,因爲它是一個框架,我不想重做春天做了什麼,因爲它是一個框架......但我是新的!

如果你想了解更多的細節,我可以精確的你不明白,但我是法國人,所以我的英語不完美。

回答

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(春季表達式語言)評估條件:

@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中用於檢查訪問。

+0

問題是''org.springframework.boot:spring-boot-starter-data-rest'生成所有資源的自動休息路徑,並且'MongoRepository '我不知道如何控制它們! :c –

+0

您不一定需要'spring-boot-starter-data-rest',您可以使用'spring-boot-starter-data'(Spring Data)創建您自己的Repository接口並從MongoRepository '。 –