Spring MVC,方法级安全性

时间:2013-12-15 11:16:14

标签: spring spring-mvc spring-security

我正在尝试根据用户角色限制对我的控制器的访问。现在,我可以使用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文件中编写访问代码我想从控制器控制它。

我该怎么做?

1 个答案:

答案 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?)