如何仅使用 Apache Shiro 进行授权?
Posted
技术标签:
【中文标题】如何仅使用 Apache Shiro 进行授权?【英文标题】:How to use Apache Shiro for authorization only? 【发布时间】:2016-06-06 05:55:38 【问题描述】:在我解释这个问题之前,我应该说我们只需要 Apache Shiro 来进行授权,并且 OAuth2 已经启用了身份验证。
所以我启用 Shiro 的代码与 link here 中的代码完全相同。 我也检查了这个issue。但是对我来说,如果我启用 LifecycleBeanPostProcessor 几乎大多数 bean 都会为空。正如第二个链接中所建议的那样,我在配置类中创建了静态方法,但没有运气。
所以我的问题是,有没有办法只启用授权而不注册 shiro 过滤器?如果没有,如何解决这个问题?因为看起来 ShiroFilterFactoryBean 需要 LifecycleBeanPostProcessor 并且会破坏整个应用程序。
我们正在使用最新版本的 Spring Boot 和 Shiro 1.2.4
【问题讨论】:
如果没有过滤器,您将不得不自己完成所有操作 - 您可以查看LifecycleBeanPostProcessor
和过滤器的源代码以了解您需要实现什么。如果它只是您需要的授权,它可能不是那么糟糕。
嗯.. 我检查了代码,所以它看起来像是 AuthorizingRealm 并且我创建了自己的 AuthorizingRealm 以避免身份验证,但问题是启用后的生命周期处理器会破坏 Spring,我得到 NPE。看起来它与 Spring boot 不兼容...我仍在尝试调试这里的所有东西
我使用 shiro 并使用生命周期处理器进行引导。什么是堆栈跟踪?
Shiro 甚至 Spring 都没有错误...问题是在启动时我在使用 @ConfigurationProperties 注释的类上得到 NPE。他们都是空的
您使用的是 Gradle 还是 Maven?您是否添加了使用 ConfigurationProperties (org.springframework.build.gradle:propdeps-plugin:0.0.7) 所需的额外插件?
【参考方案1】:
正如 cmets 中的 issue 中所述,您需要在主题中设置一个已经过身份验证的身份,这可以使用 Subject.Builder() 来完成(我在这里使用的是 1.5.2 版本)。
Subject user = new Subject.Builder()
.principals(new SimplePrincipalCollection("bud", "myRealm"))
.authenticated(true)
.buildSubject();
if (user.hasRole("admin"))
// do some authorized stuff
当实现自定义领域时,可以通过从领域的支持方法返回 false 来禁用身份验证功能,如 here 所述。
【讨论】:
以上是关于如何仅使用 Apache Shiro 进行授权?的主要内容,如果未能解决你的问题,请参考以下文章
apache shiro:在 shiro.ini 中添加啥以使用 JWT 和 keycloak 作为授权服务器进行客户端身份验证
如何使用带有 LDAP 身份验证的 Apache Shiro 添加角色授权