将Spring security Java Config添加到Spring Config中



我最近正在开发一个spring应用程序,我想在我的应用程序中添加spring安全性。

我有一个简单的页面包含一个登录表单工作像一个魅力,但当我想添加春季安全配置到应用程序我得到一个错误。

下面是我的SecurityConfig文件的代码:

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
/*@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
    auth
            .inMemoryAuthentication()
            .withUser("user").password("password").roles("USER");
}*/
@Override
protected void configure(HttpSecurity http) throws Exception {
    http
          .authorizeRequests()
            /*.antMatchers("/infermier*//**").hasRole("INFERMIER")
            .antMatchers("/docteur*//**").hasRole("DOCTEUR")
            .antMatchers("/user*//**").hasRole("USER")*/
            .anyRequest().authenticated()
          .and()
            .formLogin()
            .loginProcessingUrl("/login")
            .permitAll();
}
}

日志如下:

Error invoking ServletContainerInitializer org.springframework.web.SpringServletContainerInitializer
java.lang.NoClassDefFoundError: org/springframework/security/config/annotation/web/configuration/WebSecurityConfigurerAdapter
    at java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClass(ClassLoader.java:760)
    at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
    at org.glassfish.web.loader.WebappClassLoader.findClass(WebappClassLoader.java:1183)
    at org.glassfish.web.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1728)
    at org.glassfish.web.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1611)
    at configuration.WebInitializer.getRootConfigClasses(WebInitializer.java:12)
    at org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer.createRootApplicationContext(AbstractAnnotationConfigDispatcherServletInitializer.java:50)
    at org.springframework.web.context.AbstractContextLoaderInitializer.registerContextLoaderListener(AbstractContextLoaderInitializer.java:57)
    at org.springframework.web.context.AbstractContextLoaderInitializer.onStartup(AbstractContextLoaderInitializer.java:47)
    at org.springframework.web.servlet.support.AbstractDispatcherServletInitializer.onStartup(AbstractDispatcherServletInitializer.java:66)
    at org.springframework.web.SpringServletContainerInitializer.onStartup(SpringServletContainerInitializer.java:175)
    at org.apache.catalina.core.StandardContext.callServletContainerInitializers(StandardContext.java:5997)
    at com.sun.enterprise.web.WebModule.callServletContainerInitializers(WebModule.java:774)
    at org.apache.catalina.core.StandardContext.start(StandardContext.java:5895)
    at com.sun.enterprise.web.WebModule.start(WebModule.java:691)
    at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:1041)
    at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:1024)
    at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:747)
    at com.sun.enterprise.web.WebContainer.loadWebModule(WebContainer.java:2278)
    at com.sun.enterprise.web.WebContainer.loadWebModule(WebContainer.java:1924)
    at com.sun.enterprise.web.WebApplication.start(WebApplication.java:139)
    at org.glassfish.internal.data.EngineRef.start(EngineRef.java:122)
  Startup of context /servicemed failed due to previous errors]]
[2014-08-13T12:57:16.429+0100] [glassfish 4.0] [SEVERE] [AS-WEB-CORE-00175] [javax.enterprise.web.core] [tid: _ThreadID=37 _ThreadName=admin-listener(4)] [timeMillis: 1407931036429] [levelValue: 1000] [[
  Exception during cleanup after start failed
org.apache.catalina.LifecycleException: Manager has not yet been started
    at org.apache.catalina.session.StandardManager.stop(StandardManager.java:934)
    at org.apache.catalina.core.StandardContext.stop(StandardContext.java:6099)
    at com.sun.enterprise.web.WebModule.stop(WebModule.java:720)
    at org.apache.catalina.core.StandardContext.start(StandardContext.java:5916)
    at com.sun.enterprise.web.WebModule.start(WebModule.java:691)
    at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:1041)
    at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:1024)
    at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:747)
    at com.sun.enterprise.web.WebContainer.loadWebModule(WebContainer.java:2278)
    at com.sun.enterprise.web.WebContainer.loadWebModule(WebContainer.java:1924)
    at com.sun.enterprise.web.WebApplication.start(WebApplication.java:139)
    at org.glassfish.internal.data.EngineRef.start(EngineRef.java:122)
org.apache.catalina.LifecycleException: org.apache.catalina.LifecycleException: java.lang.NoClassDefFoundError: org/springframework/security/config/annotation/web/configuration/WebSecurityConfigurerAdapter
    at org.apache.catalina.core.StandardContext.start(StandardContext.java:5920)
    at com.sun.enterprise.web.WebModule.start(WebModule.java:691)
    at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:1041)
    at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:1024)
    at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:747)
    at com.sun.enterprise.web.WebContainer.loadWebModule(WebContainer.java:2278)
    at com.sun.enterprise.web.WebContainer.loadWebModule(WebContainer.java:1924)
    at com.sun.enterprise.web.WebApplication.start(WebApplication.java:139)
    at org.glassfish.internal.data.EngineRef.start(EngineRef.java:122)

PS:我把它添加到MVCInitializer:

@Override
    protected Class<?>[] getRootConfigClasses() {
        return new Class[] { AppConfig.class,SecurityConfig.class};
    }

确保在类路径中有spring-security-config。显然,它在运行时丢失了。

在这种情况下,在运行应用程序之前运行mvn clean install可以解决问题。

java.lang。NoClassDefFoundError……这意味着在您的类路径中没有找到名称为XYZ的类。将spring-security-config.jar添加到类路径中

@idursun给了我一个解决方案和一个很好的解释,我所做的配置没有任何问题(它实际上后来工作了),问题是目标文件夹搞砸了,所以我用maven项目工具清理了它,并重新安装了所有的东西(使用相同的工具),瞧,一切都很好

这是一个错误的maven项目打包类型,在我的情况下:

<packaging>pom</packaging>
不是

<packaging>war</packaging>

最新更新