WildFly 9.0.2 अंतिम उपयोग करना, <hornetq-server>
अनुभाग इस प्रकार standalone-full.xml
में परिभाषित किया गया है पर भेजें अनुमति है =।JAAS प्रमाणीकरण का उपयोग WildFly: javax.jms.JMSSecurityException: HQ119032: उपयोगकर्ता: अशक्त नहीं करता है पता {2}
धारा <address-settings>
, <acceptors>
और <connectors>
की तरह पूरी तरह से हटा दिया जाता है मैं उनमें ऐसा कुछ नहीं बदला है।
<hornetq-server>
<security-domain>ProjectRealm</security-domain>
<security-enabled>true</security-enabled>
<journal-file-size>102400</journal-file-size>
<security-settings>
<security-setting match="#">
<permission type="send" roles="ROLE_USER ROLE_ADMIN"/>
<permission type="consume" roles="ROLE_USER ROLE_ADMIN"/>
<permission type="createDurableQueue" roles="ROLE_USER ROLE_ADMIN"/>
<permission type="deleteDurableQueue" roles="ROLE_USER ROLE_ADMIN"/>
<permission type="createNonDurableQueue" roles="ROLE_USER ROLE_ADMIN"/>
<permission type="deleteNonDurableQueue" roles="ROLE_USER ROLE_ADMIN"/>
</security-setting>
</security-settings>
<jms-connection-factories>
<connection-factory name="destinationFactory">
<connectors>
<connector-ref connector-name="http-connector"/>
</connectors>
<entries>
<entry name="java:jboss/exported/jms/destinationFactory"/>
</entries>
</connection-factory>
</jms-connection-factories>
<jms-destinations>
<jms-queue name="userStatusQueue">
<entry name="jms/destination"/>
<entry name="java:jboss/exported/jms/destination"/>
</jms-queue>
</jms-destinations>
</hornetq-server>
यह एक कनेक्शन destinationFactory
नामित कारखाने जो http-connector
उपयोग करता है और userStatusQueue
नाम के एक कतार जो नेस्टेड <entry>
तत्व के रूप में सूचीबद्ध एक JNDI नाम करने के लिए बाध्य कर रहे हैं परिभाषित करता है।
यह एक सुरक्षा डोमेन को भी परिभाषित करता है।
<security-domain>ProjectRealm</security-domain>
सुरक्षा सक्षम किया गया है (डिफ़ॉल्ट) का उपयोग करते हुए,
<security-enabled>true</security-enabled>
जो मामले में, यह कारण बनता है निम्न अपवाद उत्पन्न किया जाना है।
15:49:28,093 WARNING [javax.enterprise.resource.webcontainer.jsf.lifecycle] (default task-2) java.lang.RuntimeException: javax.jms.JMSSecurityRuntimeException: HQ119032: User: null doesnt have permission=SEND on address {2}: javax.el.ELException: java.lang.RuntimeException: javax.jms.JMSSecurityRuntimeException: HQ119032: User: null doesnt have permission=SEND on address {2}
at com.sun.el.parser.AstValue.invoke(AstValue.java:296)
at com.sun.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:304)
at org.jboss.weld.util.el.ForwardingMethodExpression.invoke(ForwardingMethodExpression.java:40)
at org.jboss.weld.el.WeldMethodExpression.invoke(WeldMethodExpression.java:50)
at org.jboss.weld.util.el.ForwardingMethodExpression.invoke(ForwardingMethodExpression.java:40)
at org.jboss.weld.el.WeldMethodExpression.invoke(WeldMethodExpression.java:50)
at javax.faces.event.MethodExpressionActionListener.processAction(MethodExpressionActionListener.java:149)
at javax.faces.event.ActionEvent.processListener(ActionEvent.java:88)
at javax.faces.component.UIComponentBase.broadcast(UIComponentBase.java:814)
at javax.faces.component.UICommand.broadcast(UICommand.java:300)
at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:790)
at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1282)
at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:81)
at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:198)
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:658)
at io.undertow.servlet.handlers.ServletHandler.handleRequest(ServletHandler.java:86)
at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:130)
at org.primefaces.webapp.filter.FileUploadFilter.doFilter(FileUploadFilter.java:78)
at io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:60)
at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:132)
at io.undertow.websockets.jsr.JsrWebSocketFilter.doFilter(JsrWebSocketFilter.java:151)
at io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:60)
at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:132)
at org.omnifaces.facesviews.FacesViewsForwardingFilter.filterExtensionLess(FacesViewsForwardingFilter.java:128)
at org.omnifaces.facesviews.FacesViewsForwardingFilter.doFilter(FacesViewsForwardingFilter.java:89)
at org.omnifaces.filter.HttpFilter.doFilter(HttpFilter.java:108)
at io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:60)
at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:132)
at filter.LoginNocacheFilter.doFilter(LoginNocacheFilter.java:32)
at io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:60)
at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:132)
at org.omnifaces.filter.CharacterEncodingFilter.doFilter(CharacterEncodingFilter.java:122)
at org.omnifaces.filter.HttpFilter.doFilter(HttpFilter.java:108)
at io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:60)
at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:132)
at io.undertow.servlet.handlers.FilterHandler.handleRequest(FilterHandler.java:85)
at io.undertow.servlet.handlers.security.ServletSecurityRoleHandler.handleRequest(ServletSecurityRoleHandler.java:62)
at io.undertow.servlet.handlers.ServletDispatchingHandler.handleRequest(ServletDispatchingHandler.java:36)
at org.wildfly.extension.undertow.security.SecurityContextAssociationHandler.handleRequest(SecurityContextAssociationHandler.java:78)
at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
at io.undertow.servlet.handlers.security.SSLInformationAssociationHandler.handleRequest(SSLInformationAssociationHandler.java:131)
at io.undertow.servlet.handlers.security.ServletAuthenticationCallHandler.handleRequest(ServletAuthenticationCallHandler.java:57)
at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
at io.undertow.security.handlers.AuthenticationConstraintHandler.handleRequest(AuthenticationConstraintHandler.java:51)
at io.undertow.security.handlers.AbstractConfidentialityHandler.handleRequest(AbstractConfidentialityHandler.java:46)
at io.undertow.servlet.handlers.security.ServletConfidentialityConstraintHandler.handleRequest(ServletConfidentialityConstraintHandler.java:64)
at io.undertow.servlet.handlers.security.ServletSecurityConstraintHandler.handleRequest(ServletSecurityConstraintHandler.java:56)
at io.undertow.security.handlers.AuthenticationMechanismsHandler.handleRequest(AuthenticationMechanismsHandler.java:58)
at io.undertow.servlet.handlers.security.CachedAuthenticatedSessionHandler.handleRequest(CachedAuthenticatedSessionHandler.java:72)
at io.undertow.security.handlers.NotificationReceiverHandler.handleRequest(NotificationReceiverHandler.java:50)
at io.undertow.security.handlers.SecurityInitialHandler.handleRequest(SecurityInitialHandler.java:76)
at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
at org.wildfly.extension.undertow.security.jacc.JACCContextIdHandler.handleRequest(JACCContextIdHandler.java:61)
at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
at io.undertow.servlet.handlers.ServletInitialHandler.handleFirstRequest(ServletInitialHandler.java:282)
at io.undertow.servlet.handlers.ServletInitialHandler.dispatchRequest(ServletInitialHandler.java:261)
at io.undertow.servlet.handlers.ServletInitialHandler.access$000(ServletInitialHandler.java:80)
at io.undertow.servlet.handlers.ServletInitialHandler$1.handleRequest(ServletInitialHandler.java:172)
at io.undertow.server.Connectors.executeRootHandler(Connectors.java:199)
at io.undertow.server.HttpServerExchange$1.run(HttpServerExchange.java:774)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.RuntimeException: javax.jms.JMSSecurityRuntimeException: HQ119032: User: null doesnt have permission=SEND on address {2}
at io.undertow.servlet.spec.RequestDispatcherImpl.forwardImpl(RequestDispatcherImpl.java:219)
at io.undertow.servlet.spec.RequestDispatcherImpl.forward(RequestDispatcherImpl.java:108)
at com.sun.faces.context.ExternalContextImpl.dispatch(ExternalContextImpl.java:643)
at admin.bean.SignInCheck.signIn(SignInCheck.java:63)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at com.sun.el.parser.AstValue.invoke(AstValue.java:292)
... 64 more
Caused by: javax.jms.JMSSecurityRuntimeException: HQ119032: User: null doesnt have permission=SEND on address {2}
at org.hornetq.jms.client.JmsExceptionUtils.convertToRuntimeException(JmsExceptionUtils.java:76)
at org.hornetq.jms.client.HornetQJMSProducer.send(HornetQJMSProducer.java:112)
at org.hornetq.jms.client.HornetQJMSProducer.send(HornetQJMSProducer.java:135)
at filter.SecurityCheck.sendMessageToDestination(SecurityCheck.java:54)
at filter.SecurityCheck.doAfterProcessing(SecurityCheck.java:107)
at filter.SecurityCheck.doFilter(SecurityCheck.java:161)
at io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:60)
at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:132)
at io.undertow.servlet.handlers.FilterHandler.handleRequest(FilterHandler.java:85)
at io.undertow.servlet.handlers.security.ServletSecurityRoleHandler.handleRequest(ServletSecurityRoleHandler.java:62)
at io.undertow.servlet.handlers.ServletDispatchingHandler.handleRequest(ServletDispatchingHandler.java:36)
at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
at io.undertow.servlet.handlers.ServletInitialHandler.dispatchRequest(ServletInitialHandler.java:263)
at io.undertow.servlet.handlers.ServletInitialHandler.dispatchToPath(ServletInitialHandler.java:198)
at io.undertow.servlet.spec.RequestDispatcherImpl.forwardImpl(RequestDispatcherImpl.java:195)
... 72 more
Caused by: javax.jms.JMSSecurityException: HQ119032: User: null doesnt have permission=SEND on address {2}
at org.hornetq.core.protocol.core.impl.ChannelImpl.sendBlocking(ChannelImpl.java:399)
at org.hornetq.core.client.impl.ClientProducerImpl.sendRegularMessage(ClientProducerImpl.java:334)
at org.hornetq.core.client.impl.ClientProducerImpl.doSend(ClientProducerImpl.java:304)
at org.hornetq.core.client.impl.ClientProducerImpl.send(ClientProducerImpl.java:135)
at org.hornetq.jms.client.HornetQMessageProducer.doSendx(HornetQMessageProducer.java:524)
at org.hornetq.jms.client.HornetQMessageProducer.send(HornetQMessageProducer.java:210)
at org.hornetq.jms.client.HornetQMessageProducer.send(HornetQMessageProducer.java:200)
at org.hornetq.jms.client.HornetQJMSProducer.send(HornetQJMSProducer.java:107)
... 87 more
Caused by: HornetQSecurityException[errorType=SECURITY_EXCEPTION message=HQ119032: User: null doesnt have permission=SEND on address {2}]
... 95 more
संदेश परिभाषित कतार, जब <security-enabled>
एक false
मान दिया जाता है (जो एक संदेश प्रेरित बीन (एमडीबी) द्वारा प्राप्त होता है) के माध्यम से भेजा जाता है। हालांकि मुझे कतार बनाने और संदेश भेजने के लिए केवल उन्हीं उपयोगकर्ताओं की आवश्यकता है जिनके पास पूर्वनिर्धारित प्राधिकरण/भूमिका (ROLE_ADMIN
या ROLE_USER
) है।
ऊपर दिखाए गए अनुसार <security-domain>
का उपयोग उपरोक्त अपवाद के साथ विफल रहता है।
मैं /standalone/configuration/application-roles.properties
में जोड़ने की भूमिका निभाने की कोशिश की बिल्कुल के रूप में <login-module>
अंदर
<module-option name="rolesProperties"
value="file:${jboss.server.config.dir}/ProjectRealm.properties"/>
में इस्तेमाल ProjectRealm.properties
फाइल में परिभाषित लेकिन यह या तो मदद नहीं की।
admins=ROLE_ADMIN
users=ROLE_USER
कतार में संदेश भेजने से पहले उपयोगकर्ताओं को प्रमाणीकृत करने के लिए और क्या करने की आवश्यकता है?
अतिरिक्त:
JAAS सुरक्षा प्रबंधक निम्नलिखित डोमेन का उपयोग करता प्रमाणित करने और एक JDBC दायरे (XA डेटा स्रोत) का उपयोग कर उपयोगकर्ताओं को अधिकृत करने के लिए। यह पहले से ही ठीक काम करता है।
<security-domain name="ProjectRealm" cache-type="default">
<authentication>
<login-module code="Database" flag="required">
<module-option name="dsJndiName" value="java:jboss/datasources/projectXADatasource"/>
<module-option name="principalsQuery" value="SELECT password FROM user_table WHERE email_id=?"/>
<module-option name="rolesQuery" value="SELECT user_role, 'Roles' FROM user_roles ur INNER JOIN user_table ut ON ur.user_id=ut.user_id WHERE ut.email_id=?"/>
<module-option name="hashAlgorithm" value="SHA-256"/>
<module-option name="hashEncoding" value="hex"/>
<module-option name="hashCharset" value="UTF-8"/>
<module-option name="hashStorePassword" value="false"/>
<module-option name="unauthenticatedIdentity" value="guest"/>
</login-module>
<login-module code="RoleMapping" flag="required">
<module-option name="rolesProperties" value="file:${jboss.server.config.dir}/ProjectRealm.properties"/>
<module-option name="replaceRole" value="false"/>
</login-module>
</authentication>
</security-domain>
कतार जो JMSContext
द्वारा किया जाता है कतार भर में एक संदेश भेजने के बाद एक उपयोगकर्ता सफलतापूर्वक प्रमाणीकृत और अधिकृत करते है एक प्रमाणीकरण सर्वलेट फिल्टर में इंजेक्ट किया जाता है।
@WebFilter(filterName = "SecurityCheck", urlPatterns = {"/WEB-INF/jaas/*"}, dispatcherTypes = {DispatcherType.FORWARD})
public final class SecurityCheck implements Filter {
@Resource(lookup = "java:/jms/destination")
private Queue queue;
@Inject
@JMSConnectionFactory("java:jboss/exported/jms/destinationFactory")
private JMSContext context;
// jms/destinationFactory is expected to work here but it only works using the fully qualified namespace as above.
public SecurityCheck() {}
private void sendMessageToDestination(String message) throws JMSException {
context.createProducer().send(queue, message);
}
private void doBeforeProcessing(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
String userName = request.getParameter("userName");
request.login(userName.trim(), request.getParameter("password"));
}
private void doAfterProcessing(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException, JMSException {
if (request.isUserInRole("ROLE_ADMIN")) {
sendMessageToDestination("Message");
// Redirect to a secure area.
} else if (request.isUserInRole("ROLE_USER")) {
sendMessageToDestination("Message");
// Redirect to a secure area.
}
//...
}
//...
}
मैं एक शुद्ध परीक्षण के लिए स्व-हस्ताक्षरित SSL प्रमाणपत्र का उपयोग कर रहा हूँ। इस प्रकार, यह web.xml
में सुरक्षित वेब संसाधनों
<transport-guarantee>CONFIDENTIAL</transport-guarantee>
तक पहुंचने के लिए https://localhost:8443/ContextPath
का उपयोग करता है।
अद्यतन:
संदेश प्रेरित बीन लेने वाली संदेशों:
@JMSDestinationDefinition(name = "destination", interfaceName = "javax.jms.Queue", resourceAdapter = "jmsra", destinationName = "destination")
@MessageDriven(activationConfig = {
@ActivationConfigProperty(propertyName = "destinationLookup", propertyValue = "jms/destination"),
@ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue"),
@ActivationConfigProperty(propertyName = "connectionFactoryLookup", propertyValue = "java:jboss/exported/jms/destinationFactory"),
@ActivationConfigProperty(propertyName = "messagingType", propertyValue = "javax.jms.MessageListener"),
@ActivationConfigProperty(propertyName = "destination", propertyValue = "java:/jms/destination"),
@ActivationConfigProperty(propertyName = "useJNDI", propertyValue = "true")
})
public class UserStatusMessageBean implements MessageListener {
public UserStatusMessageBean() {}
@Resource
private MessageDrivenContext messageDrivenContext;
@EJB
private UserStatusService userStatusService;
@Override
public void onMessage(Message message) {
try {
if (message instanceof TextMessage) {
TextMessage textMessage = (TextMessage) message;
String text = textMessage.getText();
if (StringUtils.isNotBlank(text)) {
userStatusService.addHost(text);
} else {
System.out.println("No message found.");
}
} else {
System.out.println("Message is of wrong type : " + message.getClass().getName());
}
} catch (JMSException e) {
messageDrivenContext.setRollbackOnly();
System.out.println(e);
} catch (Throwable e) {
System.out.println(e);
}
}
}
किसी रिमोट EJB ऊपर एमडीबी जो परिभाषित अधिकारियों की आवश्यकता है में इंजेक्ट किया जा रहा है।
@Stateless
@DeclareRoles(value = {"ROLE_ADMIN", "ROLE_USER"})
@RolesAllowed(value = {"ROLE_ADMIN", "ROLE_USER"})
public class UserStatusBean implements UserStatusService {
@PersistenceContext
private EntityManager entityManager;
@Override
public void addHost(String hostName) {
// Insert or update via JPA.
}
}
जब आवेदन तैनात किया जाता है, सर्वर निम्नलिखित अपवाद रिकर्सिवली फेंकने पर रहता है जब तक कि एक false
मूल्य में दी गई है,
<security-enabled>false</security-enabled>
20:21:55,343 ERROR [org.hornetq.ra] (default-threads - 3) HQ154003: Unable to reconnect org.hornetq.ra.inflow.HornetQActivationSpec([email protected] destination=java:/jms/destination destinationType=javax.jms.Queue ack=Auto-acknowledge durable=false clientID=null user=null maxSession=15): HornetQSecurityException[errorType=SECURITY_EXCEPTION message=HQ119032: User: null doesnt have permission=CONSUME on address {2}]
at org.hornetq.core.protocol.core.impl.ChannelImpl.sendBlocking(ChannelImpl.java:399)
at org.hornetq.core.client.impl.ClientSessionImpl.internalCreateConsumer(ClientSessionImpl.java:2064)
at org.hornetq.core.client.impl.ClientSessionImpl.createConsumer(ClientSessionImpl.java:527)
at org.hornetq.core.client.impl.ClientSessionImpl.createConsumer(ClientSessionImpl.java:474)
at org.hornetq.core.client.impl.DelegatingSession.createConsumer(DelegatingSession.java:206)
at org.hornetq.ra.inflow.HornetQMessageHandler.setup(HornetQMessageHandler.java:184)
at org.hornetq.ra.inflow.HornetQActivation.setup(HornetQActivation.java:340)
at org.hornetq.ra.inflow.HornetQActivation.handleFailure(HornetQActivation.java:768)
at org.hornetq.ra.inflow.HornetQActivation$SetupActivation.run(HornetQActivation.java:823)
at org.jboss.jca.core.workmanager.WorkWrapper.run(WorkWrapper.java:226)
at org.jboss.threads.SimpleDirectExecutor.execute(SimpleDirectExecutor.java:33)
at org.jboss.threads.QueueExecutor.runTask(QueueExecutor.java:808)
at org.jboss.threads.QueueExecutor.access$100(QueueExecutor.java:45)
at org.jboss.threads.QueueExecutor$Worker.run(QueueExecutor.java:828)
at java.lang.Thread.run(Thread.java:745)
at org.jboss.threads.JBossThread.run(JBossThread.java:320)
ये परिवर्तन किए गए हैं। यह अपवाद ** तैनाती के समय ** पर होता है: '17: 17: 31,687 ERROR [org.hornetq.ra] (डिफ़ॉल्ट-धागे - 1) मुख्यालय 154003: org.hornetq.ra.inflow.HornetQActivationSpec (ra = org) को फिर से कनेक्ट करने में असमर्थ .hornetq.ra.HornetQResourceAdapter @ a0f08f गंतव्य = jms/गंतव्य गंतव्य टाइप = javax.jms.Queue ack = स्वत: स्वीकृति टिकाऊ = झूठी क्लाइंट आईडी = शून्य उपयोगकर्ता = शून्य अधिकतम सत्र = 15): HornetQSecurityException [errorType = SECURITY_EXCEPTION संदेश = HQ119032: उपयोगकर्ता: शून्य के पास अनुमति नहीं है = पते पर CONSUME {2}] '... – Tiny
...कतार से पहले ** रन-टाइम ** पर एक संदेश भेजने का मौका मिलता है जब तक '<सुरक्षा-सक्षम> सत्य सुरक्षा-सक्षम> 'में' झूठा' मान नहीं दिया जाता है और ' में सभी 'भूमिकाएं' विशेषताएं दी जाती हैं 'अतिथि 'पर रीसेट कर रहे हैं। –
Tiny
लक्षित संदेश संचालित बीन (एमडीबी) अधिकारियों के साथ एक ईजेबी इंजेक्शन: '@RolesAllowed (value = {"ROLE_ADMIN", "ROLE_USER"})' 'javax.ejb.EJBAccessException' को फेंकने का कारण बनता है। – Tiny