【问题标题】:Spring MVC, Method level securitySpring MVC,方法级安全性
【发布时间】:2014-01-02 20:05:40
【问题描述】:

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

我该怎么做??

【问题讨论】:

  • 究竟什么不起作用?
  • ROLE_USER 可以访问两个(ROLE_ADMIN 和 ROLE_USER)标记的控制器。这就是问题

标签: spring spring-mvc spring-security


【解决方案1】:

您必须通过

启用方法级别的安全性
<global-method-security pre-post-annotations="enabled"/>

然后你的 spring 控制器将被代理,PreAuthorize 注释将被评估。

可在此处找到更多信息(第 16.3 节):

http://docs.spring.io/spring-security/site/docs/current/reference/el-access.html

编辑:

我猜你的 Controller bean 是在 Disptacher Servlet(网络上下文)中创建的,并且你的安全配置在根上下文中 -> 控制器将不受 BeanPostProcessor 的影响,所以你必须把&lt;global-method-security&gt;tag 在 web 上下文配置中 (dispatcher-servlet.xml?)

【讨论】:

  • 我已经试过了,这不起作用。如果我这样做,任何类型的认证用户都可以查看任何控制器。 ROLE_USER 可以访问带有 ROLE_ADMIN 标记的控制器。
  • 是的,你是对的,我必须放入网络上下文配置中。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-03-03
  • 2015-10-21
  • 2020-02-21
  • 2015-03-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多