我正在尝试根据用户角色限制对我的控制器的访问。现在,我可以使用security.xml文件以下列方式执行此操作
<http use-expressions="true">
<intercept-url pattern="/**" access="hasRole([ROLE_ADMIN,ROLE_USER])" />
</http>
但我不想这样做。相反,我会写
<http use-expressions="true">
<intercept-url pattern="/**" access="isAuthenticated()"/>
</http>
并在控制器中
@RequestMapping("/test")
@PreAuthorize("hasRole('ROLE_USER')")
public String test() {
return "test";
}
@RequestMapping("/testadmin")
@PreAuthorize("hasRole('ROLE_ADMIN')")
public String testAdminPage() {
return "testadmin";
}
现在ROLE_USER可以访问(ROLE_ADMIN和ROLE_ USER)标记的控制器。这就是问题。
并且基于此testadmin.jsp
只能由ROLE_ADMIN类型用户查看,而test.jsp
只能由“ROLE_USER”类型用户查看。
总结而不是在xml文件中编写访问代码我想从控制器控制它。
我该怎么做?
答案 0 :(得分:4)
您必须通过
启用方法级安全性<global-method-security pre-post-annotations="enabled"/>
然后您的弹簧控制器将被代理,并且将评估PreAuthorize
注释。
可在此处找到更多信息(第16.3节):
http://docs.spring.io/spring-security/site/docs/current/reference/el-access.html
编辑:
我猜你的Controller
bean是在Disptacher Servlet(网络环境)中创建的,而你的安全配置是在root-context中 - &gt;控制器将不受BeanPostProcessor
的影响,因此您必须将<global-method-security>
标记放在Web上下文配置中(dispatcher-servlet.xml?)