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
相关产品推荐
相关产品推荐

