Авторизация JAAS для веб-приложения на Jboss EAP 6.3

В настоящее время я переношу свое веб-приложение с JBoss EAP 5.2 на EAP 6.3. Приложение использует настроенное Realm для авторизации. Однако Realm больше не поддерживается в версии 6.3, и люди предлагают использовать настраиваемый LoginModule. Я провел небольшое исследование и обнаружил, что LoginModule предназначен только для аутентификации. Я прав? Если LoginModule также предоставляет услугу авторизации, как мне это сделать? Если нет, то каковы альтернативные способы авторизации?

Спасибо. Дэйвид


person user3422290    schedule 27.04.2015    source источник


Ответы (1)


Ваш LoginModule должен переопределить один из потомков org.jboss.security.auth.spi.AbstractServerLoginModule. Если вы реализуете или переопределяете метод getRoleSets(), вы можете добавить роли аутентифицированному пользователю для авторизации.

Метод getRoleSets() возвращает массив групп, соответствующих наборам ролей, назначенным пользователю. Вы должны вернуть группу под названием «Роли», которая содержит роли, назначенные пользователю. Например:

@Override
protected Group[] getRoleSets() throws LoginException {
    Group group = new SimpleGroup("Roles");
    try {
        Principal p = createIdentity("ADMIN_ROLE");
        group.addMember(p);
    } catch (Exception e) {
        LOGGER.error("Failed to create principle on login", e);
    }
    return new Group[] { group };
}

Затем добавьте аннотации @RolesAllowed к открытым методам, указав разрешенные роли. Например:

@RequestScoped
@DenyAll
@Path("admin")
public class AdminServices {

    @POST
    @Path("/myAdminUri")
    @Produces(MediaType.TEXT_PLAIN)
    @RolesAllowed({ "ADMIN_ROLE" })
    public String administerMethod(@Context HttpServletRequest req, @Context HttpServletResponse resp)
            throws SomeException {
    ....

Если пользователь не вошел в систему с требуемой ролью, ему будет отказано в доступе к методу.

РЕДАКТИРОВАТЬ: Файл web.xml может также перечислять ограничения безопасности в строфе <security-constraint>. Имя роли должно соответствовать роли, выделенной методом getRoleSets().

<security-constraint>
    <web-resource-collection>
        <web-resource-name>Secure resources</web-resource-name>
        <url-pattern>/admin*</url-pattern>
    </web-resource-collection>
    <auth-constraint>
        <role-name>ADMIN_ROLE</role-name>
    </auth-constraint>
</security-constraint>

<security-role>
    <role-name>ADMIN_ROLE</role-name>
</security-role>

<login-config>
    <auth-method>BASIC</auth-method>
    <realm-name>SecureRealm</realm-name>
</login-config>

Справочное руководство по безопасности доступно на Сайт Redhat (требуется подписка на поддержку)

person shonky linux user    schedule 29.04.2015
comment
Большое спасибо за пример кода. Однако разрешение определяется в файле web.xml ‹security-constraint›. Не уверены, есть ли способ справиться с этим? - person user3422290; 29.04.2015
comment
Ответ обновлен, чтобы включить ограничение безопасности web.xml - person shonky linux user; 29.04.2015