You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tomee.apache.org by rm...@apache.org on 2013/01/20 14:55:39 UTC
svn commit: r1435843 - in /tomee/tomee/trunk:
container/openejb-core/src/main/java/org/apache/openejb/core/ivm/
container/openejb-core/src/main/java/org/apache/openejb/core/security/
container/openejb-core/src/main/java/org/apache/openejb/ri/sp/ contai...
Author: rmannibucau
Date: Sun Jan 20 13:55:38 2013
New Revision: 1435843
URL: http://svn.apache.org/viewvc?rev=1435843&view=rev
Log:
TOMEE-744 identity in our securityservice is a simple threadlocal. for @asynch we can't use an inherited threadlocal so simply propagating the security service state (identity often) to be able to use it in @asynch methods
Modified:
tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/core/ivm/EjbObjectProxyHandler.java
tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/core/security/AbstractSecurityService.java
tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/ri/sp/PseudoSecurityService.java
tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/spi/SecurityService.java
tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatSecurityService.java
Modified: tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/core/ivm/EjbObjectProxyHandler.java
URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/core/ivm/EjbObjectProxyHandler.java?rev=1435843&r1=1435842&r2=1435843&view=diff
==============================================================================
--- tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/core/ivm/EjbObjectProxyHandler.java (original)
+++ tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/core/ivm/EjbObjectProxyHandler.java Sun Jan 20 13:55:38 2013
@@ -22,7 +22,9 @@ import org.apache.openejb.OpenEJBExcepti
import org.apache.openejb.OpenEJBRuntimeException;
import org.apache.openejb.async.AsynchronousPool;
import org.apache.openejb.core.ServerFederation;
+import org.apache.openejb.loader.SystemInstance;
import org.apache.openejb.spi.ApplicationServer;
+import org.apache.openejb.spi.SecurityService;
import org.apache.openejb.util.LogCategory;
import org.apache.openejb.util.Logger;
@@ -231,10 +233,18 @@ public abstract class EjbObjectProxyHand
final AsynchronousPool asynchronousPool = beanContext.getModuleContext().getAppContext().getAsynchronousPool();
if (beanContext.isAsynchronous(method)) {
+ final SecurityService<?> securityService = SystemInstance.get().getComponent(SecurityService.class);
+ final Object state = securityService.currentState();
return asynchronousPool.invoke(new Callable<Object>() {
@Override
public Object call() throws Exception {
- return synchronizedBusinessMethod(interfce, method, args);
+ final Object threadState = securityService.currentState();
+ securityService.setState(state);
+ try {
+ return synchronizedBusinessMethod(interfce, method, args);
+ } finally {
+ securityService.setState(threadState);
+ }
}
}, method.getReturnType() == Void.TYPE);
} else {
Modified: tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/core/security/AbstractSecurityService.java
URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/core/security/AbstractSecurityService.java?rev=1435843&r1=1435842&r2=1435843&view=diff
==============================================================================
--- tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/core/security/AbstractSecurityService.java (original)
+++ tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/core/security/AbstractSecurityService.java Sun Jan 20 13:55:38 2013
@@ -335,6 +335,18 @@ public abstract class AbstractSecuritySe
return new Subject(true, principals, new HashSet(), new HashSet());
}
+ @Override
+ public Object currentState() {
+ return clientIdentity.get();
+ }
+
+ @Override
+ public void setState(final Object o) {
+ if (Identity.class.isInstance(o)) {
+ clientIdentity.set(Identity.class.cast(o));
+ }
+ }
+
protected final static class SecurityContext {
public final Subject subject;
Modified: tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/ri/sp/PseudoSecurityService.java
URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/ri/sp/PseudoSecurityService.java?rev=1435843&r1=1435842&r2=1435843&view=diff
==============================================================================
--- tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/ri/sp/PseudoSecurityService.java (original)
+++ tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/ri/sp/PseudoSecurityService.java Sun Jan 20 13:55:38 2013
@@ -70,4 +70,12 @@ public class PseudoSecurityService imple
public boolean isCallerAuthorized(Method method, InterfaceType type) {
return true;
}
+
+ public void setState(Object o) {
+ // no-op
+ }
+
+ public Object currentState() {
+ return null;
+ }
}
\ No newline at end of file
Modified: tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/spi/SecurityService.java
URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/spi/SecurityService.java?rev=1435843&r1=1435842&r2=1435843&view=diff
==============================================================================
--- tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/spi/SecurityService.java (original)
+++ tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/spi/SecurityService.java Sun Jan 20 13:55:38 2013
@@ -73,4 +73,7 @@ public interface SecurityService<T> exte
*/
public boolean isCallerAuthorized(Method method, InterfaceType type);
+ // mainly for asynch handling
+ public void setState(Object o);
+ public Object currentState();
}
\ No newline at end of file
Modified: tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatSecurityService.java
URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatSecurityService.java?rev=1435843&r1=1435842&r2=1435843&view=diff
==============================================================================
--- tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatSecurityService.java (original)
+++ tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatSecurityService.java Sun Jan 20 13:55:38 2013
@@ -139,6 +139,23 @@ public class TomcatSecurityService exten
return roles;
}
+ @Override
+ public Principal getCallerPrincipal() {
+ final Identity currentIdentity = clientIdentity.get();
+ if (currentIdentity != null) {
+ final Set<Principal> principals = currentIdentity.getSubject().getPrincipals();
+ for (final Principal principal : principals) {
+ if (principal.getClass().isAnnotationPresent(CallerPrincipal.class)) {
+ return principal;
+ }
+ }
+ if (!principals.isEmpty()) {
+ return principals.iterator().next();
+ }
+ }
+ return super.getCallerPrincipal();
+ }
+
public Object enterWebApp(Realm realm, Principal principal, String runAs) {
Identity newIdentity = null;
if (principal != null) {
@@ -160,8 +177,13 @@ public class TomcatSecurityService exten
public void exitWebApp(Object state) {
if (state instanceof WebAppState) {
- WebAppState webAppState = (WebAppState) state;
- clientIdentity.set(webAppState.oldIdentity);
+ final WebAppState webAppState = (WebAppState) state;
+ if (webAppState.oldIdentity == null) {
+ clientIdentity.remove();
+ } else {
+ clientIdentity.set(webAppState.oldIdentity);
+ }
+
if (webAppState.hadRunAs) {
runAsStack.get().removeFirst();
}