我最初使用@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/