正在发生一些问题。
生命周期 BeanPostProcessor
问题是由于这样的事实LifecycleBeanPostProcessor
在您的配置类中定义。既然它是一个BeanPostProcessor
它必须立即初始化才能处理所有其他 bean。此外,其余的WebSecurityConfig
需要立即初始化,因为它可能会影响LifecycleBeanPostProcessor
.
问题是自动装配功能尚不可用,因为它是BeanPostProcessor
(i.e. AutowiredAnnotationBeanPostProcessor
) 也。这意味着DataSource
一片空白。
由于它为空JdbcRealm将要抛出一个NullPointerException。这依次是被抓住AbstractAuthenticator and 被重新抛出AuthenticationException. The DefaultWebSecurityManager
(实际上它的父级DefaultSecurityManager
)然后抓住它invokes onFailedLogin这会删除“记住我”cookie。
解决BeanPostProcessor生命周期
最简单的解决方案是确保使用静态方法定义任何与基础设施相关的 bean。这通知 Spring 它不需要初始化整个配置类(即WebSecurityConfig
). Again
@Bean
public static LifecycleBeanPostProcessor lifecycleBeanPostProcessor() {
return new LifecycleBeanPostProcessor();
}
或者,您也可以在其自己的配置中隔离基础设施相关的 Bean。
UPDATE
ShiroFilterFactoryBean
我没有意识到ShiroFilterFactoryBean
实施BeanPostProcessor
还。这是一个非常有趣的案例ObjectFactory
还实施BeanPostProcessor
.
问题是,这会阻止加载 data.sql,这意味着应用程序表中没有任何用户,因此身份验证将失败。
问题是 data.sql 是通过DataSourceInitializedEvent
。然而,由于急于初始化DataSource
(这是一个依赖项BeanPostProcessor
) the DataSourceInitializedEvent
不能被解雇。这就是您在日志中看到以下内容的原因:
无法发送事件以完成数据源初始化(ApplicationEventMulticaster 未初始化)
确保 data.sql 加载
我看到有几个选项可以加载插入语句。
数据.sql->模式.sql
最简单的选择是将 data.sql 的内容移动到 schema.sql。 schema.sql 仍会加载,因为它不需要触发事件来处理它。 data.sql 需要一个事件,以便在 JPA 初始化架构时可以使用相同的机制来加载数据。
修复排序
不幸的是,你不能简单地定义ShiroFilterFactoryBean
静态的,因为它依赖于其他 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);