2016-05-31 12 views
0

Ich implementierte Spring-Anwendung, die basierend auf Scheduler in Weblogic 10. Server ausgeführt wird. während ich es bereitstellen. Ich bekomme über Ausnahme.java.lang.Security Exception

hier ist mein Stack-Trace

java.lang.SecurityException: [Security:090398]Invalid Subject: principals=[bpm_weblogic, AdminChannelUsers, Administrators, AppTesters, CrossDomainConnectors, Deployers, Monitors, Operators, OracleSystemGroup] 
    at weblogic.security.service.SecurityServiceManager.seal(SecurityServiceManager.java:833) 
    at weblogic.security.service.IdentityUtility.authenticatedSubjectToIdentity(IdentityUtility.java:30) 
    at weblogic.security.service.RoleManager.getRoles(RoleManager.java:183) 
    at weblogic.security.service.AuthorizationManager.isAccessAllowed(AuthorizationManager.java:375) 
    at weblogic.jndi.internal.ServerNamingNode.checkPermission(ServerNamingNode.java:442) 
    at weblogic.jndi.internal.ServerNamingNode.checkLookup(ServerNamingNode.java:423) 
    at weblogic.jndi.internal.ServerNamingNode.lookupHere(ServerNamingNode.java:180) 
    at weblogic.jndi.internal.BasicNamingNode.unbind(BasicNamingNode.java:565) 
    at weblogic.jndi.internal.WLEventContextImpl.unbind(WLEventContextImpl.java:173) 
    at javax.naming.InitialContext.unbind(InitialContext.java:435) 
    at com.tcs.controller.BpmController.run(BpmController.java:94) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:606) 
    at org.springframework.scheduling.support.ScheduledMethodRunnable.run(ScheduledMethodRunnable.java:64) 
    at org.springframework.scheduling.support.DelegatingErrorHandlingRunnable.run(DelegatingErrorHandlingRunnable.java:53) 
    at org.springframework.scheduling.concurrent.ReschedulingRunnable.run(ReschedulingRunnable.java:81) 
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471) 
    at java.util.concurrent.FutureTask.run(FutureTask.java:262) 
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:178) 
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:292) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) 
    at java.lang.Thread.run(Thread.java:744) 

meine Feder-Anwendung wird in einer WebLogic-Umgebung ausgeführt wird, und ich bpm nenne, die in einer anderen WebLogic-Umgebung ausgeführt wird. hier, wenn nicht bpm aufrufen ich keine Ausnahme und wenn ich Benutzer dataSource anstelle von Jndi es funktioniert gut. aber das Problem ist, ich muss die BPM aufrufen und ich kann nicht DataSource-Konfiguration in der Produktion verwenden.

hier ist mein Controller-Klasse

public String executeBpm(User user) { 
     IBPMContext context = null; 
     String status = null; 

     if (logger.isDebugEnabled()) { 
      logger.debug("executeBpm method starts"); 
     } 
     try { 
      if (user.getUserId() != null && !("").equals(user.getUserId())) { 

       context = ITBABPMContext.getIBPMContextUsingName(user.getUserId()); 
      } 
      HashMap<String, Object> elements = (HashMap<String, Object>) user.getMap(); 
      UpdateTaskDetails updates = new UpdateTaskDetails(); 
      if (user.getTaskId() != null && !("").equals(user.getTaskId())) { 
       updates.setTaskID(user.getTaskId()); 
      } 

      if (user.getTaskId() != null && !("").equals(user.getTaskId())) { 
       updates.setTaskOutcome(user.getTaskOutcome()); 
      } 
      if (user.getUserComment() != null && !("").equals(user.getUserComment())) { 
       updates.setUserComment(user.getUserComment()); 
      } 

      if (!elements.isEmpty() && elements.size() > 0) { 
       updates.setElementList(elements); 
      } 
      if (logger.isDebugEnabled()) { 
       logger.debug("executeBpm method ends"); 
      } 
      status = ITBAACMUtil.updateTaskOutcome(updates, context); 
      if (status.equalsIgnoreCase("success")) { 
       bpmProcessorService.write(user.getUserId(), user.getSeqNo()); 
      } 

     } catch (ITBABPMRuntimeException e) { 
      e.printStackTrace(); 
     } catch (BPMServiceClientException e) { 
      e.printStackTrace(); 
     } catch (BPMException e) { 
      e.printStackTrace(); 
     } 
     catch (Exception e) { 
      e.printStackTrace(); 
     } 
     return status; 
    } 

meine dao Klasse

public void write(String userId,Long seqNo){ 
     try{ 
      String query=messageSource.getMessage(BPMConstants.FAILED_QUERY,new Object[]{Long.toString(seqNo)},Locale.US); 
      jdbcTemplate.update(query); 

    }catch(Exception e){ 
     logger.error("exception at updating the status to failed .."); 
     logger.error(e.getStackTrace()); 
    } 

}

hier eine Sache ist Cross-Domain-Mapping sind bereits dort und andere Anwendungen laufen gut. Also ich denke nicht, dass dies das Problem mit Cross-Domain-Mapping ist. Hier ist meine Konfigurationsdatei.

<context:component-scan base-package="com.app" /> 

    <bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean"> 
    <property name="jndiName" value="MCDataSource"/> 
    </bean> 

    <bean id="txManager" class="org.springframework.transaction.jta.WebLogicJtaTransactionManager" /> 

    <bean id="transactionManager" class="org.springframework.transaction.jta.WebLogicJtaTransactionManager"> 
    <property name="transactionManagerName" value="javax.transaction.TransactionManager"/> 
    </bean> 


<!-- <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"> 
    <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver" /> 
    <property name="url" value="jdbc:oracle:thin:@172.19.8.159:1521/OIM.itba.gov.in" /> 
    <property name="username" value="AppDB"></property> 
    <property name="password" value="AppDB"></property> 
    <property name="initialSize" value="2" /> 
    <property name="maxActive" value="5" /> 
    </bean>  --> 




    <bean id="messageSource" 
     class="org.springframework.context.support.ResourceBundleMessageSource"> 
     <property name="basename"> 
      <value>messages</value> 
     </property> 
    </bean> 

    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"> 
     <property name="dataSource" ref="dataSource" /> 
    </bean> 

    <bean id="runScheduler" class="com.app.controller.BpmController" /> 
     <task:scheduled-tasks> 
    <task:scheduled ref="runScheduler" method="run" cron="0 0/5 * * * ?" /> 
    </task:scheduled-tasks> 

Antwort

1

Hey, es scheint, dein Problem ist, dass du den Kontext nicht richtig vertauschst. Sobald Sie den IBPM-Kontext geöffnet haben, kehren Sie zurück und versuchen, auf Ihrem lokalen jndi-Baum nachzuschlagen, aber Sie haben IBPM-Kontextinformationen, die auf Ihrer lokalen Weblogic nicht authentifiziert werden. Sie müssen einen neuen Kontext öffnen, bevor Sie eine Suchoperation für Ihre Datenquelle ausführen. Hier

ist ein Beispielcode:

jndiTemplate(org.springframework.jndi.JndiTemplate) { bean -> 
    bean.scope = "prototype" 
    environment = [ 
     "java.naming.factory.initial":"weblogic.jndi.WLInitialContextFactory", 
     "java.naming.security.principal" : "username", 
     "java.naming.security.credentials": "password" 
     ] 
} 

dataSource(org.springframework.jndi.JndiObjectFactoryBean){ 
    jndiTemplate = ref(jndiTemplate) 
    jndiName = "name" 
    exposeAccessContext=true 
} 

Dann, wenn Sie wollen die jndi Sie so etwas wie kann zum Nachschlagen. die jndiTemplate Spritzen und:

jndiTemplate.context.getProperties() 

Oder

InitialContext initialContext = new InitialContext(jndiTemplate.getEnvironment()); 

Sie dann schließen kann.

+0

danke für Ihre Antwort. Du hast absolut recht. Ich kann Verbindung mit neuem Kontext herstellen. aber kannst du mir bitte sagen wie ich das mit dem frühling erreichen kann. – suri

+0

danke für Ihre Antwort, können Sie hier eine Sache klären. Was ist das Diff b/w mit jndiTemplate und jdbcTemplate. – suri

+0

JndiTemplate ermöglicht das Suchen und Binden einer Jndi-Ressource (Datenquelle). JbdcTemplate ermöglicht es Ihnen, Sql-Anweisungen mit einer Datenquelle auszuführen. – Miguel