- Оригинальный адрес:Get started with the Java EE 8 Security API Part 2: Web authentication with HttpAuthenticationMechanis
- Оригинальный автор:Alex Theedom
- Перевод с:Программа перевода самородков
- Постоянная ссылка на эту статью:GitHub.com/rare earth/gold-no…
- Переводчик:Starriers
Начало работы с 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, используяSecurityContext
instance для выполнения аутентификации, как показано в листинге 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.
Проверьте свое мастерство
- три по умолчанию
HttpAuthenticationMechanism
Что такое реализация?@BasicFormAuthenticationMechanismDefinition
@FormAuthenticationMechanismDefinition
@LoginFormAuthenticationMechanismDefinition
@CustomFormAuthenticationMechanismDefinition
@BasicAuthenticationMechanismDefinition
- Какие две аннотации будут запускать аутентификацию на основе форм?
@BasicAuthenticationMechanismDefinition
@BasicFormAuthenticationMechanismDefinition
@FormAuthenticationMechanismDefinition
@FormBasedAuthenticationMechanismDefinition
@CustomFormAuthenticationMechanismDefinition
- Какие две из следующих конфигураций являются допустимыми на основе проверки подлинности?
@BasicAuthenticationMechanismDefinition(realmName="user-realm")
@BasicAuthenticationMechanismDefinition(userRealm="user-realm")
@BasicAuthenticationMechanismDefinition(loginToContinue = @LoginToContinue)
@BasicAuthenticationMechanismDefinition
@BasicAuthenticationMechanismDefinition(realm="user-realm")
- Какие три из следующих вариантов являются допустимыми конфигурациями для проверки подлинности на основе форм?
@FormAuthenticationMechanismDefinition(loginToContinue = @LoginToContinue)
@FormAuthenticationMechanismDefinition
@FormBasedAuthenticationMechanismDefinition
@FormAuthenticationMechanismDefinition(loginToContinue = @LoginToContinue(useForwardToLoginExpression = "${appConfigs.forward}"))
@FormBasedAuthenticationMechanismDefinition(loginToContinue = @LoginToContinue)
- Во время HTTP-запроса, в каком порядке, в
HttpAuthenticationMechanism
,Filter
иHttpServlet
Реализация метода вызова?-
doFilter()
,validateRequest()
,service()
,secureResponse()
-
validateRequest()
,doFilter()
,secureResponse()
,service()
-
validateRequest()
,service()
,doFilter()
,secureResponse()
-
validateRequest()
,doFilter()
,service()
,secureResponse()
-
service()
,secureResponse()
,doFilter()
,validateRequest()
-
- как
RememberMe
Каково максимальное время действия настроек файлов cookie?@RememberMe(cookieMaxAge = (units = SECONDS, value = 3600)
@RememberMe(maxAgeSeconds = 3600)
@RememberMe(cookieMaxAgeSeconds = 3600)
@RememberMe(cookieMaxAgeMilliseconds = 3600000)
@RememberMe(cookieMaxAgeSeconds = "3600")
Если вы обнаружите ошибки в переводе или в других областях, требующих доработки, добро пожаловать наПрограмма перевода самородковВы также можете получить соответствующие бонусные баллы за доработку перевода и PR. начало статьиПостоянная ссылка на эту статьюЭто ссылка MarkDown этой статьи на GitHub.
Программа перевода самородковэто сообщество, которое переводит высококачественные технические статьи из Интернета сНаггетсДелитесь статьями на английском языке на . Охват контентаAndroid,iOS,внешний интерфейс,задняя часть,блокчейн,продукт,дизайн,искусственный интеллектЕсли вы хотите видеть более качественные переводы, пожалуйста, продолжайте обращать вниманиеПрограмма перевода самородков,официальный Вейбо,Знай колонку.