gpt4 book ai didi

java - 我如何检查 @PreAuthorize 正在查看哪些角色?

转载 作者:太空宇宙 更新时间:2023-11-04 06:49:20 26 4
gpt4 key购买 nike

我有一些 Spring Controller 方法,最初使用 @Secured 表示法进行保护

@Secured("Role_Admin")
public void dummyMethod(HttpServletRequest request) ...

如果用户没有该角色(如预期的那样),它将很好地识别该角色,或者拒绝。但是,我尝试切换为使用 @PreAuthorize 注释,现在一切都被拒绝。

@PreAuthorize("hasRole('Role_Admin')")
public void dummyMethod(HttpServletRequest request) ...

如果我删除 @PreAuthorize 注释并执行某些操作,请说

request.isUserInRole("Role_Admin")

这将返回 true。如果我留下注释,然后检查用户的角色在访问被拒绝处理程序中,我可以看到“Role_Admin”权限已授予用户。

所以我不太确定 @PreAuthorize 背后的代码正在检查哪些角色/权限。有谁知道我可以检查哪些 Spring 安全类?

编辑

我使用 Java 来配置一切。所以它看起来像这样:

@Configuration
@EnableGlobalMethodSecurity(securedEnabled = true, prePostEnabled = true)
public class SecurityConfigurator extends GlobalMethodSecurityConfiguration { ...

在我对下面答案的回复中,我从 @Secured 切换的原因是因为它没有启动我的 AccessDeniedHandler。如果我能强制它这样做,我会坚持下去。 @PreAuthorize 确实启动了处理程序。

编辑2

正如 Andrei 所指出的,我尝试在我的配置中定义它。但这并没有什么区别。

@Bean
public SimpleMappingExceptionResolver resolver() {
SimpleMappingExceptionResolver resolver = new SimpleMappingExceptionResolver();

resolver.setExcludedExceptions(AccessDeniedException.class);

Properties mappings = new Properties();
mappings.put("org.springframework.web.servlet.PageNotFound", "p404");
mappings.put("org.springframework.dao.DataAccessException", "dataAccessFailure");
mappings.put("org.springframework.transaction.TransactionException", "dataAccessFailure");

resolver.setExceptionMappings(mappings);

return resolver;
}

最佳答案

为什么要使用@PreAuthorize而不是@Secured?我想您的 @PreAuthorize 失败是因为您尚未将 http 安全性设置为使用表达式:

<http use-expressions="true">

我想如果您这样做,那么您使用哪个版本都无关紧要。我似乎记得一位在 SO 上发帖的 Spring 开发人员说 @Secured 是首选方法,因为它比 @PreAuthorize 更新或类似的原因。我怀疑 @Secured 更加独立,并且不与那么多 Spring 组件交互。如果这不起作用,请告诉我。

关于java - 我如何检查 @PreAuthorize 正在查看哪些角色?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23554338/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com