001
014
015 package com.liferay.portal.security.access.control;
016
017 import com.liferay.portal.kernel.security.access.control.AccessControlPolicy;
018 import com.liferay.portal.kernel.security.access.control.AccessControlThreadLocal;
019 import com.liferay.portal.kernel.security.access.control.AccessControlled;
020 import com.liferay.registry.Registry;
021 import com.liferay.registry.RegistryUtil;
022 import com.liferay.registry.ServiceReference;
023 import com.liferay.registry.ServiceTracker;
024 import com.liferay.registry.ServiceTrackerCustomizer;
025
026 import java.util.List;
027 import java.util.concurrent.CopyOnWriteArrayList;
028
029 import org.aopalliance.intercept.MethodInvocation;
030
031
037 public class AccessControlAdvisorImpl implements AccessControlAdvisor {
038
039 public AccessControlAdvisorImpl() {
040 Registry registry = RegistryUtil.getRegistry();
041
042 _serviceTracker = registry.trackServices(
043 AccessControlPolicy.class,
044 new AccessControlPolicyTrackerCustomizer());
045
046 _serviceTracker.open();
047 }
048
049 @Override
050 public void accept(
051 MethodInvocation methodInvocation,
052 AccessControlled accessControlled)
053 throws SecurityException {
054
055 if (AccessControlThreadLocal.isRemoteAccess()) {
056 for (AccessControlPolicy accessControlPolicy :
057 _accessControlPolicies) {
058
059 accessControlPolicy.onServiceRemoteAccess(
060 methodInvocation.getMethod(),
061 methodInvocation.getArguments(), accessControlled);
062 }
063 }
064 else {
065 for (AccessControlPolicy accessControlPolicy :
066 _accessControlPolicies) {
067
068 accessControlPolicy.onServiceAccess(
069 methodInvocation.getMethod(),
070 methodInvocation.getArguments(), accessControlled);
071 }
072 }
073 }
074
075 private final List<AccessControlPolicy> _accessControlPolicies =
076 new CopyOnWriteArrayList<>();
077 private final ServiceTracker<?, AccessControlPolicy> _serviceTracker;
078
079 private class AccessControlPolicyTrackerCustomizer
080 implements
081 ServiceTrackerCustomizer<AccessControlPolicy, AccessControlPolicy> {
082
083 @Override
084 public AccessControlPolicy addingService(
085 ServiceReference<AccessControlPolicy> serviceReference) {
086
087 Registry registry = RegistryUtil.getRegistry();
088
089 AccessControlPolicy accessControlPolicy = registry.getService(
090 serviceReference);
091
092 _accessControlPolicies.add(accessControlPolicy);
093
094 return accessControlPolicy;
095 }
096
097 @Override
098 public void modifiedService(
099 ServiceReference<AccessControlPolicy> serviceReference,
100 AccessControlPolicy accessControlPolicy) {
101 }
102
103 @Override
104 public void removedService(
105 ServiceReference<AccessControlPolicy> serviceReference,
106 AccessControlPolicy accessControlPolicy) {
107
108 Registry registry = RegistryUtil.getRegistry();
109
110 registry.ungetService(serviceReference);
111
112 _accessControlPolicies.remove(accessControlPolicy);
113 }
114
115 }
116
117 }