2012-01-05 6 views
0

私はカスタムメソッドセキュリティインターセプタを作成しようとしています。しかし、私はセキュリティコンテキストでBeanプロパティに追加した認証マネージャを使用せず、認証マネージャが存在するかどうかを確認するときにnullを返します。認証マネージャーのBeanプロパティーが使用されていない理由を誰にも教えてください。ここでSpringセキュリティメソッドセキュリティインターセプタが認証マネージャを取得していません

<beans:bean id="methodInterceptor" 
    class="bigbank.security.CustomMethodSecInterceptor"> 
    <beans:property name="authenticationManager" ref="authenticationManager" /> 
    <beans:property name="accessDecisionManager" ref="universalAccessDecisionManager" /> 
    <beans:property name="securityMetadataSource" ref="tspmMethodSecurityMetaData" /> 

メソッドインターセプタを含むBeanがここに私のメソッドのセキュリティ・インターセプタは

public class CustomMethodSecInterceptor extends MethodSecurityInterceptor { 

private static final Log logger = LogFactory 
     .getLog(WebSphere2SpringSecurityPropagationInterceptor.class); 
private AuthenticationManager authenticationManager = null; 
private AuthenticationDetailsSource authenticationDetailsSource = new WebSpherePreAuthenticatedAuthenticationDetailsSource(); 
private final WASUsernameAndGroupsExtractor wasHelper; 

public CustomMethodSecInterceptor() { 
    wasHelper = new DefaultWASUsernameAndGroupsExtractor(); 
} 

@Override 
public Object invoke(MethodInvocation mi) throws Throwable { 
    try { 
     logger.debug("Performing Spring Security authentication with WebSphere credentials"); 
     System.out.println("@@going through ss authentication"); 
     authenticateSpringSecurityWithWASCredentials(); 
     InterceptorStatusToken token = super.beforeInvocation(mi); 

     logger.debug("Proceeding with method invocation"); 
     Object result = mi.proceed(); 
     return super.afterInvocation(token, result); 

    } finally { 
     logger.debug("Clearing Spring Security security context"); 
     SecurityContextHolder.clearContext(); 
    } 
} 

private void authenticateSpringSecurityWithWASCredentials() { 
    Assert.notNull(authenticationManager); // This is where the error is coming up 
    Assert.notNull(authenticationDetailsSource); 

    String userName = wasHelper.getCurrentUserName(); 
    if (logger.isDebugEnabled()) { 
     logger.debug("Creating authentication request for user " + userName); 
    } 
    PreAuthenticatedAuthenticationToken authRequest = new PreAuthenticatedAuthenticationToken(
      userName, "N/A"); 
    authRequest.setDetails(authenticationDetailsSource.buildDetails(null)); 
    if (logger.isDebugEnabled()) { 
     logger.debug("Authentication request for user " + userName + ": " 
       + authRequest); 
    } 
    Authentication authResponse = authenticationManager 
      .authenticate(authRequest); 
    if (logger.isDebugEnabled()) { 
     logger.debug("Authentication response for user " + userName + ": " 
       + authResponse); 
    } 
    SecurityContextHolder.getContext().setAuthentication(authResponse); 
} 

public void setAuthenticationManager(
     AuthenticationManager authenticationManager) { 
    this.authenticationManager = authenticationManager; 
} 

}

だだ

7.0のWebSphere上で、私は春のセキュリティ3.0.5を使用しています

ここにエラーがあります:

Caused by: java.lang.IllegalArgumentException: An AuthenticationManager is required 
at org.springframework.util.Assert.notNull(Assert.java:112) 
at org.springframework.security.access.intercept.AbstractSecurityInterceptor.afterPropertiesSet(AbstractSecurityInterceptor.java:118) 
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1469) 
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1409) 
... 119 more 

答えて

0

あなたはsetAuthenticationManagerメソッドをオーバーライドしているので、それはAuthenticationManagerを注入する春によって呼び出されたとき、それはAbstractSecurityInterceptorに対応するフィールドを設定しません。

基本クラスにはこのプロパティのゲッターが含まれているので、フィールドとセッターメソッドを削除し、ゲッターを使用してコード内の認証マネージャーにアクセスすることをお勧めします。

関連する問題