简体   繁体   English

Grails Spring Security OAuth2提供者对具有正确承载令牌的资源的请求重定向到登录

[英]Grails spring security oauth2 provider request for resource with correct bearer token redirects to login

As the title implies, I have a controller method protected by the oAuth2 plugin, but when I send a request to it including a correct Authorization: Bearer <token> (using Postman), the response I get is the HTML for the login page. 顾名思义,我有一个受oAuth2插件保护的控制器方法,但是当我向它发送包含正确授权的请求:Bearer <token>(使用Postman)时,得到的响应是登录页面的HTML。

Method in question: 有问题的方法:

@Secured(["ROLE_USER", "#oauth2.clientHasAnyRole('ROLE_CLIENT', 'ROLE_TRUSTED_CLIENT')"])
    def getUserData(){
        response.setContentType("application/json")
        User u = springSecurityService.currentUser
        println u
        render u.mseUserInfo
    }

Config.groovy: Config.groovy中:

// Added by the Spring Security Core plugin:
grails.plugin.springsecurity.auth.loginFormUrl = '/mse/login'

grails.plugin.springsecurity.userLookup.userDomainClassName = 'cz.improvisio.MSEauthProvider.user.User'
grails.plugin.springsecurity.userLookup.authorityJoinClassName = 'cz.improvisio.MSEauthProvider.user.UserRole'
grails.plugin.springsecurity.authority.className = 'cz.improvisio.MSEauthProvider.user.Role'
grails.plugin.springsecurity.controllerAnnotations.staticRules = [
    '/oauth/authorize.dispatch':[
        "ROLE_USER",
        "isFullyAuthenticated()"
    ],
    '/oauth/token.dispatch':[
        "ROLE_USER",
        "isFullyAuthenticated()"
    ],
    '/mse/login':["permitAll"],
    '/mse/':["permitAll"],
    '/**':["permitAll"]]



// Added by the Spring Security OAuth2 Provider plugin:
grails.plugin.springsecurity.oauthProvider.clientLookup.className = 'cz.improvisio.MSEauthProvider.user.Client'
grails.plugin.springsecurity.oauthProvider.authorizationCodeLookup.className = 'cz.improvisio.MSEauthProvider.user.AuthCode'
grails.plugin.springsecurity.oauthProvider.accessTokenLookup.className = 'cz.improvisio.MSEauthProvider.user.AccessToken'
grails.plugin.springsecurity.oauthProvider.refreshTokenLookup.className = 'cz.improvisio.MSEauthProvider.user.RefreshToken'

grails.plugin.springsecurity.filterChain.chainMap = [
    '/oauth/token': 'JOINED_FILTERS,-oauth2ProviderFilter,-securityContextPersistenceFilter,-logoutFilter,-authenticationProcessingFilter,-rememberMeAuthenticationFilter,-exceptionTranslationFilter',
    '/securedOAuth2Resources/**': 'JOINED_FILTERS,-securityContextPersistenceFilter,-logoutFilter,-authenticationProcessingFilter,-rememberMeAuthenticationFilter,-oauth2BasicAuthenticationFilter,-exceptionTranslationFilter',
    '/**': 'JOINED_FILTERS,-statelessSecurityContextPersistenceFilter,-oauth2ProviderFilter,-clientCredentialsTokenEndpointFilter,-oauth2BasicAuthenticationFilter,-oauth2ExceptionTranslationFilter'
]

This is the client creation from Bootstrap.groovy: 这是从Bootstrap.groovy创建的客户端:

new Client(
                clientId: 'testClient',
                authorizedGrantTypes: [
                    'authorization_code',
                    'refresh_token',
                    'implicit',
                    'password',
                    'client_credentials'
                ],
                authorities: ['ROLE_CLIENT'],
                scopes: ['read', 'write'],
                redirectUris: ['http://test.com']).save(flush: true)

And one more slightly related question: I couldnt find a way to get the User to whose resources the access token should be linked to, so I assumed Id be able to get it through springSecurityService. 还有一个稍微相关的问题:我无法找到一种方法来将访问令牌应链接到其资源的User,因此我假定Id可以通过springSecurityService获取它。 Is this the correct way of doing so? 这是正确的方法吗? Or do I need to pass the userId to the method (and will OpenAM do it?)? 还是我需要将userId传递给方法(OpenAM会这样做吗?)?

Turns out I didnt have the proper filter chain set up for my action. 原来我没有为我的操作设置适当的过滤器链。 Changing config to 将配置更改为

grails.plugin.springsecurity.filterChain.chainMap = [
    '/oauth/token': 'JOINED_FILTERS,-oauth2ProviderFilter,-securityContextPersistenceFilter,-logoutFilter,-authenticationProcessingFilter,-rememberMeAuthenticationFilter,-exceptionTranslationFilter',
    '/securedOAuth2Resources/**': 'JOINED_FILTERS,-securityContextPersistenceFilter,-logoutFilter,-authenticationProcessingFilter,-rememberMeAuthenticationFilter,-oauth2BasicAuthenticationFilter,-exceptionTranslationFilter',
'/myController/getUserData': 'JOINED_FILTERS,-securityContextPersistenceFilter,-logoutFilter,-authenticationProcessingFilter,-rememberMeAuthenticationFilter,-oauth2BasicAuthenticationFilter,-exceptionTranslationFilter',
    '/**': 'JOINED_FILTERS,-statelessSecurityContextPersistenceFilter,-oauth2ProviderFilter,-clientCredentialsTokenEndpointFilter,-oauth2BasicAuthenticationFilter,-oauth2ExceptionTranslationFilter'
]

fixed it. 修复。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 Spring Security OAuth2始终重定向到具有有效Bearer标头的/ login页面 - Spring Security OAuth2 always redirects to /login page having a valid Bearer header 如何使用Spring Boot / Spring Security包装对OAuth2承载令牌请求的调用? - How to use Spring Boot/Spring Security to wrap a call to an OAuth2 bearer token request? 使用Spring Security OAuth2的JWT承载交换访问令牌请求 - JWT bearer exchange for access token request using Spring Security OAuth2 Spring Security 不适用于授权:来自 OAuth2 的不记名令牌 - Spring Security is not working with Authorization: Bearer token from OAuth2 如何在Grails和现有的oauth2提供程序中使用Spring Security实现基于表单的登录 - How to implement form-based login with spring security in grails and existing oauth2 provider 春季安全性OAuth2-对oauth / token的POST请求重定向到登录名和角色显示ROLE_ANONYMOUS - Spring Security OAuth2- POST request to oauth/token redirects to login and role displays ROLE_ANONYMOUS Grails Spring安全性Oauth2 - Grails spring security Oauth2 Grails和Oauth2 Spring安全性 - Grails and Oauth2 Spring security 带有oAuth2 / oAuth / Token请求405方法的Spring Security不允许 - Spring Security with oAuth2 /oAuth/Token request 405 method not allow Spring Security OAuth2资源服务器始终返回无效令牌 - Spring Security OAuth2 Resource Server Always Returning Invalid Token
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM