Чтение WebBlogic Message Driven Bean из защищенной очереди @RunAs не работает - PullRequest
1 голос
/ 03 февраля 2011

У меня очень простой MDB, который прекрасно работает, если очередь, из которой он читает сообщения, не защищена

После того, как я защищаю очередь именем пользователя, она больше не может читать сообщения

@MessageDriven(mappedName = "DistributedQueueTest")

public class MdbReceiver implements MessageListener {
@Resource
private MessageDrivenContext mdc;

@Override
public void onMessage(Message inMessage) {
TextMessage msg = null;
try {
msg = (TextMessage) inMessage;
System.out.println("Test MdbReceiver Message received : " + msg.getText());
} catch (JMSException e) {
e.printStackTrace();
mdc.setRollbackOnly();
}
}

}

Я пробовал со всеми видами аннотаций @RunAs @weblogic.jws.security.RunAs(role="Joan",mapToPrincipal="ccc_user") где ccc_user разрешено читать сообщения из очереди

import javax.annotation.security.RunAs; @RunAs("SomeRole") выдает ошибку при развертывании Невозможно развернуть EJB: MdbReceiver from mdbReceiver.jar: Ожидаемая роль в отображении

Любая идея, как я могу сделать это с аннотациями? Я пробовал даже без аннотаций ... то же самое исключение в консоли weblogic

weblogic.jms.common.JMSSecurityException: Access denied to resource: type=<jms>, application=UNIV_REC_Module, destinationType=queue, resource=DistributedQueueTest, action=receive

Спасибо

Ответы [ 2 ]

2 голосов
/ 04 февраля 2011

Я отвечаю на свой вопрос, потому что нашел решение: проблема в том, что аннотации или глючат в weblogic, или не реализованы, как я ожидал.

Решение состоит в том, чтобы сделать это без аннотаций в старом стиле

поэтому MDB:

public class MdbReceiver implements MessageListener ,MessageDrivenBean{

    MessageDrivenContext mdc;

    @Override
    public void onMessage(Message inMessage) {
        TextMessage msg = null;
        try {
            msg = (TextMessage) inMessage;
            System.out.println("qwerty1");
            System.out.println("Test MdbReceiver Message received : " + msg.getText());
        } catch (JMSException e) {
            e.printStackTrace();
            mdc.setRollbackOnly();
        }
    }
    @Override
    public void ejbRemove() throws EJBException {
        // TODO Auto-generated method stub

    }
    @Override
    public void setMessageDrivenContext(MessageDrivenContext mdc) throws EJBException {
        this.mdc = mdc;

    }
}

Затем нам понадобятся два других файла: ejb-jar.xml

<?xml version="1.0" encoding="UTF-8"?>
<ejb-jar version="3.0" 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/ejb-jar_3_0.xsd">
    <enterprise-beans>
        <message-driven>
            <ejb-name>MdbReceiver</ejb-name>
            <ejb-class>mdb.receiver.MdbReceiver</ejb-class>
            <transaction-type>Container</transaction-type>
            <message-destination-type>javax.jms.Queue</message-destination-type>
            <security-identity>
                <run-as>
                    <role-name>Loan</role-name>
                </run-as>
            </security-identity>
        </message-driven>
    </enterprise-beans>
    <assembly-descriptor>       
         <security-role>
          <role-name>Loan</role-name>
         </security-role>       
        <container-transaction>
            <method>
                <ejb-name>MdbReceiver</ejb-name>
                <method-name>onMessage()</method-name>
            </method>
            <trans-attribute>Required</trans-attribute>
        </container-transaction>
    </assembly-descriptor>

</ejb-jar>

и

weblogic-ejb-jar.xml

<?xml version="1.0" encoding="UTF-8"?>
<weblogic-ejb-jar version="wls_10.3"
    xmlns="http://www.bea.com/ns/weblogic/weblogic-ejb-jar" xmlns:j2ee="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.bea.com/ns/weblogic/weblogic-ejb-jar http://www.bea.com/ns/weblogic/weblogic-ejb-jar.xsd http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/ejb-jar_3_0.xsd">
    <weblogic-enterprise-bean>
        <ejb-name>MdbReceiver</ejb-name>
        <message-driven-descriptor>
            <destination-jndi-name>DistributedQueueTest</destination-jndi-name>
        </message-driven-descriptor>
    </weblogic-enterprise-bean>
    <security-role-assignment>
        <role-name>Loan</role-name>     
        <principal-name>test1234</principal-name>
    </security-role-assignment>

</weblogic-ejb-jar>

Имя роли не имеет значения, так как я вижу, что главное имя важно.Для этого нужно иметь права на чтение из защищенной очереди

1 голос
/ 14 февраля 2012

Если вы аннотируете свой MDB следующим образом, он должен работать:

@MessageDriven(name = "MdbReceiver", mappedName = "DistributedQueueTest")
@DeclareRoles({"Loan"})
@RolesAllowed("Loan")
public class MdbReceiver implements MessageListener {
...
}
...