我最初使用@Secured表示法保护了一些Spring Controller方法

@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后面的代码正在检查哪些角色/权限。有人知道我可以检查哪些春季安全课程?

编辑

我正在使用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更新或出于某种原因。我怀疑是更独立的,不会与许多Spring组件交互。如果这不起作用,请告诉我。

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

10-11 03:34