@PreAuthorize注释不起作用的弹簧安全性

我发现了许多类似的问题,但没有一个问题解决了。 我的问题是ROLE_USER可以访问ROLE_ADMINfunction

我的spring-security.xml代码如下。

                 

当我添加我的代码显示资源未找到错误,当我删除我的代码执行成功但ROLE_USER可以访问ROLE_ADMIN函数

我的控制器function是。

 @PreAuthorize("hasRole('ROLE_ADMIN')") @RequestMapping(value="/delete", method = RequestMethod.GET) public String DeleteAll(ModelMap model, Principal principal ) { org.springframework.security.core.userdetails.User activeUser = (org.springframework.security.core.userdetails.User)SecurityContextHolder.getContext().getAuthentication().getPrincipal(); System.out.println("Active user is "+activeUser.getUsername()+"Authorities are "+activeUser.getAuthorities()); return "deleteUsers"; } 

你应该有

  

如果您想要@PreAuthorize注释工作。


回答评论:

看起来你错过了spring-aop依赖。

如果你正在使用maven,你需要:

  org.springframework spring-aop ${org.springframework.version}  

如果没有,你可以从这里拿到jar子。

如果您使用的是XML配置,请不要忘记添加以下属性:

如果您使用的是Java配置,请不要忘记添加以下注释:

@EnableGlobalMethodSecurity(prePostEnabled = true)

我面临同样的问题。 当我将下面的元素从applicationContext.xml移动到* -servlet.xml(我的调度程序的配置xml)时,我的问题解决了。

  

您必须在调度程序的xml上包含此元素,而不是在应用程序的xml上
Spring FAQ

试试@Secured注释,

然后你会有

 @Secured("ROLE_ADMIN") @RequestMapping(value="/delete", method = RequestMethod.GET) public String DeleteAll(ModelMap model, Principal principal ) { ... } 

这是一篇关于它的详细博客文章 。

上述答案都没有对我有用。 我不得不去添加安全装饰器的路线。

装饰器放在文件servlet-context.xml bean上。

首先将安全模式添加到XML命名空间:

  

然后将装饰器应用于服务bean的实现,就像这样..

       

我在使用注释时遇到了同样的问题,问题是我的控制器中没有@Controller注释。


所以你似乎需要:

  • Spring Security配置中的这些注释:

     @Configuration @EnableWebSecurity @EnableGlobalMethodSecurity(prePostEnabled = true) 
  • 控制器中的这些注释:

     @Controller public class ServiceRS { @RequestMapping(value = "/admin", method = RequestMethod.GET) @PreAuthorize("hasAuthority('ROLE_ADMIN')") public void wsAdmin() { [...] } } 

另外,如果您仍然遇到问题,请考虑将其添加到log4j2配置中:

      

您将在日志中看到Spring是否考虑了您的注释:

 TRACE org.springframework.security.access.prepost.PrePostAnnotationSecurityMetadataSource {} [main] Looking for Pre/Post annotations for method 'wsAdmin' on target class '***.ServiceRS' DEBUG org.springframework.security.access.prepost.PrePostAnnotationSecurityMetadataSource {} [main] @org.springframework.security.access.prepost.PreAuthorize(value=hasAuthority('ROLE_ADMIN')) found on specific method: public void ***.ServiceRS.wsAdmin() DEBUG org.springframework.security.access.method.DelegatingMethodSecurityMetadataSource {} [main] Caching method [CacheKey[***.ServiceRS; public void ***.ServiceRS.wsAdmin()]] with attributes [[authorize: 'hasAuthority('ROLE_ADMIN')', filter: 'null', filterTarget: 'null']] 

显然,您可以考虑在org.springframework.security.access.expression.SecurityExpressionRoot中的相应方法中添加断点,以查看是否对注释中的条件进行了调用。

问候。

这可能对您有所帮助:

  

问候。

使用带有Web异步支持的Servlet 3时会出现此问题。 一旦进入Callable方法的匿名方法,Spring Security 3.1.4及更低版本就会丢失其安全上下文。

将Spring Security升级到3.2.0 RC1将解决您的问题。

Maven依赖:

   org.springframework.security spring-security-web 3.2.0.RC1   org.springframework.security spring-security-config 3.2.0.RC1     spring-milestones Spring Milestones http://repo.spring.io/milestone  false      spring-milestones Spring Milestones http://repo.spring.io/milestone  false    

将标记放在另一个spring配置文件中,而不是spring安全配置文件中。

我也得到了同样的错误。