春季启动时自动装配

时间:2017-11-09 09:33:36

标签: spring-boot spring-security jwt spring-security-oauth2

我在JWT申请中将Spring-SecuritySpring-boot进行了整合。

@Configuration
@EnableWebSecurity
public class WebSecurity extends WebSecurityConfigurerAdapter {

@Autowired
private UserDetailsService userDetailsService;

@Autowired
private BCryptPasswordEncoder bCryptPasswordEncoder;

@Autowired
private CustomLogoutHandler logoutHandler;

@Autowired
private HttpLogoutSuccessHandler logoutSuccessHandler;

public WebSecurity( UserDetailsService userDetailsService, BCryptPasswordEncoder bCryptPasswordEncoder )
{
    this.userDetailsService = userDetailsService;
    this.bCryptPasswordEncoder = bCryptPasswordEncoder;
}

@Override
protected void configure( HttpSecurity http ) throws Exception
{
    http.csrf().disable()

            .authorizeRequests()

            .antMatchers(HttpMethod.POST, "/rest/auth/**").permitAll()

            .antMatchers("/login").permitAll()

            .antMatchers("/").permitAll()

            .antMatchers("/dist/**").permitAll()

            .antMatchers("/node_modules/**").permitAll()

            .antMatchers("/src/**").permitAll()

            .anyRequest().authenticated()

            .and()

            .logout().addLogoutHandler(logoutHandler).logoutSuccessHandler(logoutSuccessHandler)

            .and()

            .addFilter(getJWTAuthFilter())

            .addFilter(getJWTAuthorizationFilter());

    http.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS);

}

@Override
public void configure( AuthenticationManagerBuilder auth ) throws Exception
{
    auth.userDetailsService(userDetailsService).passwordEncoder(bCryptPasswordEncoder);
}

@Bean
public JWTAuthenticationFilter getJWTAuthFilter()
{
    try
    {
        return new JWTAuthenticationFilter(authenticationManager());
    }
    catch( Exception e )
    {
        return null;
    }
}

public JWTAuthorizationFilter getJWTAuthorizationFilter()
{
    try
    {
        return new JWTAuthorizationFilter(authenticationManager());
    }
    catch( Exception e )
    {
        return null;
    }
  }

}
@Bean
@Override
protected AuthenticationManager authenticationManager() throws Exception {
    return super.authenticationManager();
}

但是当我运行应用程序时,它会抛出异常消息

Error creating bean with name 'JWTAuthenticationFilter' defined in file [/Users/sandesha/Documents/BitBucket/gbi_new/webservices/target/classes/com/highpeak/gbi/webservices/security/JWTAuthenticationFilter.class]: Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: authenticationManager must be specified

如果我使用addFilter(new JWTAuthenticationFilter(authenticationManager())添加过滤器,而不是JWTAuthenticationFilter(authenticationManager(),则可以正常使用。但是当我尝试将它声明为bean时,它会抛出异常。可能是什么问题以及如何解决它。

谢谢。

修改

protected AuthenticationManager authenticationManager() throws Exception {
    if (!authenticationManagerInitialized) {
        configure(localConfigureAuthenticationBldr);
        if (disableLocalConfigureAuthenticationBldr) {
            authenticationManager = authenticationConfiguration
                    .getAuthenticationManager();
        }
        else {
            authenticationManager = localConfigureAuthenticationBldr.build();
        }
        authenticationManagerInitialized = true;
    }
    return authenticationManager;
}

修改 完成堆栈跟踪

  

org.springframework.context.ApplicationContextException:无法启动嵌入式容器;嵌套异常是org.springframework.boot.context.embedded.EmbeddedServletContainerException:无法启动嵌入式Tomcat       at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.onRefresh(EmbeddedWebApplicationContext.java:137)       在org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:536)       at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:122)       在org.springframework.boot.SpringApplication.refresh(SpringApplication.java:737)       在org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:370)       在org.springframework.boot.SpringApplication.run(SpringApplication.java:314)       在org.springframework.boot.SpringApplication.run(SpringApplication.java:1162)       在org.springframework.boot.SpringApplication.run(SpringApplication.java:1151)       在com.highpeak.gbi.webservices.Application.main(Application.java:25)   引起:org.springframework.boot.context.embedded.EmbeddedServletContainerException:无法启动嵌入式Tomcat       在org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainer.initialize(TomcatEmbeddedServletContainer.java:123)       在org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainer。(TomcatEmbeddedServletContainer.java:84)       at org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainerFactory.getTomcatEmbeddedServletContainer(TomcatEmbeddedServletContainerFactory.java:554)       at org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainerFactory.getEmbeddedServletContainer(TomcatEmbeddedServletContainerFactory.java:179)       at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.createEmbeddedServletContainer(EmbeddedWebApplicationContext.java:164)       at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.onRefresh(EmbeddedWebApplicationContext.java:134)       ...省略了8个常见帧   引起:org.springframework.beans.factory.BeanCreationException:创建名为' getJWTAuthFilter'的bean时出错在类路径资源[com / highpeak / gbi / webservices / security / WebSecurity.class]中定义:init方法的调用失败;嵌套异常是java.lang.IllegalArgumentException:必须指定authenticationManager       在org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1628)       在org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:555)       在org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:483)       at org.springframework.beans.factory.support.AbstractBeanFactory $ 1.getObject(AbstractBeanFactory.java:306)       在org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)       在org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302)       在org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:202)       at org.springframework.boot.web.servlet.ServletContextInitializerBeans.getOrderedBeansOfType(ServletContextInitializerBeans.java:234)       在org.springframework.boot.web.servlet.ServletContextInitializerBeans.addAsRegistrationBean(ServletContextInitializerBeans.java:182)       在org.springframework.boot.web.servlet.ServletContextInitializerBeans.addAsRegistrationBean(ServletContextInitializerBeans.java:177)       在org.springframework.boot.web.servlet.ServletContextInitializerBeans.addAdaptableBeans(ServletContextInitializerBeans.java:159)       在org.springframework.boot.web.servlet.ServletContextInitializerBeans。(ServletContextInitializerBeans.java:80)       at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.getServletContextInitializerBeans(EmbeddedWebApplicationContext.java:241)       at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.selfInitialize(EmbeddedWebApplicationContext.java:228)       at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.access $ 000(EmbeddedWebApplicationContext.java:89)       在org.springframework.boot.context.embedded.EmbeddedWebApplicationContext $ 1.onStartup(EmbeddedWebApplicationContext.java:213)       在org.springframework.boot.context.embedded.tomcat.TomcatStarter.onStartup(TomcatStarter.java:55)       at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5196)       在org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)       在org.apache.catalina.core.ContainerBase $ StartChild.call(ContainerBase.java:1419)       在org.apache.catalina.core.ContainerBase $ StartChild.call(ContainerBase.java:1409)       at java.util.concurrent.FutureTask.run(FutureTask.java:266)       在java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)       at java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:624)       在java.lang.Thread.run(Thread.java:748)   引起:java.lang.IllegalArgumentException:必须指定authenticationManager       在org.springframework.util.Assert.notNull(Assert.java:134)       在org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.afterPropertiesSet(AbstractAuthenticationProcessingFilter.java:164)       在org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1687)       在org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1624)       ...省略了24个常用帧   断开与目标VM的连接,地址:' 127.0.0.1:65417',transport:' socket'

使用退出代码1完成处理

0 个答案:

没有答案