4.7.2.6. Собственные контроллеры, защищенные OAuth2

Если вам необходимо создать свой REST контроллер, защищенный с помощью OAuth2, сделайте следующее:

  1. Предположим, ваш контроллер выглядит следующим образом:

    package com.company.test.portal.myapi;
    
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    import com.company.test.services.SomeService;
    
    @RestController
    @RequestMapping("/myapi")
    public class MyController {
    
        @Inject
        protected SomeService someService;
    
        @GetMapping("/dosmth")
        public String doSmth() {
            return someService.getResult();
        }
    }
  2. Создайте новый файл конфигурации Spring с именем rest-dispatcher-spring.xml внутри корневого пакета (например, com.company.test) модуля web или portal. Содержимое файла должно быть следующим:

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xmlns:context="http://www.springframework.org/schema/context"
           xmlns:security="http://www.springframework.org/schema/security"
           xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-4.1.xsd">
    
        <!-- Define a base package for your controllers-->
        <context:component-scan base-package="com.company.test.portal.myapi"/>
    
        <security:http pattern="/rest/myapi/**"
                       create-session="stateless"
                       entry-point-ref="oauthAuthenticationEntryPoint"
                       xmlns="http://www.springframework.org/schema/security">
            <!-- Specify one or more protected URL patterns-->
            <intercept-url pattern="/rest/myapi/**" access="isAuthenticated()"/>
            <anonymous enabled="false"/>
            <csrf disabled="true"/>
            <cors configuration-source-ref="cuba_RestCorsSource"/>
            <custom-filter ref="resourceFilter" before="PRE_AUTH_FILTER"/>
            <custom-filter ref="cuba_AnonymousAuthenticationFilter" after="PRE_AUTH_FILTER"/>
        </security:http>
    </beans>
  3. Задайте аддитивное свойство приложения cuba.restSpringContextConfig в файле свойств соответствующего модуля, например, в portal-app.properties:

    cuba.restSpringContextConfig = +com/company/test/rest-dispatcher-spring.xml
  4. Новый контроллер будет помещен в контекст, связанный с сервлетом CubaRestApiServlet, поэтому URL для доступа к методам контроллера будут начинаться с /rest, т.е. метод doSmth() будет доступен по адресу: http://localhost:8080/app-portal/rest/myapi/dosmth.

    Warning

    Адреса для доступа к методам кастомных контроллеров НЕ ДОЛЖНЫ начинаться с /rest/v2.