-1

스프링 보안으로 보호되는 REST 엔드 포인트를 제공하는 스프링 부팅 응용 프로그램이 있습니다.스프링 보안 : 서비스 호출에 따라 액세스 제공

서비스 호출에 따라 일부 경로에 대한 액세스를 제한해야합니다.의 나는이 같은 서비스를 가정 해 봅시다 :

@Service 
public class AccessService { 
    boolean hasAccess(String requestedPath) { 
     // some business logic here 
    } 
} 

서비스는 어떤 비즈니스 환경에 사용자 역할을 확인하고 true 또는 false를 반환합니다.

이제이 서비스 호출을 내 보안 구성에 통합해야합니다.

은 지금까지 나는 다음과 같은 구성을 가지고 : (완전히 정적으로)

@Override 
protected void configure(HttpSecurity http) throws Exception { 
     http 
       ... 
       .and().authorizeRequests() 
       .anyRequest().hasRole("USER"); 
} 

나는 여기에 서비스 호출을 추가하는 방법을 볼 수 없습니다.

내가 노력하고있어 :

은 현재 내가 무시 내 AuthenticationProvider 및 추가 기능으로 확장 생각 해요.

다른 옵션은 일종의 인증을 수행하는 클래스에서 내 REST 컨트롤러를 확장하는 것이지만 가능한 경우 확실하지 않습니다.

질문 : 서비스 메서드 호출을 기반으로 REST 끝점을 어떻게 보호 할 수 있습니까? 그 일을하는 올바른 방법은 무엇입니까?

+1

[참조 가이드] (https://docs.spring.io/spring-security/site/docs/current/reference/html/el-access.html#el-access-web)를 읽어 보시기 바랍니다. . 'anyRequest(). access ("@ accessService.hasAccess (request.requestURI) && hasRole ('USER')")와 같은 것입니다. –

답변

1

the reference guide에 설명되어 있습니다. 기본적으로 hasRole 대신 access 표현식을 사용해야합니다. 그런 다음 강력한 보안 표현식을 작성할 수 있습니다.

anyRequest() 
    .access("@accessService.hasAccess(request.reques‌​tURI) && hasRole('USER')"); 

이 역할 ROLE_USER하고있는 자신 만의 논리에 따라 액세스 할 수있는 사용자에 대한 액세스를 제한 : 다음과 같은

뭔가 트릭을 할해야합니다.

1

나는 이것을 사용하는 것이 좋은 방법이라고 생각한다. @PreAuthorize 일부 문서는 Expression-Based Access Control이다.
또한 사용자의 특정 요구에 사용자 정의 할 자신의 평가자 클래스/메소드를 추가 할 수 있습니다 : @PreAuthorize("@customPermissionEvaluator.accessMethod(variable)")

예 클래스 :

@Service(value = "customPermissionEvaluator") 
public class CustomPermissionEvaluatorImpl implements CustomPermissionEvaluator { 
    @Override 
    public boolean accessMethod(int variable) {  
     if (variable == 1) { 
      return true; 
     }  
     return false; 
    } 
}