2017-02-10 15 views
0

Я пытаюсь поиграть с сервисом управления пользователями с открытым исходным кодом, например keycloak. Создание приложения angularJs, которое будет отправлять HTTP-запрос на конечную точку REST, защищенную keycloak. Я использую весенний ботинок на бэкэнде. Я могу вызвать конечную точку и получить результат, который невозможен, поскольку он должен блокировать запрос, поступающий от несанкционированного источника.keycloak (spring boot) Не аутентифицируется конечная точка REST

Это две ссылки, которые я последовал

  1. keycloak with angular and spring boot

2. Github link to keycloak example

контроллер, который состоит из конечной точки REST, что пользователь зайдет.

@RequestMapping(value = "/api/getSample") 
public test welcome() { 
    return new test("sample"); 
} 

@RequestMapping(value = "/check/test") 
public test welcome2() { 
    return new test("test"); 
} 

Spring приложений загрузки с CORS файлы свойств

@SpringBootApplication 
public class Application 
{ 
    public static void main(String[] args) 
    { 
     SpringApplication.run(Application.class, args); 
    } 

    @Bean 
    public FilterRegistrationBean corsFilter() { 
     UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); 
     CorsConfiguration config = new CorsConfiguration(); 
     config.setAllowCredentials(true); 
     config.addAllowedOrigin("*"); 
     config.addAllowedHeader("*"); 
     config.addAllowedMethod("*"); 
     source.registerCorsConfiguration("/api/*", config); 

     FilterRegistrationBean bean = new FilterRegistrationBean(new CorsFilter(source)); 
     bean.setOrder(0); 
     return bean; 
    } 
} 

Применение для

server.port = 8090 

keycloak.realm = demo 
keycloak.auth-server-url = http://localhost:8080/auth 
keycloak.ssl-required = external 
keycloak.resource = tutorial-backend 
keycloak.bearer-only = true 
keycloak.credentials.secret = 111-1111-111-111 
keycloak.use-resource-role-mappings = true 
keycloak.cors= true 

keycloak.securityConstraints[0].securityCollections[0].name = spring secured api 
keycloak.securityConstraints[0].securityCollections[0].authRoles[0] = user 
keycloak.securityConstraints[0].securityCollections[0].patterns[0] = /api 

keycloak.securityConstraints[0].securityCollections[1].name = insecure stuff 
keycloak.securityConstraints[0].securityCollections[1].authRoles[0] = user 
keycloak.securityConstraints[0].securityCollections[1].patterns[0] = /check 

Там находятся два тест

  1. Создание REST вызова без входа в систему. В в этом случае я могу вернуть результат. Это не должно быть, я должен заблокировать (получить ошибку 401).

  2. Выполнение вызова REST при входе в систему. Я могу вызвать api/getSample, и это правильное поведение. Однако, когда я звоню чек/тест я получаю XMLHttpRequest cannot load http://localhost:8090/check/test. Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:9000' is therefore not allowed access. The response had HTTP status code 403.

ответ

0

Вы не добавили зависимость Spring загрузки Keycloak адаптера в вашем pom.xml.

Для 2. Вы не настроили CORS для/проверки (только для/API)

<dependency> 
     <groupId>org.keycloak</groupId> 
     <artifactId>keycloak-spring-boot-adapter</artifactId> 
     <version>${keycloak.version}</version> 
    </dependency> 
+0

of the course У меня есть – krs8888

1

1)

Я не знаю, как именно ваш тест выглядит, но возможно, система думает, что вы все еще вошли в систему? Вы можете попытаться удалить свои файлы cookie, чтобы убедиться, что нет доступа к токену.

Другим вариантом может быть то, что Spring Boot не распознает адаптер Keycloak и, следовательно, не обеспечивает доступ. В основном вы настраиваете адаптер, добавляя зависимости keycloak-spring-boot-adapter и keycloak-tomcat8-adapter (more details here).

2)

Похоже, что CORS не настроен должным образом. Вы можете рассмотреть эту реализацию для конфигурации (more details here):

@Bean 
FilterRegistrationBean corsFilter(
     @Value("${tagit.origin:http://localhost:9000}") String origin) { 
    return new FilterRegistrationBean(new Filter() { 
     public void doFilter(ServletRequest req, ServletResponse res, 
          FilterChain chain) throws IOException, ServletException { 
      HttpServletRequest request = (HttpServletRequest) req; 
      HttpServletResponse response = (HttpServletResponse) res; 
      String method = request.getMethod(); 
      // this origin value could just as easily have come from a database 
      response.setHeader("Access-Control-Allow-Origin", origin); 
      response.setHeader("Access-Control-Allow-Methods", 
        "POST,GET,PUT,DELETE"); 
      response.setHeader("Access-Control-Max-Age", Long.toString(60 * 60)); 
      response.setHeader("Access-Control-Allow-Credentials", "true"); 
      response.setHeader(
        "Access-Control-Allow-Headers", 
        "Origin,Accept,X-Requested-With,Content-Type,Access-Control-Request-Method,Access-Control-Request-Headers,Authorization"); 
      if ("OPTIONS".equals(method)) { 
       response.setStatus(HttpStatus.OK.value()); 
      } 
      else { 
       chain.doFilter(req, res); 
      } 
     } 

     public void init(FilterConfig filterConfig) { 
     } 

     public void destroy() { 
     } 
    }); 
}