2012-08-01 5 views
0

스프링 MVC를 사용하여 작은 애플리케이션을 개발 중입니다. 사용자가 여러 유형의 콘텐츠를 넣을 수있는 광고 게시판입니다. security-config.xml을 사용하여 내 앱 (User, Admin, Anon)의 여러 역할에 대한 보안을 성공적으로 구성했습니다. 이제 게시하려면 로그인해야합니다. 관리 사용자 만 관리 패널 등을 볼 수 있습니다.스프링 MVC 사용자 확인

이제 내 문제는 각 사용자에 대한 보안을 설정해야한다는 것입니다. 즉, 콘텐츠를 수정하는 사용자가 해당 사용자입니다. 내용을 만들었습니다. 가장 직접적인 접근법은 물론 내가 함수를 호출하기 전에 사용자가 기록한 내용과 작성자가 모두 동일하면 Java를 체크인하는 것입니다. 이런 식으로 뭔가 :

@RequestMapping("/listing/deletecontent.html") 
public String deleteUserContent(@RequestParam String contentId) { 
    //Get the logged user 
    UserDetails userDetails = (UserDetails) SecurityContextHolder.getContext().getAuthentication().getPrincipal(); 
    User user = userService.loadUserByUsername(userDetails.getUsername()); 

    //Check if the user logged and the content owner are the same 
    if (user == the_user_that_created_the_content) 
      listingService.deleteContent(Integer.valueOf(contentId)); 

    return "redirect:/listing/usercontent.html"; 
} 

나는 왜 그러나 나는이 방식을 싫어하지 않습니다. 그것은 필요한 모든 곳에서 동일한 검증을 반복해서 "복사 - 붙여 넣기 (copy-paste)"한 것일뿐입니다. 어쩌면 Spring이 security-config.xml에 설정할 수있는 기능을 가지고 있다고 생각했는지, 아마도 콘텐츠 ID 매개 변수를 가진 모든 URL에 대해이 확인을 수행 한 다음 "실제" 테스트를 통과하면 URL. 나도 몰라, 내가 너에게 묻고 싶어하는 것. ¿이 접근 방식에 대해 어떻게 생각하십니까? ¿ 내가 너무 까다 롭고 나쁘지 않은가? ¿ 당신이 "더 나은"방법을 알고 있습니까? 사전에 너무 많은

감사합니다, 제이미

답변

0

나는 봄 보안 참조 expression-based access control chapter에서보기를 닫습니다 좋습니다. 따라서 지금까지 이해할 수있는 것처럼 직접 사용 권한을 확인하면 안됩니다. @PreAuthorize 주석을 사용하십시오. ACL 모듈을 사용해 보거나 요구 사항을 충족시키지 못하면 사용자 정의 PermissionEvaluator을 더 잘 구현할 수 있습니다.

P. 또한 이것과 같은 것은 무엇입니까 : @PreAuthorize("principal.id == #content.createdBy.id")

+0

정말 고마워요. 제가 정확히 찾고 있던 입력 내용이었습니다. –

+0

다행입니다. 정말 유용하다면 내 대답을 수락하십시오. –