如何使用新的Spring Security AuthorizationManager?

ryevplcw  于 2023-05-17  发布在  Spring
关注(0)|答案(1)|浏览(372)

bounty还有5天到期。回答此问题可获得+50声望奖励。Yassine Abainou正在寻找典型答案

Spring Security将AccessDecisionManager和AccessDecisionVoter这两个类替换为AuthorizationManager。非常好。不幸的是,Spring Security团队又一次像往常一样,没有想到为新手提供有用的例子。他们为什么要这么做。似乎只要说现在做得不一样就够了。究竟如何,留给新手在无数个小时内找出答案。反正乌合之众也有足够的时间。专业人士肯定知道它是如何工作的...

我的目标是:

我想实现一个AuthorizationManager,它通过自定义投票器扩展了当前的Spring Security决策逻辑。如果抛出AccessDeniedException或AuthorizationException(至少在传统示例中,这些异常用于确定是否启动认证过程或是否调用AccessDeniedHandler),则该投票器将在ConfigAttributes的帮助下决定作为最后一个示例。
更准确地说:
我想用这样的权限注解方法,即如果用户没有登录,调用这些方法/端点将启动登录过程。任何其他操作都会自动返回404。
对于遗留类,在互联网上可以找到足够的例子。但是对于新来的来说,什么都没有-什么都没有:)。谁能告诉我在哪里可以找到自定义AuthorizationManager的实现示例,该示例考虑了现有的投票者,并实现了我自己的投票者
先谢谢你

0sgqnhkj

0sgqnhkj1#

我知道这是几个月前的事了,但我还没有在其他地方看到答案,所以我要分享我的发现:
当我阅读新文档时,看起来您将access(AuthorizationManager<T> authorizationManager)链接到URL模式的requestMatchers()调用中。AuthorizationManager<T>是一个接口,有两种方法:

default void verify(Supplier<Authentication> authentication, T object)

确定是否应授予特定authenticationobject访问权限。产品参数:authentication-要检查的AuthenticationSupplierobject-要检查的AuthorizationManager对象抛出:AccessDeniedException-如果未授予访问权限

@Nullable
AuthorizationDecision check(Supplier<Authentication> authentication, T object)

确定是否为特定的authenticationobject授予访问权限。产品参数:authentication-要检查的AuthenticationSupplierobject-要检查的AuthorizationManager
返回:AuthorizationDecision或null(如果无法做出决定)
access(...)verify(...)方法中的逻辑扩展AuthorizationManager,将其链接到RequestMatcher逻辑,看起来就是这样。
要了解它如何适应当前的架构,请看这里:www.example.com https://docs.spring.io/spring-security/reference/servlet/authorization/authorize-http-requests.html#request-authorization-architecture
作为快速总结,SecurityFilterChain中的默认最后一步是AuthorizationFilter,它从SecurityContext获取当前身份验证并将其传递给AuthorizationManager。授权管理器可以执行任何您希望做出授权决策的逻辑,然后将其传递回AuthorizationFilter。

    • 编辑以添加**再次查看,基本接口是AuthorizationManager<T>,但AuthorizationFilter的构造函数期望接收AuthorizationManager<HttpServletRequest>。您的代码最初可能会编译,但当AuthorizationManager调用T object的错误类型的方法时,您可能会得到一个异常。

相关问题