首页 > 解决方案 > 无效角色时如何在 api-rest grails 上返回 403

问题描述

我在 application.groovy 上有这个配置

grails.plugin.springsecurity.controllerAnnotations.staticRules = [
        [pattern: '/',                  access: ['permitAll']],
        [pattern: '/application/index', access: ['permitAll']], // show application index whithout authenticantion.
        [pattern: '/notAuthorized',     access: ['permitAll']], // permitAll to render notAuthorized json.
        [pattern: '/**',            access: ['ROLE_ADMIN', 'ROLE_OTHER']] // valid paths in api to require authentication.
]

在控制器中,我有:

FooController {

    @Secured(['ROLE_ADMIN'])
    def action1() {
        /*code*/
    }

    @Secured(['ROLE_OTHER'])
    def action2() {
        /*code*/
    }
}

当用户拥有ROLE_OTHER并尝试访问/api/foo/action1它时不允许它,这是正确的,因为他没有权限,但是返回状态是 404。我知道这些 url 不会将它们映射到没有权限的角色,但是有没有办法403代替devovler 404

标签: grailsspring-security

解决方案


取决于 Grails API 插件。BeAPI API 插件会自动检查角色并执行此操作(无需额外编码)。您只需确保将角色添加到您的架构中:

        "update": {
            "METHOD": "PUT",
            "DESCRIPTION": "Description for update",
                "ROLES": {
                "BATCH": ["ROLE_ADMIN"]
            },
            "REQUEST": {
                "ROLE_ADMIN":["firstName","passwordExpired","accountExpired","oauthProvider","username","accountLocked","password","lastName","oauthId","enabled","avatarUrl","email","id","version"]
            },
            "RESPONSE": {
                "ROLE_ADMIN":["id"]
            }
        },

哦,所以没有人阻止这个响应,我是上述插件的维护者。


推荐阅读