-1

我有春季啓動應用程序,它公開了受春季安全保護的REST端點。春季安全:根據服務請求提供訪問

我需要根據服務調用限制對某些路徑的訪問。比方說,我有一個服務是這樣的:

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

該服務將檢查用戶的角色,一些企業經營狀況,並返回truefalse

現在我需要將此服務調用集成到我的安全配置中。

到目前爲止,我有配置是這樣的:

@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解釋。基本上你需要使用access表達式而不是hasRole。然後您可以編寫強大的安全表達式。

類似下面應該做的伎倆:

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

這限制與角色ROLE_USER並根據自己的自定義邏輯有機會訪問用戶。

1

我認爲這是一個很好的方法是使用@PreAuthorize 一些文件可以在這裏找到:Expression-Based Access Control
你還可以添加自己的評估類/方法來定製您的特定需求: @PreAuthorize("@customPermissionEvaluator.accessMethod(variable)")

Example類:

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