java - 为什么 Spring Security 拦截 url 顺序很重要

标签 java spring spring-mvc spring-security

所以我有示例 Spring 安全设置,如下 -

    <security:intercept-url pattern="/accounts/search"
        access="hasAnyRole('ROLE_VIEWER')" />

    <security:intercept-url pattern="/accounts/*"
        access="hasAnyRole('ROLE_ADMIN')" />

如上所述,具有角色 ROLE_VIEWER 的用户应该能够访问 /accounts/search,而具有角色 ROLE_ADMIN 的用户也可以访问以 /accounts 开头的所有工作流程。此处,具有 ROLE_ADMIN 的用户无法访问搜索。

所以我想知道这种顺序很重要的设计的用例是什么?

如果是 Controller

@RequestMapping("/simple/*")
public @ResponseBody String simple1() {
    return "Hello world1!";
}

@RequestMapping("/simple/test")
public @ResponseBody String simple2() {
    return "Hello world2!";
}

/simple/test 将匹配对应于 simple2 而不是 simple1 的处理程序方法,无论顺序如何。

最佳答案

一般来说:一旦您在 url 模式中使用通配符,并且 url 开始匹配不同的 url 模式,那么顺序就很重要。

一个典型的用例是允许的 url 的白名单:除了一些明确定义的 url 之外,所有内容都被拒绝(或仅针对管理员)。使用 Spring Security,您通常可以这样配置白名单:

<!-- explicit allowed urls -->
<security:intercept-url pattern="/somethingAllowd" access="permitAll" />
... 

<!-- "catch all" that deny all not explicit allowed urls except for admns -->
<security:intercept-url pattern="/**" access="hasAnyRole('ROLE_ADMIN')" />

现在顺序很重要!

关于java - 为什么 Spring Security 拦截 url 顺序很重要,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34836016/

相关文章:

java - 如何使用 FreeMarker 通过 Spring Security 成功注销

java - 在 REST 中使用 DELETE 请求不是纯粹的删除

java - @Autowired BeanCreationException 与 JUnit

hibernate - 无法使用 SpringBoot 延迟初始化角色集合

java - spring mvc文件上传在gradle中不起作用

java - 如何使用 Struts2 禁用后退按钮

java - 如何使用 ASM 将 boolean 字段替换为常量值

java - java中异步进程的技术和设计

java - 根据今天的日期获取记录

java - Spring MVC 连接 2 个不同的 Web 应用程序