View Javadoc

    1   /* Copyright 2004 Acegi Technology Pty Limited
    2    *
    3    * Licensed under the Apache License, Version 2.0 (the "License");
    4    * you may not use this file except in compliance with the License.
    5    * You may obtain a copy of the License at
    6    *
    7    *     http://www.apache.org/licenses/LICENSE-2.0
    8    *
    9    * Unless required by applicable law or agreed to in writing, software
    10   * distributed under the License is distributed on an "AS IS" BASIS,
    11   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    12   * See the License for the specific language governing permissions and
    13   * limitations under the License.
    14   */
    15
    16  package org.acegisecurity.intercept.method.aspectj;
    17
    18  import org.acegisecurity.intercept.AbstractSecurityInterceptor;
    19  import org.acegisecurity.intercept.InterceptorStatusToken;
    20  import org.acegisecurity.intercept.ObjectDefinitionSource;
    21  import org.acegisecurity.intercept.method.MethodDefinitionSource;
    22
    23  import org.aspectj.lang.JoinPoint;
    24
    25
    26  /***
    27   * Provides security interception of AspectJ method invocations.
    28   *
    29   * <p>
    30   * The <code>ObjectDefinitionSource</code> required by this security
    31   * interceptor is of type {@link MethodDefinitionSource}. This is shared with
    32   * the AOP Alliance based security interceptor
    33   * (<code>MethodSecurityInterceptor</code>),  since both work with Java
    34   * <code>Method</code>s.
    35   * </p>
    36   *
    37   * <p>
    38   * The secure object type is <code>org.aspectj.lang.JoinPoint</code>, which is
    39   * passed from the relevant <code>around()</code> advice. The
    40   * <code>around()</code> advice also passes an anonymous implementation of
    41   * {@link AspectJCallback} which contains the call for AspectJ to continue
    42   * processing:  <code>return proceed();</code>.
    43   * </p>
    44   *
    45   * <P>
    46   * Refer to {@link AbstractSecurityInterceptor} for details on the workflow.
    47   * </p>
    48   *
    49   * @author Ben Alex
    50   * @version $Id: AspectJSecurityInterceptor.java,v 1.3 2005/11/17 00:56:48 benalex Exp $
    51   */
    52  public class AspectJSecurityInterceptor extends AbstractSecurityInterceptor {
    53      //~ Instance fields ========================================================
    54
    55      private MethodDefinitionSource objectDefinitionSource;
    56
    57      //~ Methods ================================================================
    58
    59      public void setObjectDefinitionSource(MethodDefinitionSource newSource) {
    60          this.objectDefinitionSource = newSource;
    61      }
    62
    63      public MethodDefinitionSource getObjectDefinitionSource() {
    64          return this.objectDefinitionSource;
    65      }
    66
    67      public Class getSecureObjectClass() {
    68          return JoinPoint.class;
    69      }
    70
    71      /***
    72       * This method should be used to enforce security on a
    73       * <code>JoinPoint</code>.
    74       *
    75       * @param jp The AspectJ joint point being invoked which requires a
    76       *        security decision
    77       * @param advisorProceed the advice-defined anonymous class that implements
    78       *        <code>AspectJCallback</code> containing a simple <code>return
    79       *        proceed();</code> statement
    80       *
    81       * @return The returned value from the method invocation
    82       */
    83      public Object invoke(JoinPoint jp, AspectJCallback advisorProceed) {
    84          Object result = null;
    85          InterceptorStatusToken token = super.beforeInvocation(jp);
    86
    87          try {
    88              result = advisorProceed.proceedWithObject();
    89          } finally {
    90              result = super.afterInvocation(token, result);
    91          }
    92
    93          return result;
    94      }
    95
    96      public ObjectDefinitionSource obtainObjectDefinitionSource() {
    97          return this.objectDefinitionSource;
    98      }
    99  }