栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > 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/443220.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

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

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