@Secured和@PreAuthorize在Controller中工作正常但在服务级别不工作

时间:2015-03-14 11:02:09

标签: java spring spring-security

可能是什么问题? 当我在我的控制器中使用此注释时,它工作正常,页面只能访问ROLE_USER

@Secured("ROLE_USER") 

此注释也有效:

@PreAuthorize("hasRole('ROLE_USER')")

当我将相同的注释移动到我的服务时,它不起作用,该方法可以在没有ROLE_USER角色的情况下访问! 我正在测试Spring Security,我的服务只是一个测试(TestService接口及其实现),无论我是将注释放在接口还是实现级别,就好像注释不存在一样。

这是我的dispatcher-servlet.xml文件:

<security:global-method-security secured-annotations="enabled" pre-post-annotations="enabled"/>
<bean id="TestService" class="myPackage.TestServiceImpl"/>

感谢您的帮助

2 个答案:

答案 0 :(得分:0)

作为@M. Deinum said,问题是您的enable-global-method-security仅在DispatchereServlet的上下文中,而不在ContextLoaderListener中(它是另一个的父级) 。您的服务bean可能属于ContextLoaderListener上下文,您的控制器可能属于DispatchereServlet。由于@M. Deinum mentioned@Secured@PreAuthorize是基于AOP的,只能使用与enable-global-method-security相同的上下文。

TL; DR sec:enable-global-method-security添加到ContextLoaderListener的上下文(可能是web.xml中名为contextConfigLocation的参数)。

答案 1 :(得分:0)

我遇到了类似的问题,我通过注入服务/组件/存储库解决了这个问题。

我在这里有一个有效的例子: https://github.com/lfoppiano/spring-security-j2ee-preauth-example