spring-security Spring Security在配置中有角色('ROLE_ADMIN'),并且@PreAuthorize(“permitAll”)不起作用?

gr8qqesn  于 2022-11-11  发布在  Spring
关注(0)|答案(3)|浏览(560)

我正在尝试锁定我的整个应用程序,除了一个特定的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());
    }

}

然而,它并没有像预期的那样工作。
如果我交换条件,并且在config中有permitAll,在注解中有hasRole(),它会按预期工作--但我试图实现相反的效果。
如有任何建议,我们将不胜感激!

qltillow

qltillow1#

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

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

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

@EnableGlobalMethodSecurity(prePostEnabled = true)
ogq8wdun

ogq8wdun2#

它与问题spring security 3 - Setting up a customized login非常相似,如果您将所有访问权限(模式/**)限制为role_admin,那么/product上的permitAll将如何工作?解决方案是提供/product上的IS_AUTHENTICATED_ANONYMOUSLY访问权限。

qnzebej0

qnzebej03#

来自@预授权和拦截URL优先级:
<intercept-url>...优先于(@PreAuthorize)注解。[,因为] <intercept-url>在URL级别工作,而注解在方法级别工作。
因此,您的问题的解决方案(除了@PreAuthorize注解之外)必须在您的安全配置中解决。
您必须在/**拦截url模式之前使用permitAll(或anonymous..)* 声明/prodcuts/json拦截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:
当针对传入请求匹配指定的模式时,* 匹配是按照元素声明的顺序进行的。因此,最具体的模式应该放在最前面,最一般的模式应该放在最后

相关问题