可能是什么问题? 当我在我的控制器中使用此注释时,它工作正常,页面只能访问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"/>
感谢您的帮助
答案 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