我有一些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背后的代码正在检查哪些角色/权限。有谁知道我可以检查哪些春季安全课程?
修改
我使用Java来配置所有内容。所以它看起来像这样:
@Configuration
@EnableGlobalMethodSecurity(securedEnabled = true, prePostEnabled = true)
public class SecurityConfigurator extends GlobalMethodSecurityConfiguration { ...
在我对以下答案的回复中,我从@Secured切换的原因是因为它没有启动我的AccessDeniedHandler。如果我可以强迫它这样做,我会坚持下去。 @PreAuthorize确实启动了处理程序。
EDIT2
正如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;
}
答案 0 :(得分:0)
为什么要使用@PreAuthorize
而不是@Secured
?我想你的@PreAuthorize
失败了,因为你没有将你的http安全性设置为使用表达式:
<http use-expressions="true">
我想如果你这样做,那么你使用哪个版本并不重要。我似乎记得有一个在SO上发帖的Spring开发人员说@Secured
是首选方法,因为它比@PreAuthorize
或某些原因更新。我怀疑@Secured
更自包含,并且不与尽可能多的Spring组件交互。如果这不起作用,请告诉我。