繁体   English   中英

配置中的 Spring Security hasRole('ROLE_ADMIN') 和 @PreAuthorize("permitAll") 不起作用?

[英]Spring Security hasRole('ROLE_ADMIN') in config and @PreAuthorize("permitAll") not working?

我试图锁定我的整个应用程序,除了特定的 URL/方法。

这是我的applicationContext-security.xml

<global-method-security pre-post-annotations="enabled"/>
<http use-expressions="true">
    <http-basic/>
    <intercept-url pattern="/**" access="hasRole('ROLE_ADMIN')" />
    <logout logout-success-url="/products" />
</http>

这是带有注释的类:

@RooWebScaffold(path = "products", formBackingObject = Product.class)
@RequestMapping("/products")
@Controller

public class ProductController {

    @RequestMapping(value="/json", headers = "Accept=application/json")
    @ResponseBody
    @PreAuthorize("permitAll")
    public String listJson() {
        return Product.toJsonArray(Product.findAllProducts());
    }

}

但是,它没有按预期工作。

如果我周围的交换条件,并有permitAll在配置和hasRole()在它按预期工作注释-但我想实现逆转。

任何建议将不胜感激!

如果您使用 XML 配置,请不要忘记添加以下属性:

      <s:global-method-security pre-post-annotations="enabled"/>

如果您使用的是 Java 配置,请不要忘记添加以下注释:

       @EnableGlobalMethodSecurity(prePostEnabled = true)

它几乎类似于问题spring security 3 - 设置自定义登录,如果您将所有访问权限(模式 /**)限制为 role_admin,那么 /product 上的 permitAll 将如何工作? 解决方案是在 /product 上提供 IS_AUTHENTICATED_ANONYMOUSLY 访问。

来自@PreAuthorize 和intercept-url priority

<intercept-url> ... 优先于 ( @PreAuthorize ) 注释。 [, 因为] <intercept-url>在 URL 级别和方法级别的注释工作。


因此,您的问题的解决方案( @PreAuthorize注释除外)必须在您的安全配置中解决。

您必须/**拦截 url 模式之前声明/prodcuts/json permitAll /prodcuts/json使用permitAll (或匿名..)拦截 url,例如:

...
<intercept-url pattern="/products/json" access="permitAll" />
<intercept-url pattern="/**" access="hasRole('ROLE_ADMIN')" />
...

https://docs.spring.io/spring-security/site/docs/current/reference/htmlsingle/#nsa-intercept-url

将指定的模式与传入的请求进行匹配时,将按照元素声明顺序进行匹配 所以最具体的模式应该放在最前面,最通用的应该放在最后

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM