ejb Вопросы безопасности, касающиеся ролей и аутентификации - PullRequest
9 голосов
/ 28 августа 2011

Я был бы очень признателен, если бы кто-то мог помочь мне со следующими вопросами:

  1. В чем различия между аннотациями @RolesAllowed и @DeclareRoles?
  2. Я разработал функцию входа в систему для проверки имени пользователя и пароля по информации в базе данных. Однако я хотел бы спросить, как я могу назначить роль аутентифицированному пользователю для использования с вышеуказанными аннотациями.

Ответы [ 2 ]

21 голосов
/ 28 августа 2011

В чем разница между аннотациями @RolesAllowed и @DeclareRoles?

Аннотация @RolesAllowed используется для указания списка ролей, которым фактически разрешен доступ к бизнес-методу.На поведение EJB во время выполнения влияет наличие этой аннотации, поскольку контейнер EJB активно проверяет присутствие вызывающей стороны в разрешенной роли.Кроме того, эта аннотация может быть определена как TYPE s, так и METHOD s, что позволяет вам определять список ролей, разрешенных как на уровне класса, так и метода.Вы можете переопределить список ролей, разрешенных для всех методов класса, на уровне отдельного метода.

С другой стороны, аннотация @DeclareRoles просто используется для объявления списка ролей;это эквивалент элемента security-role-ref в файле ejb-jar.xml.Контейнер EJB не требует знания этих ролей для обеспечения контроля доступа к бизнес-методам EJB;вместо этого поставщик / разработчик компонентов может использовать эти роли в тестах isCallerInRole для обеспечения программной безопасности.

В спецификации EJB 3.1 говорится о аннотации @DeclareRoles:

17.2.5.3 Объявление ролей безопасности, на которые ссылается код бина

Поставщик бина отвечает за использование аннотации DeclareRoles или элементов security-role-ref дескриптора развертывания для объявления всехимена ролей безопасности, используемые в коде корпоративного компонента.Аннотация DeclareRoles указывается в классе компонента, где она служит для объявления ролей, которые могут быть проверены путем вызова isCallerInRole из методов аннотированного класса.Объявление ролей безопасности позволяет провайдеру компонентов, сборщику приложений или развертывателю связывать имена ролей безопасности, используемые в коде, с ролями безопасности, определенными для собранного приложения.В отсутствие этого шага связывания предполагается, что любое имя роли безопасности, используемое в коде, соответствует роли безопасности с тем же именем.

Вторая часть вашего вопроса гласит:

Я разработал функцию входа в систему для проверки имени пользователя и пароля по информации в базе данных.Однако я хотел бы спросить, как я могу назначить роль аутентифицированному пользователю для использования с вышеуказанными аннотациями.

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

Другими словами, клиент EJB (Java SEприложение, или сервлет, или другой EJB) должны сначала аутентифицироваться на основе механизмов безопасности контейнера, чтобы установить Principal вызывающего.Поэтому успешное использование декларативной или прогамматической безопасности зависит от успешного процесса аутентификации.В вашем случае вам нужно будет сконфигурировать ваш контейнер для распознавания групп и пользователей в вашей базе данных и преобразования их в Principal объекты, которые можно использовать для принудительного контроля доступа декларативным или программным способом.Для этой цели большинство контейнеров поддерживают один или несколько вариантов модулей входа в систему JAAS;Например, Glassfish 3.1 позволяет это использовать JDBCRealm , в то время как JBoss 6.0 поддерживает это с DatabaseServerLoginModule .Поэтому вам необходимо определить, поддерживает ли ваш контейнер такой модуль входа в систему, и настроить его для использования вашей базы данных.

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

Кроме того, вам также необходимо сопоставить роли, используемые приложением, с пользователями и группами в области JAAS. Например, если ваша база данных используется областью JAAS:

  • содержит пользователей U1, U2, U3, U4 и U5 и
  • содержит группы G1, G2 и G3, содержащие U1, U2, U3 соответственно,
  • и ваш EJB разрешает пользователям в ролях R1, R2 и R3 (определенных посредством аннотации @RolesAllowed) для доступа к его методам,

тогда вам нужно сопоставить роли принципалам (пользователям и группам) в области JAAS. Сопоставление должно быть сделано даже в случае, когда имена ролей совпадают с именами участников; Glassfish упрощает это, поддерживая принципала по умолчанию для сопоставления ролей , который напрямую сопоставляет принципалов с одинаковыми именами (пользователей или группы) ролям. Кроме того, процесс отображения зависит от контейнера, и, как вы уже догадались, это отображение выполняется в дескрипторах развертывания для конкретного контейнера, а не в дескрипторе развертывания EJB (ejb-jar.xml).

Чтобы завершить ответ, вам нужно назначить роль каждому созданному пользователю. Для простоты вы можете создать одну группу пользователей, к которой могут принадлежать все пользователи. Когда пользователь аутентифицирует себя в области JAAS, объект Principal будет содержать эту группу. Затем группа в вашей области JAAS может быть сопоставлена ​​с ролью EJB, а имя роли может быть указано в аннотации @RolesAllowed. Любой пользователь в базе данных, который не входит в эту группу, будет лишен доступа к аннотированному методу (методам) контейнером EJB.

2 голосов
/ 28 августа 2011

Возможно, мой ответ может быть неверным и может быть неполным.Но это можно найти в этой ссылке http://openejb.apache.org/3.0/security-annotations.html

DeclareRoles можно использовать только на уровне класса. Вам необходимо обновлять @DeclareRoles при обращении к ролям через isCallerInRole (roleName).

Основная идея

  • По умолчанию все методы бизнес-интерфейса доступны, вошли в систему или нет

  • Аннотации относятся к классу компонента, а не к бизнес-интерфейсу

  • Аннотации безопасности могут применяться ко всему классу и / или отдельным методам

  • Имена любых используемых ролей безопасности должны быть объявленычерез @ DeclareRoles

@ RolesAllowed Может использоваться как на уровне класса, так и на уровне методов для ограничения уровня доступа.

один пример Смешивание ограничений на уровне класса и методаАннотации безопасности могут использоваться одновременно на уровне класса и метода.Эти правила не суммируются, поэтому пометка «submitPatch» переопределяет значение по умолчанию «committers».

@Stateless
@DeclareRoles({"committer", "contributor"})
@RolesAllowed({"committer"})
public class OpenSourceProjectBean implements Project {

    public String svnCommit(String s) {
        return s;
    }

    public String svnCheckout(String s) {
        return s;
    }

    @RolesAllowed({"contributor"})
    public String submitPatch(String s) {
        return s;
    }
}

EDIT:

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

В коммите, это вызовет это для добавления принципалов.

subject.getPrincipals().addAll(allPrincipals);

Также вы можете проверить здесь для более подробной информации http://openejb.apache.org/3.0/security.html.

В нем перечислены другие опции, которые вы можете выбрать.

...