栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

具有JavaConfig和Spring Boot的Apache Shiro JdbcRealm

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

具有JavaConfig和Spring Boot的Apache Shiro JdbcRealm

有几个正在发生的问题。

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初始化架构时可以使用相同的机制来加载数据。

整理订单

不幸的是,您不能简单地为

ShiroFilterFactoryBean
static
定义,因为它依赖于其他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);


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/454630.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号