Статьи

Spring Security Java Config Preview: удобочитаемость


Оригинальная статья, написанная Робом Винчем 



Роб Винч

В этом посте я расскажу, как сделать вашу конфигурацию Spring Security Java более читабельной. Этот пост предназначен для более подробного рассмотрения в  Spring Security Java Config Preview: Web Security,  где я заявил:

Благодаря форматированию нашего кода конфигурации Java его намного легче читать. Его можно прочитать подобно эквиваленту пространства имен XML, где «and ()» представляет необязательное закрытие элемента XML.

вдавливание

Отступ конфигурации Java Spring Security действительно влияет на ее читабельность. В целом, отступы, такие как список маркеров, должны быть предпочтительными. На высоком уровне это выглядит так:

builder
    #1 I modify builder
        I modify #1
        I also modify #1
        I also modify #1
        and
    #2 I also modify builder
        I modify #2
        I also modify #2
        and
    #3 I also modify builder
        I modify #3
    ...

Для более конкретного примера взгляните на следующий код:

http
    // #1
    .formLogin()
        // #2
        .loginUrl("/login")
        .failureUrl("/login?error")
        // #3
        .and()
    // #4
    .authorizeUrls()
        // #5
        .antMatchers("/signup","/about").permitAll()
        .antMatchers("/admin/**").hasRole("ADMIN")
        .anyRequest().authenticated();
  • # 1  formLogin  обновляет сам   объект http . Отступ от formLogin  увеличивается с  отступом от  http  (очень похоже на   отступ от < form-login> от  <http> )
  • # 2  loginUrl  и  faultUrl  обновляют   конфигурацию formLogin . Например,  loginUrl определяет, куда Spring Security будет перенаправлять, если требуется вход в систему. По этой причине каждый из них является потомком  formLogin .
  • # 3  и  означает, что мы закончили настройку родителя (в данном случае  formLogin ). Это также подразумевает, что следующая строка уменьшит отступ на единицу. При просмотре конфигурации вы можете прочитать ее, так как  http  настроен с помощью  formLogin  и  authorizeUrls . Если нам больше нечего настраивать, то  и  не нужно.
  • # 4  Мы уменьшаем отступ с  authorizeUrls,  так как он не связан с входом в систему на основе форм. Вместо этого его целью является ограничение доступа к различным URL-адресам.
  • # 5  каждый  antMatchers  и  anyRequest  изменяет требования авторизации для authorizeUrls . Вот почему каждый из них является потомком  authorizeUrls

Средство форматирования IDE

Отступы могут вызвать проблемы с форматерами кода. Многие IDE позволят вам отключить форматирование для отдельных блоков кода с комментариями. Например, в STS / Eclipse вы можете использовать комментарии  @formatter: off  и  @formatter: on  для выключения и включения форматирования кода. Пример показан ниже:

// @formatter:off
http
    .formLogin()
        .loginUrl("/login")
        .failureUrl("/login?error")
        .and()
    .authorizeUrls()
        .antMatchers("/signup","/about").permitAll()
        .antMatchers("/admin/**").hasRole("ADMIN")
        .anyRequest().authenticated();
// @formatter:on

Чтобы  эта функция  работала, убедитесь, что она включена:

  • Перейдите к  Предпочтениям -> Java -> Стиль кода -> Форматтер
  • Нажмите   кнопку Изменить
  • Выберите вкладку «  Выкл. / Вкл. Метки  »
  • Убедитесь, что   выбраны флажки «Включить / выключить»
  • Вы также можете при желании изменить строки, используемые для отключения и включения форматирования.
  • Нажмите  ОК

Сравнение с пространством имен XML

Наши отступы также помогают нам связать конфигурацию Java с конфигурацией пространства имен XML. Это не всегда так, но это помогает. Давайте сравним нашу конфигурацию с соответствующей конфигурацией XML ниже.

http
    .formLogin()
        .loginPage("/login")
        .failureUrl("/login?error")
        .and()
    .authorizeUrls()
        .antMatchers("/signup","/about").permitAll()
        .antMatchers("/admin/**").hasRole("ADMIN")
        .anyRequest().authenticated();

Соответствующую, но не эквивалентную, конфигурацию XML можно увидеть ниже. Обратите внимание, что различия между поведением Spring Security между этими конфигурациями обусловлены различными значениями по умолчанию для конфигурации Java и конфигурации XML.

<http use-expressions="true">
  <form-login
      login-page="/login"
      authentication-failure-url="/login?error"
  /> <!-- similar to and() -->
  <intercept-url pattern="/signup" access="permitAll"/>
  <intercept-url pattern="/about" access="permitAll"/>
  <intercept-url pattern="/**" access="hasRole('ROLE_USER')"/>
</http>
  • Первое, что нужно отметить, это то, что  http  и <http> очень похожи. Одно из отличий состоит в том, что конфигурация Java использует  authorizeUrls  для указания  use-expressions = «true»
  • formLogin  и  <form-login>  очень похожи. Каждый дочерний  элемент formLogin  является атрибутом XML  <form-login> . Исходя из нашего объяснения отступов, сходство логично, поскольку атрибуты XML изменяют элементы XML.
  • Форма  и  под  formLogin  очень похожа на завершение элемента XML.
  • Каждый дочерний  элемент authorizeUrls  похож на каждый  <intercept-urls> , за исключением того, что конфигурация Java по  -разному определяет require-channel,  что помогает уменьшить конфигурацию во многих случаях.
Резюме

Теперь вы должны знать, как последовательно создавать отступ для вашей конфигурации Spring Security Java. Таким образом, ваш код будет более читабельным и его будет легче переводить в и из эквивалентов конфигурации XML.


SpringOne2GX 2013
Хотите узнать больше о выпуске Spring Security 3.2? Зарегистрируйтесь на  SpringOne2GX 2013, 9-12 сентября в Санта-Кларе, штат Калифорния,  где я буду  обсуждать Spring Security 3.2  более подробно! На этой конференции будет  множество отличных сессий,  чтобы быстро познакомить вас со всем, что происходит в сообществах Spring, Groovy и Grails! Не забудьте зарегистрироваться до 9 августа, чтобы сэкономить 200 долларов с ранней скидкой!