使用 Grails spring security rest 插件的不足_scope 错误

Posted

技术标签:

【中文标题】使用 Grails spring security rest 插件的不足_scope 错误【英文标题】:insufficient_scope error using Grails spring security rest plugin 【发布时间】:2016-03-03 10:48:11 【问题描述】:

我有一个使用 Spring Security 的标准 grails Web 应用程序,我想使用 spring-security-rest 插件(版本 1.5.1)将其中的一小部分作为 REST API 公开。一切似乎都设置正确,但我提出的任何请求都会返回 403 错误,提示“insufficient_scope”。任何文档中都没有关于此的内容,所以我希望有人可以提供帮助。这是我使用 Grails 2.4.4 的设置:

config.groovy:

grails.plugin.springsecurity.filterChain.chainMap = [
        '/api/**': 'JOINED_FILTERS,-exceptionTranslationFilter,-authenticationProcessingFilter,-securityContextPersistenceFilter,-rememberMeAuthenticationFilter',  // Stateless chain
        '/**': 'JOINED_FILTERS,-restTokenValidationFilter,-restExceptionTranslationFilter'                                                                          // Traditional chain
]
grails.plugin.springsecurity.ui.register.defaultRoleNames = ['ROLE_USER']
grails.plugin.springsecurity.logout.postOnly = false

grails.plugin.springsecurity.userLookup.userDomainClassName = 'com.luncho.UserLuncho'
grails.plugin.springsecurity.userLookup.authorityJoinClassName = 'com.luncho.UserLunchoRole'
grails.plugin.springsecurity.authority.className = 'com.luncho.Role'
grails.plugin.springsecurity.controllerAnnotations.staticRules = [
        '/':                ['ROLE_USER'],
        '/user/create':           ['ROLE_ADMIN'],
        '/register/*':           ['permitAll'],
        '/login/*':       ['permitAll'],
        '/logout/*':       ['permitAll'],
        '/index.gsp':       ['permitAll'],
        '/plugins/**':       ['permitAll'],
        '/assets/**':       ['permitAll'],
        '/**/js/**':        ['permitAll'],
        '/**/css/**':       ['permitAll'],
        '/**/images/**':    ['permitAll'],
        '/**/favicon.ico':  ['permitAll'],
        '/restaurant/**':           ['ROLE_USER']
]

我可以很好地进行身份验证,并且我确实取回了不记名令牌。但是,以下 curl 命令(使用真实令牌代替“my_token”)总是会返回一个不足的_scope 错误:

curl -i http://localhost:8080/lunchoweb/api/restaurant -H "Authorization: Bearer my_token"

还值得注意的是,控制器方法包含在名为 RestaurantAPIController 的单独控制器中。现在很简单:

class RestaurantAPIController 
    def getAllRestaurants() 
        render Restaurant.findAll() as JSON
    

使用 URL 映射:

// REST end points
"/api/restaurant" 
    controller="restaurantAPI"
    action = "getAllRestaurants"

什么给了?

【问题讨论】:

【参考方案1】:

您在此处没有对“/api/**”范围的引用。

'/restaurant/**':           ['ROLE_USER']

应该是

'/api/restaurant/**':           ['ROLE_USER']

【讨论】:

在没有看到日志的情况下,我敢打赌 Raz 所说的。有关插件的更多问题,请确保您也发布调试输出:alvarosanchez.github.io/grails-spring-security-rest/latest/docs/… 确认!我知道它必须像那样简单。感谢您的帮助。 另外我们可以使用@Secured("ROLE_ADMIN") 来保护控制器。

以上是关于使用 Grails spring security rest 插件的不足_scope 错误的主要内容,如果未能解决你的问题,请参考以下文章

Grails - grails-spring-security-rest - 无法从 application.yml 加载 jwt 机密

使用 Spring Security Grails 插件编码密码

Grails + spring-security-core:用户登录后如何分配角色?

在 Grails 中使用 Pre/Post Spring-Security Annotations

Grails 3.0 和 Spring Security

通过 Spring Security 配置 Grails 配置插件 grails-ckeditor