2017-02-14 34 views
0

Используя платформу воспроизведения, я хотел бы применить различные политики к входящим запросам, чтобы разрешить запуск внешнего скрипта html + на моем веб-сайте. Это необходимо для некоторых сторонних интеграций, которые предоставляют вам свой собственный контент html + script, для взаимодействия с пользователем и который должен быть доставлен через ваш оригинальный веб-сайт.политики обеспечения безопасности нескольких материалов на платформе воспроизведения

Политику следует определять на основе некоторого состояния, прежде всего субдомена. В спецификации фильтра есть только один глобальный play.filters.headers.contentSecurityPolicy, который влияет на весь сайт. Но я не хочу это ослабить. Запросы некоторым конкретным thirdparty.website.com на моем website.com должны получить ослабленную политику или даже вообще никакой политики, но оставшийся сайт должен продолжить жесткую политику.

Я ценю любые идеи или помощь.

+0

Вы, вероятно, придется написать свой собственный фильтр. В этом фильтре вы можете проверить объект 'request' для заголовков, домена и т. Д., А затем применить к нему определенные заголовки. См. Https://github.com/playframework/playframework/blob/2.5.x/framework/src/play-filters-helpers/src/main/scala/play/filters/headers/SecurityHeadersFilter.scala#L134-L137 как играть реализовано это SecurityHeadersFilter – mkurz

+0

Благодаря @mkurz, то, как вы описали, отлично работает. – mcku

+1

Приятно слышать, что я могу помочь. – mkurz

ответ

1

Вот рабочий пример, если кому-то это нужно. () Спасибо @mkurz за указатель)

Очень простое приложение SecurityHeadersFilter реплицируется здесь, а заголовки безопасности пропускаются, если оба критерия хоста и пути удовлетворены. Если нет, исходное поведение сохраняется.

class ConditionalSecurityHeadersFilter @Inject() (implicit config: SecurityHeadersConfig) extends SecurityHeadersFilter(config) { 
override def apply (next: EssentialAction) = EssentialAction { req => 
    val HostPattern: Regex = "..some regex..".r 
    val PathsToBypass: List[String] = [...] 
    import play.api.libs.iteratee.Execution.Implicits.trampoline 
    req.host.toLowerCase match { 
     case HostPattern(...) => 
      if (PathsToBypass.map{path => 
       path.r.findFirstIn(req.path) 
       }.count { p => p.isDefined } > 0) 
      next(req) 
      else 
      next(req).map(_.withHeaders(headers(req): _*)) 
     case _ => next(req).map(_.withHeaders(headers(req): _*)) 
    } 
    } 
} 

Кроме того, добавьте фильтр в Filters

class Filters @Inject() (corsFilter: CORSFilter, 
         allowedHostsFilter: AllowedHostsFilter, 
         gzipFilter: GzipFilter, 
         customSecurityHeadersFilter: ConditionalSecurityHeadersFilter 
         ) extends HttpFilters { 
    def filters = Seq(corsFilter, 
    allowedHostsFilter, 
    gzipFilter, 
    customSecurityHeadersFilter 
) 
}