4

目前我试图弄清楚 Spring Security 如何评估给定的 URL、表达式和注释。到目前为止,它似乎总是从头security-context.xml开始检查条目。如果是denyAll这样,它将简单地停止对请求的进一步处理。

也许我忘了设置一些配置选项,但是(在我看来)不可能使用 Spring Security 的注释(如 、 等)建立一个好的白@Secured名单@PermitAll

我想要的基本上是注释 a 中的方法@Controller允许访问。例如:

@Controller
@RequestMapping("/test")
public MyController {
    @RequestMapping("")
    public void tryToGetSomething() {
      // no security annotation -> denyAll
    }

    @RequestMapping("/public")
    @PermitAll
    public void tryToGetSomethingPublic() {
      // this will always have access allowed
    }

    @RequestMapping("/admin")
    @Secured({"ROLE_ADMIN"})
    public void tryToGetSomethingReallyImportant() {
      // this can only be accessed by admins
    }
}

这种方法的主要原因是:安全性;-)。在编写代码时总是有可能忘记一些注释。使用这种方法,这样的错误不会影响敏感数据的安全性。

所以我的问题是:我怎样才能做到这一点?

4

2 回答 2

0

您可以尝试将安全切入点与注释结合使用:

<global-method-security pre-post-annotations="enabled">
    <!-- Disable access to all controller methods -->
    <protect-pointcut expression="execution(* com.mycompany.controllers.*Controller.*(..))"
         access="ROLE_THAT_DOES_NOT_EXIST"/>
</global-method-security>
@Controller
@RequestMapping("/test")
public MyController {

    @RequestMapping("")
    public void tryToGetSomething() {
      // pointcut rule -> no one has ROLE_THAT_DOES_NOT_EXIST -> no one can call this code
    }

    @RequestMapping("/public")
    @PreAuthorized("permitAll")
    public void tryToGetSomethingPublic() {
      // annotations take precedence over pointcuts, so anyone can call this code due to @PreAuthorized("permitAll") rule
    }
}

请参阅官方文档中的相应条目。也许您可以使用denyAll而不是ROLE_THAT_DOES_NOT_EXIST.

希望这可以帮助。

于 2013-07-17T13:21:23.077 回答
0

我试图达到同样的效果,但问题是方法安全级别适用于通过 AOP 调用的每个方法。如果您默认拒绝访问,您将不得不注释几乎所有内容:)

使用基于 URL 的安全性,您可以通过白名单继续:

@Override
protected void configure(HttpSecurity http) throws Exception {
    http.anyRequest().denyAll();
}

不幸的是,明显的缺点是每个 URL 都必须在这里获得授权,从而产生了一种依赖磁铁。但也许集中 URL 路径映射是件好事?

于 2015-02-19T10:56:42.900 回答