如何仅使用 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 简介(转)

apache shiro:在 shiro.ini 中添加啥以使用 JWT 和 keycloak 作为授权服务器进行客户端身份验证

如何使用带有 LDAP 身份验证的 Apache Shiro 添加角色授权

如何使用 Apache Shiro 实现基于 JWT 令牌的身份验证机制?

Shiro-Spring 授权操作

在 Apache Shiro 中使用 ActiveDirectoryRealm 时如何搜索 ldap 字段?