![](/img/trans.png)
[英]@PreAuthorize("hasRole('ROLE_ADMIN')") is throwing Forbidden
[英]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.