Как распространить весенний вход в систему безопасности в EJB? - PullRequest
6 голосов
/ 02 мая 2010

Контекст

У меня есть приложение J2EE, работающее на сервере приложений JBoss 4.2.3. Приложение доступно через веб-интерфейс. Аутентификация выполняется с помощью базовой аутентификации. Внутри EJB я спрашиваю контекст безопасности компонента для принципала (имя вошедшего в систему пользователя) и делаю некоторые проверки авторизации, разрешен ли этому пользователю доступ к этому методу EJB. EJB-компоненты живут внутри другого уха, нежели сервлеты, обрабатывающие веб-интерфейс, поэтому я не могу напрямую получить доступ к контексту приложения Spring.

Обязательное изменение

Я хочу переключиться на Spring Security для обработки имени пользователя.

Вопрос

Как я могу распространить информацию о входе в систему Spring в контекст безопасности JBoss, чтобы я мог по-прежнему использовать свои EJB-компоненты без необходимости их переписывать?


Идеи и ссылки

Я уже нашел страницу, рассказывающую о «Распространение идентичности от Spring Security до уровня EJB» , к сожалению, это относится к более старой версии Spring Security (Acegi), и я недостаточно знаком с Spring Security для работы с актуальной версией (3.0.2).

Здесь выглядит аналогично при использовании WebLogic.

Ответы [ 2 ]

1 голос
/ 22 мая 2010

Если вы правильно настроили Spring-Security (фильтр в цепочке фильтров, security-context.xml), Вы можете использовать аннотацию @Secured, чтобы ограничить пользователей необходимыми ролями. Вы можете использовать эту аннотацию на уровне класса или / и уровне метода.

Если вам нужно знать всю информацию об авторизации для текущего пользователя, вы можете использовать этот помощник (я написал это для моего веб-приложения, но это может быть полезно для других. MyUserDetails - это служебный компонент, UserDetail Spring-security потомок).

public class LoginHelper {

    /**
     * @return user object if user is authenticated and null if is not
     */
    public static User getUser() {
        Authentication authentication = SecurityContextHolder.getContext().getAuthentication();

        if (authentication != null) {
            Object principal = authentication.getPrincipal();
            if (principal instanceof MyUserDetails) {
                return ((MyUserDetails) principal).getUser();
            }
        }
        return null;
    }

    /**
     * Check for authenticated user
     *
     * @return true if user is authenticated and false if is not
     */
    public static boolean isAuthenticated() {
        final User user = getUser();
        return user != null;
    }

}
0 голосов
/ 17 июня 2014

У меня та же проблема, и было бы замечательно, если бы кто-нибудь мог придумать лучший способ интеграции Spring Security и приложения Java EE с EJB.

Я думаю, что вы можете аннотировать свои классы своими собственными аннотациями, такими как @MyAnnotation ("ADMIN"). А затем создайте перехватчик , чтобы вручную проверить вышеупомянутый «LoginHelper», чтобы получить привилегию пользователей и сравнить с атрибутами аннотации метода . И бросить исключение, когда имена не совпадают.

...