自动化测试特定区域滑动_自动化用户特定实体的访问控制
自動化測試特定區域滑動
實際上,每個Web應用程序都應該有多個用戶,并且每個用戶都有一些數據-帖子,文檔,消息等等。 最明顯的事情是保護這些實體免遭非這些資源合法所有者的用戶獲取。
不幸的是,這不是最容易的事情。 我并不是說很難,它不像簡單地返回資源那樣直觀。 當您是/record/{recordId}端點時,您將立即執行對recordId的數據庫查詢。 只有這樣,才需要檢查此記錄是否屬于當前經過身份驗證的用戶。
框架在這里沒有幫助,因為這種訪問控制和所有權邏輯是特定于域的。 沒有明顯的通用方法來定義所有權。 它取決于實體模型和實體之間的關系。 在某些情況下,它可能非常復雜,其中涉及在聯接表中查找(用于多對多關系)。
但是您應該自動執行此操作,原因有兩個。 首先,在每個端點/控制器方法上手動執行這些檢查很繁瑣,并且使代碼難看。 其次,更容易忘記添加這些檢查,尤其是在有新開發人員的情況下。
您可以在DAO的所有地方進行這些檢查,但通常應盡早失敗,因此這些檢查應在控制器(端點處理程序)級別上進行。 對于Java和Spring,可以使用批注和HandlerInterceptor來自動執行此操作。 在使用任何其他語言或框架的情況下,也可以使用類似的方法-一些可插入的方式來描述要檢查的所有權關系。
以下是放置在每個控制器方法上的示例注釋:
public @interface VerifyEntityOwnership {String entityIdParam() default "id";Class<?> entityType(); }然后定義攔截器(當然,應將其配置為執行)
@Component public class VerifyEntityOwnershipInterceptor extends HandlerInterceptorAdapter {private static final Logger logger = LoggerFactory.getLogger(VerifyEntityOwnershipInterceptor.class);@Autowiredprivate OrganizationService organizationService;@Autowiredprivate MessageService MessageService;@Autowiredprivate UserService userService;@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {Authentication authentication = SecurityContextHolder.getContext().getAuthentication();// assuming spring-security with a custom authentication token typeif (authentication instanceof ApiAuthenticationToken) {AuthenticationData authenticationData = ((ApiAuthenticationToken) authentication).getAuthenticationData();UUID clientId = authenticationData.getClientId();HandlerMethod handlerMethod = (HandlerMethod) handler;VerifyEntityOwnership annotation = handlerMethod.getMethodAnnotation(VerifyEntityOwnership.class);if (annotation == null) {logger.warn("No VerifyEntityOwnership annotation found on method {}", handlerMethod.getMethod().getName());return true;}String entityId = getParam(request, annotation.entityIdParam());if (entityId != null) {if (annotation.entityType() == User.class) {User user = userService.get(entityId);if (!user.getClientId().equals(clientId)) {return false;}} else if (annotation.entityType() == Message.class) {Message record = messageService.get(entityId);if (!message.getClientId().equals(clientId) {return false;}} // .... more}}return true;}@SuppressWarnings("unchecked")private String getParam(HttpServletRequest request, String paramName) {String value = request.getParameter(paramName);if (value != null) {return value;}Map<String, String> pathVariables = (Map<String, String>) request.getAttribute(HandlerMapping.URI_TEMPLATE_VARIABLES_ATTRIBUTE);return pathVariables.get(paramName);} }您會看到這假定每種類型都需要自定義邏輯。 如果您的模型很簡單,則可以使之通用–使所有實體都使用它們都定義的getClientId()方法實現某些Owned接口。 然后只需擁有dao.get(id, entityClass); 并避免使用特定于實體的邏輯。
請注意,當方法上沒有注釋時,將顯示警告-那里表示您可能已忘記添加一個方法。 某些端點可能不需要所有權檢查–對于它們,您可以具有特殊的@IgnoreEntityOwnership批注。 關鍵是要做出有意識的決定,不驗證所有權,而不是忘記所有權并引入安全問題。
我的意思可能很明顯。 但是我已經看到了許多這種遺漏的例子,包括生產政府項目。 就像我說的,框架不會強迫您考慮這一方面,因為它們不能以通用的方式做到這一點– Web框架通常與實體模型無關,而ORM與控制器無關。 有處理所有這些方面的綜合框架,但是即使它們沒有通用的機制 (至少我沒有意識到)。
安全性包括將一套良好實踐和原則應用于系統。 但是,它還包括一些程序和自動化程序,這些程序和自動化程序可以幫助開發人員和管理員不要忽略他們通常知道的東西,而會時不時地忘記。 而且,應用安全性原則越乏味,則一貫地應用它的可能性就越大。
翻譯自: https://www.javacodegeeks.com/2018/10/automate-access-control-user-entities.html
自動化測試特定區域滑動
總結
以上是生活随笔為你收集整理的自动化测试特定区域滑动_自动化用户特定实体的访问控制的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: idea 构建spring_以Sprin
- 下一篇: 现在买整机比自己组一台电脑还便宜现在买整