有几个正在发生的问题。
LifecycleBeanPostProcessor
问题是由于
LifecycleBeanPostProcessor在config类中定义的事实。由于它是a,
BeanPostProcessor因此必须将其初始化以处理所有其他bean。此外,
WebSecurityConfig由于可能会影响其余的需求,因此必须对其进行初始化
LifecycleBeanPostProcessor。
问题在于自动装配功能尚不可用,因为它也是一个
BeanPostProcessor(即
AutowiredAnnotationBeanPostProcessor)。这意味着
DataSource值为null。
由于它为null,
JdbcRealm因此将抛出
NullPointerException。反过来,它被捕获
AbstractAuthenticator并重新抛出
AuthenticationException。在
DefaultWebSecurityManager(实际上它的父
DefaultSecurityManager),然后捕获它调用
onFailedLogin它消除了“记住我”的cookie。
解决LifecycleBeanPostProcessor
最简单的解决方案是确保使用静态方法定义任何与基础架构相关的bean。这通知Spring不需要初始化整个配置类(即
WebSecurityConfig)。再次
@Beanpublic static LifecycleBeanPostProcessor lifecycleBeanPostProcessor() { return new LifecycleBeanPostProcessor();}另外,您还可以在其自己的配置中隔离与基础结构相关的Bean。
更新
ShiroFilterFactoryBean
我也没意识到那个
ShiroFilterFactoryBean工具
BeanPostProcessor。
ObjectFactory也可以实施一个非常有趣的情况
BeanPostProcessor。
问题在于这阻止了data.sql的加载,这意味着应用程序在表中没有任何用户,因此身份验证将失败。
问题是data.sql是通过加载的
DataSourceInitializedEvent。但是,由于急切的初始化
DataSource(这是a的依赖项
BeanPostProcessor),
DataSourceInitializedEvent因此无法触发。这就是为什么您在日志中看到以下内容的原因:
无法发送事件以完成数据源初始化(未初始化ApplicationEventMulticaster)
确保data.sql加载
我看到有一些选项可以使insert语句加载。
data.sql-> schema.sql
最简单的选项是将data.sql的内容移动到schema.sql。schema.sql仍处于加载状态,因为它不需要触发事件来处理它。data.sql需要一个事件,以便在JPA初始化架构时可以使用相同的机制来加载数据。
整理订单
不幸的是,您不能简单地为
ShiroFilterFactoryBeanstatic
定义,因为它依赖于其他bean定义。幸运的是,
BeanPostProcessor在这种情况下,确实不需要。这意味着您可以更改代码以返回工厂bean的结果,该结果
BeanPostProcessor将从等式中删除:
@Bean(name = "shiroFilter")public AbstractShiroFilter shiroFilter() throws Exception { ShiroFilterFactoryBean shiroFilter = new ShiroFilterFactoryBean(); Map<String, String> filterChainDefinitionMapping = new HashMap<>(); filterChainDefinitionMapping.put("/api/health", "authc,roles[guest],ssl[8443]"); filterChainDefinitionMapping.put("/login", "authc"); filterChainDefinitionMapping.put("/logout", "logout"); shiroFilter.setFilterChainDefinitionMap(filterChainDefinitionMapping); shiroFilter.setSecurityManager(securityManager()); shiroFilter.setLoginUrl("/login"); Map<String, Filter> filters = new HashMap<>(); filters.put("anon", new AnonymousFilter()); filters.put("authc", new FormAuthenticationFilter()); LogoutFilter logoutFilter = new LogoutFilter(); logoutFilter.setRedirectUrl("/login?logout"); filters.put("logout", logoutFilter); filters.put("roles", new RolesAuthorizationFilter()); filters.put("user", new UserFilter()); shiroFilter.setFilters(filters); return (AbstractShiroFilter) shiroFilter.getObject();}插入用户
在data.sql中找到的insert语句不正确。它需要包括
enabled列。例如:
insert into users values ('admin', '22f256eca1f336a97eef2b260773cb0d81d900c208ff26e94410d292d605fed8',true);


