2013-07-17 55 views
3

目前我试图找出Spring Security如何评估给定的URL,表达式和注释。到目前为止,它似乎总是首先检查来自security-context.xml的条目。如果这是一个denyAll它只会停止进一步处理请求。使用注释和全局拒绝Spring安全白名单的方法全部

也许我忘了设置一些配置选项,但在我的眼中,使用Spring Security的注释(如@Secured@PermitAll等)无法构建漂亮的白名单。

我想要的基本上是注释@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 
    } 
} 

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

所以我的问题是:我该如何做到这一点?

回答

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 
    } 
} 

corresponding entry从官方文档。也许你可以使用denyAll而不是ROLE_THAT_DOES_NOT_EXIST

希望这会有所帮助。

+1

看起来很有趣,我会检查一下。但首先我必须弄清楚,如何在Spring Security javaconfig中使用切入点。我会稍后再报告。 –

+0

每一个都会变得这样吗? –

+0

@BenjaminM:凹凸! – yjo

0

我试图实现相同的,但问题是方法安全级别适用于通过AOP调用的每个方法。如果您拒绝默认访问,您将必须标注几乎所有:)

使用基于URL的安全性,可以通过白名单进行:

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

明显的缺点,不幸的是,每一个URL必须在这里授权,创造一种依赖磁铁。但是,集中URL路径映射也许是一件好事情?