2015-03-09 3 views
1

У меня есть Stateless боб, где я хочу, чтобы разрешить доступ только к пользователю под названием «TestUser»EJB 3.1 Аутентификация на замок до

Я выставиться аннотацию, как написано ниже:

@Stateless 
@DeclareRoles("TestUser") 
public class LibraryBean implements LibraryIFace { 

    @Override 
    public void setName(String name){ 
     sb.setName(name); 
    } 

    @Override 
    public String getName(){ 
     return sb.getName(); 
    } 

    @EJB 
    private SingIFace sb; 
} 

Сервлет делает блокировку бобов и возвращает имя.

Я хочу, чтобы сервлет должен был войти в систему как TestUser после получения имени от bean. Настоящий пользователь, вызывающий сервлет, не должен видеть ни одного окна сообщения или не вводить пользователя/пароль.

Это возможно?

UPDATE Что я имею в виду, что я нужен EJB будет проверять соединения, чтобы о отклонять в базе пользователя/PSW пары, или что-то вроде этого.

ответ

0

Вы можете использовать перехватчик для работы, намного чище, чем проверять роли в вызове bean.

Ваш @interface может выглядеть так:

@InterceptorBinding 
@Target({METHOD, TYPE}) 
@Retention(RUNTIME) 
public @interface Secure { 
    @NonBinding String[] rolesAllowed() default {}; 
} 

Затем установите и советы, которые будут вызываться при аннотированный метод с @Secure, который проверяет HttpSession для необходимых ролей и вернуться на страницу входа, если требуемые роли не найдены.

1.- Регистрация перехватчик

<beans xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation=" 
http://java.sun.com/xml/ns/javaee 
http://java.sun.com/xml/ns/javaee/beans_1_0.xsd"> 

<interceptors> 
     <class>full_class_name_here</class> 
    </interceptors>  

2.- Реализовать перехватчик

@Secure 
@Interceptor 
public class SecurityInterceptor implements Serializable{ 

/** 
* 
*/ 
private static final long serialVersionUID = 66355064016557358L; 

@AroundInvoke 
public Object checkInvocation(InvocationContext joinPoint) throws Exception { 

UPDATE: И, наконец, вы должны получить доступ к HTTP-сессии с вашего перехватчик, который немного громоздким и может быть описано здесь: Is there a way to access HttpSession from EJB module?

+0

Спасибо за ответ, у меня есть 2 вопроса о вашем коде. Я должен реализовать его в проекте, где живет боб, не так ли? Что должен сделать клиент для аутентификации? –

+0

1.- По крайней мере, перехватчик должен «видеть» объявление @interface 2. Контроллер, обрабатывающий процесс log.in, должен помещать роль пользователя в сеанс HTTP, чтобы его можно было проверить в EJB позже на – Victor

+0

Есть ли способ убедиться в том, кто вызывает EJB? Мне нужно, чтобы только мой модуль должен иметь доступ к моему EJB и отклонять все другие соединения. –

Смежные вопросы