You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Grails 5中Spring Security插件@Secured与defaultAction兼容问题

问题原因与解决方案

这是Grails Spring Security Core插件处理defaultAction时的一个典型行为:当直接访问控制器根路径(如/secure)时,路由机制会直接映射到defaultAction指定的方法,但插件的方法级@Secured注解校验未在路由完成前触发,导致绕过了权限检查;而访问/secure/list时,请求直接匹配方法路径,注解校验能正常生效。

以下是几种可行的解决方案:

1. 显式添加带权限注解的index方法(你已验证的方案)

为控制器添加index方法并标注权限,内部重定向到list,确保根路径访问时先经过权限校验:

class SecureController {
    @Secured('ROLE_ADMIN')
    def index() {
        redirect(action: 'list')
    }

    @Secured('ROLE_ADMIN')
    def list() {
        // 业务逻辑代码
    }
}

2. 使用URL映射配置全局权限

在grails-app/controllers/UrlMappings.groovy中,为控制器根路径和方法路径分别添加权限约束,从URL层面统一控制访问权限:

class UrlMappings {
    static mappings = {
        // 控制控制器根路径访问权限
        "/secure"(controller: 'secure') {
            constraints {
                access("ROLE_ADMIN")
            }
        }
        // 控制list方法路径访问权限
        "/secure/list"(controller: 'secure', action: 'list') {
            constraints {
                access("ROLE_ADMIN")
            }
        }
        // 其他URL映射规则...
    }
}

3. 控制器类级别添加@Secured注解

如果整个SecureController的所有方法都需要ROLE_ADMIN权限,直接在类上标注注解,所有路径(包括根路径和方法路径)都会继承权限校验:

@Secured('ROLE_ADMIN')
class SecureController {
    static defaultAction = "list"

    def list() {
        // 业务逻辑代码
    }
}

内容的提问来源于stack exchange,提问作者MKB

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 20:34:59