2013-01-10 3 views
1

저는 Spring MVC로 구현 된 몇 가지 RESTful 서비스를 통해 리소스 세트를 노출했습니다. 이미 HTTPBasicAuthentication 및 HTTPS를 기반으로하는 인증을 사용합니다. 일부 자원은 일부 사용자 만 액세스 할 수 있어야합니다.Spring - RESTful 개인 리소스를 보호하는 방법?

예를 들어 URI /users/{userid}/photos의 모든 하위 리소스는 사용자 userid에게만 액세스 할 수 있기를 원합니다. 사실 내 응용 프로그램에서는 모든 인증 된 사용자가 액세스 할 수 있습니다. userid을 제외한 다른 사용자로부터 어떻게 보호 할 수 있습니까? 그리고이 리소스에 대한 액세스를 일부 사용자 (예 : userid 님의 친구)에게만 허용하려면 어떻게해야합니까?

답변

0

@Secured(value = {"userid"}) 또는 @Secured(value = {"#userid"}) 대신 작동하지 않는 @PreAuthorize("authentication.name == #userId")을 사용하여 해결했습니다.

서블릿 컨텍스트 구성 파일에 <security:global-method-security pre-post-annotations="enabled"/>을 추가해야합니다.

1

스프링 보안을 강력히 권장합니다. Spring 보안을 사용하면 특정 URL 엔드 포인트에 대한 액세스를 특정 역할을 담당하는 주체로 제한 할 수 있습니다.

또한 JSR-250 주석을 사용할 수 있습니다 spring security intercept url roles

참조 : http://forum.springsource.org/showthread.php?126395-How-to-secure-Spring-MVC-controllers-using-Spring-Security-annotations

참조 -

난 당신이 특정의 URL/자원/{사용자}을 제한 할 필요가 있다고 생각하지 않습니다 사용자.

@ResponseBody 
    @RequestMapping(value = "https://stackoverflow.com/users/{userid}/photos", method = RequestMethod.GET) 
    @Secured(value = {"userid"}) 
    public ResponseEntity<ModelMap> getPhotos(....) throws Exception { 

추가 할 수 있습니다 당신은

+0

답변 해 주셔서 감사합니다.하지만 @ Razh의 답변은 더 구체적입니다. 더욱이, RESTful 인 관점에서 볼 때, 어떤 역할 (admin)이 할 수있는 관점에서 보안 컨텍스트로부터 사용자 신원을 공제하는 것이 아니라 사용자 자원을 표현하기 위해'/ resource/{user} '를 갖는 것이 더 정확하다. 이 자원까지도 액세스하십시오. – user1781028

3

당신이 당신의 방식에 이런 일을 할 수있는 ... 누군가가 URL을 단조하여 특정 사용하는 이름을 주입 할 보안 컨텍스트에서 사용자 이름을 공제하고 안 나중에 수행하려는 사용자가 많을 경우

@Secured(value = {"ROLE_ADMIN", "userid"}) 
+0

감사합니다. 스프링 보안 기능이 없어졌습니다. – user1781028

+0

걱정하지 마시고, 도움이됩니다. :) – justMe

+1

철저히 살펴 보려면 봄 보안 컨텍스트 파일에서''를 추가하여 보안 주석을 활성화해야합니다. – user1781028

1

사용자 지정 보안 식을 사용할 수 있습니다.

<security:intercept-url pattern="https://stackoverflow.com/users/{userid}/photos" access="getUserIdUrlPathParameter() == principal.userId"/> 

수행 방법은 this post을 참조하십시오.

관련 문제