2014-05-16 2 views
1

나는 스프링 MVC + 스프링 시큐리티를 사용하여 웹 응용 프로그램을 개발하고있어, 나는 다음과 같은 URL이 :Spring 보안을 사용하여 URL을 보호하는 방법은 무엇입니까?

/*this URL should be accessible by any User, i.e. users should be able to see other users' profiles*/ 
/users/someUserId/profile 

/* all the following URLs should be accessed only by the current authenticated user */ 
/users/someUserId/profile/edit 
/users/someUserId/picture/edit 
/users/someUserId/notifications 
/users/someUserId/friends 

을 나는 이전에 기술로 확보 할 필요가있다. 이처럼 뭔가 달성 할 수 있는지

@Override 
protected void configure(HttpSecurity http) throws Exception { 
    http 
      .authorizeRequests() 
       .antMatchers("/resources/**").permitAll() 
       .regexMatchers("https://stackoverflow.com/users/[\\w]+/profile").authenticated() 
       .antMatchers("https://stackoverflow.com/users/[\\w]/**").access("principal.name == regexGroupMatch") 
       .anyRequest().authenticated()    
      .and() 
       .jee().mappableRoles("Admin", "User"); 
    } 

내가 알고 싶은 : 이렇게

.antMatchers("/heroes/[\\w]/**").access("principal.name == regexGroupMatch") 

을, 난 단지 사용자 기꺼이 다음과 같이

내 구성 방법은 간다 user1을 통해 URL에 액세스 할 수 있습니다.

/users/user1/profile/edit 
/users/user1/picture/edit 
/users/user1/notifications 

그래서, 사용자 2는 앞서 언급 한 URL을 액세스 할 수 없습니다 있어야하지만 액세스 할 수 있어야합니다 : /사용자/사용자 1/프로필/편집 /사용자/사용자 1/사진/편집 /사용자/사용자 1/통지

뿐만 아니라 :

/users/user1/profile 
/users/user2/profile 
/users/user3/profile 
etc... 

이 그 사용하여 봄 보안을 달성 할 수 있습니까?

+0

설명서를 읽었습니까? – chrylis

+0

예 @chrylis, 설명서 [here] (http://docs.spring.io/spring-security/site/docs/3.2.3.RELEASE/reference/htmlsingle/)를 읽었습니다. '.antMatcher (url)'을 사용하여 그것을 달성 할 수 있다고 믿지만, 현재 사용자 만 자신의 프로파일을 볼 수있게하기 위해 어떤 방법을 사용해야하는지 모르겠습니다. – fvdalcin

+2

Btw, [이 주제] (http://meta.stackoverflow.com/questions/251758/why-is-stack-overflow-so-negative-of-late)를 읽으셨습니까? – fvdalcin

답변

2

아니요, 정규식에 일치하는 그룹을 추출하여 사용자 이름과 비교할 수있는 기능이 없습니다. 또한 개미 패턴은 정규 표현식을 전혀 지원하지 않습니다.

복잡한 URL 패턴에 의존하는 것은 좋지 않습니다. 이런 경우에는 컨트롤러 레벨이나 일부 서비스 인터페이스에서 메서드 보안을 사용하는 것이 가장 좋습니다. 여기서 메서드 매개 변수를 이름으로 참조 할 수 있습니다. 예를 들어 메소드 보안 표현식을 사용하여, 당신은, 또는

@PreAuthorize("#user.name == authentication.name") 
public void editUser(User user) { 
    .... 
} 

를 작성할 수 미샤가 말한대로, 당신은 일을 간단하게 표현보다 더 복잡하면 바람직하다 직접 규칙을 코딩 할 수 있습니다.

+0

글쎄, URL 패턴을 단순화하기 위해 URL 패턴을 변경했습니다. 제안한대로 서비스 계층을 보호하는 것도 좋은 생각입니다. – fvdalcin

1

스프링 보안은 해당 엔드 포인트에 액세스하는 클라이언트가 인증되도록 보장하지만 엔드 포인트가 사용자가 볼 수있는 데이터 만 리턴하도록하는 것은 사용자의 책임입니다. 생각해보십시오 - Spring Security가 응용 프로그램에서 각 사용자가 볼 수있는 데이터를 어떻게 알 수 있습니까? 여기

@RequestMapping(value = "https://stackoverflow.com/users/{user}/profile/edit", method = RequestMethod.GET) 
public ModelAndView edit(
    HttpServletRequest request, 
    @PathVariable("user") String, 
    EditRequest edit) { 

    // Accept or reject the request if the user variable and authenticated 
    // user match up as required. 
} 

, 당신은 프로그래밍 (요청 개체에서 검색 할) 인증 된 사용자를 구분해야하고, 문맥에 의해 명시된 사용자 :

당신은 아마 이미 다음과 같습니다 컨트롤러 방법이있다. 컨텍스트의 사용자가 인증 된 사용자 인 경우 사용자가 자신의 프로필을 수정할 수 있으므로이 요청을 수락 할 수 있습니다. 그렇지 않으면 일종의 인증 예외를 throw 할 수 있습니다. 또는 더 나은 방법은 해당 페이지에 액세스 할 수없는 이유를 설명하는 좋은보기를 반환하는 것입니다.

요청 본문에 정보를 사용하고 있지 않기 때문에 필터로 다시 작성할 수도 있습니다. 이 필터는 실제로 Spring Security에 연결됩니다.

관련 문제