Начало работы с Java EE 8 Security API — часть 2

Java задняя часть Java EE Безопасность API Программа перевода самородков
Начало работы с Java EE 8 Security API — часть 2

Начало работы с Java EE 8 Security API — часть 2

Сертификация на основе HttpAuthenticationMechanism

Классические механизмы HTTP-аутентификации с использованием новой аутентификации Java EE 8 на основе аннотаций и пользовательской аутентификации сервлетов.

Об этой серии:

долгожданныйJava EE Security API (JSR 375)Обеспечение безопасности Java корпоративного уровня в новую эру облачных вычислений и микросервисов. В статьях этой серии показано, как упростить новые механизмы безопасности и стандартизировать обработку безопасности Java EE в контейнерах, а затем использовать их в облачных проектах.

Первая статья из этой сериирезюмировалJava EE Security API (JSR 375), включая введение в новый высокоуровневый интерфейс:HttpAuthenticationMechanism,IdentityStoreиSecurityContext. Эта статья даст вам глубокое понимание первой из этих трех частей, вы узнаете, как использовать в примере веб-приложения Java.HttpAuthenticationMechanismустановить и настроить аутентификацию пользователей.

HttpAuthenticationMechanismИнтерфейсы лежат в основе нового механизма аутентификации Java™ EE HTTP. Он имеет три встроенные реализации CDI (внедрение контекста и зависимостей), которые автоматически создаются и затем вызываются контейнером CDI. Эти встроенные реализации поддерживают три классические схемы аутентификации, указанные в Servlet 4.0: базовая аутентификация HTTP, аутентификация на основе форм и аутентификация с помощью настраиваемых форм.

В дополнение к встроенным методам аутентификации вы также можете использоватьHttpAuthenticationMechanismдля разработки пользовательской аутентификации. Выберите этот вариант, если вам необходимо поддерживать определенные протоколы и токены аутентификации. Некоторые контейнеры сервлетов также могут предоставлять настраиваемыеHttpAuthenticationMechanismвыполнить.

В этой статье вы лично испытаетеHttpAuthenticationMechanismИнтерфейс и три его встроенные реализации. Я также покажу вам, как написать пользовательскийHttpAuthenticationMechanismМеханизм аутентификации.

получить код

Установить Сотерию

Мы будем использовать руководство Java EE 8 Security API для реализацииSoteria,пройти черезHttpAuthenticationMechanismдля изучения доступных встроенных механизмов аутентификации и пользовательских механизмов аутентификации. Вы можете получить Сотерию одним из двух способов.

1. В вашем POM явно укажите Soteria

В вашем POM используйте следующие координаты Maven, чтобы указать Soteria:

Листинг 1. Координаты Maven для проекта Soteria
<dependency>
  <groupId>org.glassfish.soteria</groupId>
  <artifactId>javax.security.enterprise</artifactId>
  <version>1.0</version>
</dependency>

2. Используйте встроенные координаты Java EE 8

Серверы, совместимые с Java EE 8, будут иметь собственную реализацию нового Java EE 8 Security API или будут полагаться на реализацию Sotoria. Ни в коем случае, вам нужны координаты Java EE 8.

Листинг 2. Координаты Maven для Java EE 8
<dependency>
 <groupId>javax</groupId>
 <artifactId>javaee-api</artifactId>
 <version>8.0</version>
 <scope>provided</scope>
</dependency>

Встроенный механизм аутентификации

Поддержка встроенного механизма аутентификации HTTPСервлет 4.0 (раздел 13.6)Указанный метод аутентификации. В следующей главе я покажу вам, как использовать аннотации для включения трех механизмов аутентификации, а также как настроить и реализовать каждый механизм в веб-приложении Java.

@BasicAuthenticationMechanismDefinition

@BasicAuthenticationMechanismDefinitionАннотация запускает базовую аутентификацию HTTP, как определено сервлетом 4.0 (раздел 13.6.1). у него есть необязательный параметрrealmNameЭто черезWWW-AuthenticateЗаголовок указывает имя области-отправителя. В листинге 3 показано, какuser-realmОбласть запускает базовую аутентификацию HTTP.

Листинг 3. Базовый механизм аутентификации HTTP
@BasicAuthenticationMechanismDefinition(realmName="user-realm")
@WebServlet("/user")
@DeclareRoles({ "admin", "user", "demo" })
@ServletSecurity(@HttpConstraint(rolesAllowed = "user"))
public class UserServlet extends HttpServlet { … }

@FormAuthenticationMechanismDefinition

@FormAuthenticationMechanismDefinitionАннотация вызывает аутентификацию на основе форм, как определено в спецификации Servlet 4.0 (раздел 13.6.3). У него есть опция, которую нужно настроить.loginToContinueВозможность принять настроенное@LoginToContinueАннотация, которая позволяет приложениям предоставлять функциональность «войдите в систему, чтобы продолжить». Вы можете использовать разумные значения по умолчанию или указать одно из четырех свойств для этой функции.

В листинге 4 URI страницы входа указан как/login-servlet. Если аутентификация не удалась, поток будет передан/login-servlet-fail.

Листинг 4. Механизм аутентификации на основе форм
@FormAuthenticationMechanismDefinition(
	loginToContinue = @LoginToContinue(
		   loginPage = "/login-servlet",
		   errorPage = "/login-servlet-fail"
		   )
)
@ApplicationScoped
public class ApplicationConfig { ... }

Чтобы настроить способ перехода на страницу входа, используйтеuseForwardToLoginопции. Если этот параметр необходимо установить на «переадресацию» или «перенаправление», это должно быть указано явно.trueилиfalse, по умолчаниюtrue. Или вы можете перейти к опцииuseForwardToLoginExpressionВыражение EL для установки значения.

@LoginToContinueИмеет разумные значения по умолчанию. Страница входа настроена на/login, в то время как страница ошибки настроена на/login-error.

@CustomFormAuthenticationMechanismDefinition

@CustomFormAuthenticationMechanismDefinitionАннотации предоставляют параметры конфигурации для настройки формы входа. В листинге 5 видно, что страница входа на веб-сайт идентифицируется какlogin.do. Страница входа настроена на@CustomFormAuthenticationMechanismDefinitionаннотированныйloginPageпараметрическийloginToContinueзначение параметра. Уведомление,loginToContinueявляется единственным параметром и является необязательным.

Листинг 5. Пользовательская конфигурация формы
@CustomFormAuthenticationMechanismDefinition(
   loginToContinue = @LoginToContinue(
       loginPage="/login.do"
   )
)
@WebServlet("/admin")
@DeclareRoles({ "admin", "user", "demo" })
@ServletSecurity(@HttpConstraint(rolesAllowed = "admin"))
public class AdminServlet extends HttpServlet { ... }

Листинг 6 демонстрируетlogin.do, которая представляет собой страницу JSF (JavaServer Pages), поддерживаемую компонентом поддержки входа в систему, как показано в листинге 7.

Листинг 6. login.do JSF-страница входа в систему
<form jsf:id="form">
   <p>
       <strong>Username</strong>
       <input jsf:id="username" type="text" jsf:value="#{loginBean.username}" />
   </p>
   <p>
       <strong>Password</strong>
       <input jsf:id="password" type="password" jsf:value="#{loginBean.password}" />
   </p>
   <p>
       <input type="submit" value="Login" jsf:action="#{loginBean.login}" />
   </p>
</form>

Войдите в систему Backing Bean, используяSecurityContextinstance для выполнения аутентификации, как показано в листинге 7. В случае успешной аутентификации пользователю предоставляется доступ к ресурсу, в противном случае поток передается на страницу с ошибкой. В этом случае он перенаправляет пользователя на URI по умолчанию./login-error.

Листинг 7. Компонент поддержки входа в систему
@Named
@RequestScoped
public class LoginBean {
  
   @Inject
   private SecurityContext securityContext;

   @Inject
   private FacesContext facesContext;

   private String username, password;
  
   public void login() {
      
       Credential credential = new UsernamePasswordCredential(username, new Password(password));
      
       AuthenticationStatus status = securityContext.authenticate(
           getRequestFrom(facesContext),
           getResponseFrom(facesContext),
           withParams().credential(credential));
      
       if (status.equals(SEND_CONTINUE)) {
           facesContext.responseComplete();
       } else if (status.equals(SEND_FAILURE)) {
           addError(facesContext, "Authentication failed");
       }
      
   }
   // 为了简洁而省略一些方法
}

Напишите собственный механизм HttpAuthenticationMechanism.

В большинстве сценариев вы обнаружите, что трех встроенных реализаций достаточно для удовлетворения ваших потребностей. В некоторых сценариях вы можете предпочесть написать свой собственныйHttpAuthenticationMechanismреализация интерфейса. В этом разделе я опишу, как написать пользовательскийHttpAuthenticationMechanismинтерфейс.

Чтобы убедиться, что его можно использовать в Java-приложениях, вам необходимоHttpAuthenticationMechanismИнтерфейс реализован с@ApplicationScopeкомпонент CDI. Интерфейс определяет следующие три метода:

  • validateRequest()Аутентифицированные HTTP-запросы.
  • secureResponse()Безопасные соответствующие сообщения HTTP.
  • cleanSubject()Очищает тему предоставленного принципала и учетных данных.

HttpServletRequest,HttpServletResponseиHttpMessageContextВсе методы принимают одни и те же типы параметров. Все они сопоставляются с предоставленным контейнеромJASPIC Server Auth Moduleна соответствующем методе, определенном интерфейсом. когда вServer AuthПри вызове метода JASPIC наHttpAuthenticationMechanism.

Листинг 8. Пользовательская реализация HttpAuthenticationMechanism
@ApplicationScoped
public class CustomAuthenticationMechanism implements HttpAuthenticationMechanism {

   @Inject
   private IdentityStoreHandler idStoreHandler;

   @Override
   public AuthenticationStatus validateRequest(HttpServletRequest req, 
   											   HttpServletResponse res, 
											   HttpMessageContext msg) {
       // use idStoreHandler to authenticate and authorize access
       return msg.responseUnauthorized(); // other responses available
   }
}

Выполнить метод во время HTTP-запроса

Вызывается в фиксированное время во время HTTP-запросаHttpAuthenticationMechanismспособ реализовать. Рисунок 1 описываетFilterиHttpServletВремя вызова каждого метода экземпляра.

Рисунок 1. Последовательность вызова метода

方法调用顺序

в исполненииdoFilter()илиservice()метод, вызываемый передvalidateRequest()метод, а вHttpServletResponseвызов по инстанцииauthenticate(). Цель этого метода — позволить вызывающему абоненту пройти аутентификацию. Для этого метод должен иметь вызывающую сторонуHttpRequestиHttpResponseДоступ к экземплярам. Он может использовать их для получения запрошенной аутентификационной информации или может выполнить операцию записи для вызывающей стороны поставщику OAuth. После завершения аутентификации его можно использоватьHttpMessageContextэкземпляр, чтобы сообщить статус аутентификации.

в исполненииdoFilter()илиservice()звонить послеsecureResponse()метод. Он обеспечивает функциональность постобработки ответов, сгенерированных сервлетами или фильтрами. Шифрование является потенциальной особенностью этого метода.

вызовHttpServletRequestна экземпляреlogout()Метод, звонокcleanSubject()метод. Этот метод также можно использовать для удаления статуса пользователя после выхода из системы.

HttpMessageContextинтерфейс имеетHttpAuthenticationMechanismэкземпляр можно использовать сServerAuthModuleспособ общения.

Пользовательский пример: аутентификация с помощью файла cookie

Как я упоминал ранее, вы обычно пишете собственную реализацию, чтобы обеспечить функциональность, недоступную во встроенных опциях. Примером может служить использование файлов cookie в процессе аутентификации.

На уровне класса вы можете использовать необязательный@RememberMeаннотацию, чтобы эффективно «запоминать» аутентификацию пользователя и автоматически применять ее при каждом запросе.

Листинг 9. Использование @RememberMe в пользовательском механизме HttpAuthenticationMechanism
@RememberMe(
       cookieMaxAgeSeconds = 3600
)
@ApplicationScoped
public class CustomAuthenticationMechanism implements HttpAuthenticationMechanism { … }

Эта аннотация имеет 8 параметров конфигурации, каждый из которых имеет разумные значения по умолчанию, поэтому вам не нужно реализовывать их вручную:

  • cookieMaxAgeSecondsУстановите время жизни файла cookie «запомнить меня».
  • cookieMaxAgeSecondsExpression— это EL-версия cookieMaxAgeSeconds.
  • cookieSecureOnlyУказывает, что доступ к файлу cookie возможен только через безопасный метод (HTTPS).
  • cookieSecureOnlyExpressionЯвляется версией cookieSecureOnly для EL.
  • cookieHttpOnlyУказывает, что файлы cookie могут отправляться только HTTP-запросами.
  • cookieHttpOnlyExpressionявляется EL-версией cookieHttpOnly.
  • cookieNameустановить имя файла cookie,
  • isRememberMeпереключатель «запомнить меня».
  • isRememberMeExpressionэто EL-версия isRememberMe.

RememberMeФункция используется какПривязка перехватчикаи осознать. Контейнер будет перехватыватьvalidateRequest()иcleanSubject()вызов метода. когда пара содержитRememberMeвызов с использованием файлов cookie, вызовvalidateRequest()метод, он попытается аутентифицировать вызывающего абонента. В случае успеха сообщитеHttpMessageConextСобытие входа в систему; в противном случае файл cookie будет удален. перехватыватьcleanSubject()Метод просто удаляет файл cookie и завершает запрос на выход из системы.

Заключение второй части

новыйHttpAuthenticationMechanismИнтерфейсы лежат в основе веб-аутентификации в Java EE 8. Он имеет три встроенных средства аутентификации для классических методов аутентификации, указанных в Servlet 4.0, а также легко интегрируется с пользовательскими реализациями. В этом руководстве вы узнали, как использовать аннотации для вызова и настройкиHttpAuthenticationMechanismи как писать собственные механизмы для особых случаев использования. Я призываю вас проверить, что вы узнали, с помощью викторины ниже.

В этой статье подробно рассматривается первый из трех основных компонентов нового Java EE 8 Security API. Следующие две статьи познакомятIdentityStoreиSecurityContextПрактикуйтесь с API.

Проверьте свое мастерство

  1. три по умолчаниюHttpAuthenticationMechanismЧто такое реализация?
    1. @BasicFormAuthenticationMechanismDefinition
    2. @FormAuthenticationMechanismDefinition
    3. @LoginFormAuthenticationMechanismDefinition
    4. @CustomFormAuthenticationMechanismDefinition
    5. @BasicAuthenticationMechanismDefinition
  2. Какие две аннотации будут запускать аутентификацию на основе форм?
    1. @BasicAuthenticationMechanismDefinition
    2. @BasicFormAuthenticationMechanismDefinition
    3. @FormAuthenticationMechanismDefinition
    4. @FormBasedAuthenticationMechanismDefinition
    5. @CustomFormAuthenticationMechanismDefinition
  3. Какие две из следующих конфигураций являются допустимыми на основе проверки подлинности?
    1. @BasicAuthenticationMechanismDefinition(realmName="user-realm")
    2. @BasicAuthenticationMechanismDefinition(userRealm="user-realm")
    3. @BasicAuthenticationMechanismDefinition(loginToContinue = @LoginToContinue)
    4. @BasicAuthenticationMechanismDefinition
    5. @BasicAuthenticationMechanismDefinition(realm="user-realm")
  4. Какие три из следующих вариантов являются допустимыми конфигурациями для проверки подлинности на основе форм?
    1. @FormAuthenticationMechanismDefinition(loginToContinue = @LoginToContinue)
    2. @FormAuthenticationMechanismDefinition
    3. @FormBasedAuthenticationMechanismDefinition
    4. @FormAuthenticationMechanismDefinition(loginToContinue = @LoginToContinue(useForwardToLoginExpression = "${appConfigs.forward}"))
    5. @FormBasedAuthenticationMechanismDefinition(loginToContinue = @LoginToContinue)
  5. Во время HTTP-запроса, в каком порядке, вHttpAuthenticationMechanism,FilterиHttpServletРеализация метода вызова?
    1. doFilter(), validateRequest(), service(), secureResponse()
    2. validateRequest(), doFilter(), secureResponse(), service()
    3. validateRequest(), service(), doFilter(), secureResponse()
    4. validateRequest(), doFilter(), service(), secureResponse()
    5. service(), secureResponse(), doFilter(), validateRequest()
  6. какRememberMeКаково максимальное время действия настроек файлов cookie?
    1. @RememberMe(cookieMaxAge = (units = SECONDS, value = 3600)
    2. @RememberMe(maxAgeSeconds = 3600)
    3. @RememberMe(cookieMaxAgeSeconds = 3600)
    4. @RememberMe(cookieMaxAgeMilliseconds = 3600000)
    5. @RememberMe(cookieMaxAgeSeconds = "3600")

Проверить ответы

Если вы обнаружите ошибки в переводе или в других областях, требующих доработки, добро пожаловать наПрограмма перевода самородковВы также можете получить соответствующие бонусные баллы за доработку перевода и PR. начало статьиПостоянная ссылка на эту статьюЭто ссылка MarkDown этой статьи на GitHub.


Программа перевода самородковэто сообщество, которое переводит высококачественные технические статьи из Интернета сНаггетсДелитесь статьями на английском языке на . Охват контентаAndroid,iOS,внешний интерфейс,задняя часть,блокчейн,продукт,дизайн,искусственный интеллектЕсли вы хотите видеть более качественные переводы, пожалуйста, продолжайте обращать вниманиеПрограмма перевода самородков,официальный Вейбо,Знай колонку.