2016-08-05 1 views
0

У меня есть проект Java EE в Eclipse Neon с гранями Java 1.8, JSF 2.2, JPA 2.1, развертывание на WildFly 10.0. Я использую аннотации безопасности, как показано ниже:Может ли Java @Statless EJB с @RolesAllowed наследовать методы из класса без аннотаций безопасности?

@Stateless 
@RolesAllowed("SysAdmin") 
public class EJBImpl extends POJOSuperClass implements EJBInterface { 
    /* ... */ 
} 

Дело в том: POJOSuperClass не использует аннотации безопасности:

public abstract class POJOSuperClass { 
    public void someMethod() { 
     /* ... */ 
    } 

    /* ... */ 
} 

Когда JSF боб называет унаследованную someMethod() на экземпляре EJBImpl, я получаю исключение, даже если войти в систему как пользователь, который имеет роль SysAdmin:

ERROR ... EJB Invocation failed on component EJBImpl for method public abstract void POJOSuperClass.someMethod(): javax.ejb.EJBAccessException: WFLYEJB0364: Invocation on method: public abstract void POJOSuperClass.someMethod() of bean: EJBImpl is not allowed 

Если я добавляю @PermitAll аннотация для POJOSuperClass, он работает так, как я хочу (без исключений, если вы вошли в систему как администратор, исключение, если нет), но я хочу сохранить POJOSuperClass, который повторно используется в разных проектах, без таких аннотаций (если я ' m не ошибаюсь, если я использую аннотации на суперклассе, я должен использовать его также в подклассах, что я не хочу иметь в других проектах, которые не используют JAAS).

Как я могу это достичь?

+0

Что произойдет, если вы удалите '@RolesAllowed («SysAdmin») 'из класса и поместить его только в методы, к которым должен обращаться« SysAdmin »? – ujulu

+0

Проблема в том, что 'EJBImpl' наследует методы, к которым должен обращаться' SysAdmin' от 'POJOSuperClass', и я не хочу иметь никаких комментариев в суперклассе ... –

ответ

1

Отсносящийся к https://issues.jboss.org/browse/WFLY-2988

В основном аннотаций уровня класса применяются только к методам, определенным классом, а не методы, определенные в родительском классе. Термин «все применимые методы бизнес-класса» просто означает, что методы, которые заявлены на самом классе, а не на какой-либо суперкласса

Вы должны будете делегировать все методы явно, то есть, что вы не вызываете какой-либо унаследованы метод POJOSuperClass на EJBImpl непосредственно, но использует EJBImpl как фасад «точки входа» и POJOSuperClass как «статический класс полезности».

Другая возможность инвертировать механизм безопасности, то есть разрешение отсутствует метод будет отказывать в доступе в тот момент, который может быть перевернут, расширяя ваш jboss-ejb3.xml похож на

<?xml version="1.1" encoding="UTF-8"?> 
<jboss:ejb-jar xmlns:jboss="http://www.jboss.com/xml/ns/javaee" 
       xmlns="http://java.sun.com/xml/ns/javaee" 
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
       xsi:schemaLocation="http://www.jboss.com/xml/ns/javaee http://www.jboss.org/j2ee/schema/jboss-ejb3-2_0.xsd http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/ejb-jar_3_1.xsd" 
       version="3.1" 
       xmlns:s="urn:security:1.1" 
       impl-version="2.0"> 

    <assembly-descriptor> 
     <s:security> 
      <ejb-name>*</ejb-name> 
      <s:missing-method-permissions-deny-access>false</s:missing-method-permissions-deny-access> 
     </s:security> 
    </assembly-descriptor> 
</jboss:ejb-jar> 
Смежные вопросы