0

我正在为 Spring Security 3.1.4 实现自己的身份验证器提供程序。

但是当我在 Tomcat 上运行应用程序时,我从 Tomcat 收到此日志错误。

org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'myAppAuthenticationProvider' is defined

在 web.xml 中,你有这个比其他东西。

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>
        /WEB-INF/applicationContext.xml,
        /WEB-INF/myapp-datasource.xml,
        /WEB-INF/myapp-security.xml
    </param-value>
</context-param>

<filter>
    <filter-name>springSecurityFilterChain</filter-name>
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>

<filter-mapping>
    <filter-name>springSecurityFilterChain</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

myapp-servlet.xml中,你有这个比其他东西。

 <!-- Activa la configuracion de beans mediante anotaciones -->
 <mvc:annotation-driven />

 <!-- Activa la configuracion de los controladores mediante anotaciones -->
 <context:component-scan base-package="com.myapp.**" />

 <!-- Activa la configuracion de seguridad mediante anotaciones -->    
 <security:global-method-security secured-annotations="enabled" pre-post-annotations="enabled" />

myapp-security.xml中,你有这个比其他的东西。

<security:authentication-manager alias="myAuthenticationManager">
    <security:authentication-provider ref="myAppAuthenticationProvider" />
</security:authentication-manager>

然后,我有这样的身份验证器提供程序。

@Component("myAppAuthenticationProvider")
public class MyAppAuthenticationProvider implements AuthenticationProvider {

    private static final Logger Log = LoggerFactory.getLogger(AuthenticationProvider.class);

    @Autowired
    private UserService userService;

    @Override
    public final Authentication authenticate(Authentication authentication) {

        final UsernamePasswordWithTypeAuthenticationToken authenticationToken = 
                (UsernamePasswordWithTypeAuthenticationToken) authentication;

        String name = authenticationToken.getName();
        String password = authenticationToken.getCredentials().toString();
        String type = authenticationToken.getType();

        if(isUserValid(authentication)){

            List<GrantedAuthority> grantedAuth = new ArrayList<GrantedAuthority>();
            grantedAuth.add(new SimpleGrantedAuthority("ROLE_USER"));
            Authentication auth = new UsernamePasswordAuthenticationToken(name, password, grantedAuth);

            return auth;  
        }else {

            throw new BadCredentialsException("Bad authentication.");
        }
    }

    @Override
    public final boolean supports(Class<?> authentication) {
        return UsernamePasswordWithTypeAuthenticationToken.class.isAssignableFrom(authentication);
    }

    private boolean isUserValid(Authentication authentication) {

        User user = this.userService.getUserByEmailAndPassword(
                authentication.getName(), authentication.getCredentials().toString());

        if (user != null) {
            return true;
        }

        return false;
    }

}

有人可以帮助我吗?,在此先感谢。`在此处输入代码

4

1 回答 1

3

您有两个弹簧上下文(第一个用于应用程序 bean/DS/安全,第二个用于 Spring MVC)。请确保您MyAppAuthenticationProvider在第一个中被相应的component-scan元素选中。我很确定它被第二个上下文(Spring MVC)拾取并从不存在的第一个上下文中引用。

于 2013-07-22T09:59:43.187 回答