当前位置: 首页 > 知识库问答 >
问题:

Grails 3-Spring SecurityOAuth2提供程序-自定义安全提供程序被忽略

冯驰
2023-03-14

我的配置是:

    < li>Grails框架3.0.11 < Li > " org . grails . plugins:spring-security-core:3 . 0 . 3 " < Li > " org . grails . plugins:spring-security-oauth 2-provider:3 . 0 . 0-RC1 "

我已经指定了我的自定义用户详细信息服务(实现GrailsUserDemailsService)、自定义用户详细信息类(扩展Grailsuser)和自定义安全身份验证提供程序(扩展AbstractUserDemailsAuth

我将它放在resources.groovy中,如下所示:

userDetailsService(My2nUserDetailsService)

my2nAuthenticationProvider(My2nAuthenticationProvider) {
    userDetailsService = ref('userDetailsService')
}

现在我的问题是,当我想将 POST 发送到 /oauth/token 时,我的自定义提供程序 (my2nAuthenticationProvider) 被忽略并使用默认的 daoAuthenticationProvider,并且它失败了,因为该提供程序调用默认的用户详细信息服务(所以再次...我的自定义My2nUserDetailsService被忽略),一切都失败了。

我是这样配置Spring Security core和Spring Security Oauth2 provider的:

// Added by the Spring Security Core plugin:
grails.plugin.springsecurity.userLookup.userDomainClassName = 'cz.quanti.my2n.domains.my2n.My2nUser'
grails.plugin.springsecurity.userLookup.authorityJoinClassName = 'cz.quanti.my2n.domains.my2n.My2nUserRole'
grails.plugin.springsecurity.authority.className = 'cz.quanti.my2n.domains.my2n.My2nRole'
grails.plugin.springsecurity.rejectIfNoRule = false
grails.plugin.springsecurity.fii.rejectPublicInvocations = true
grails.plugin.springsecurity.securityConfigType = 'InterceptUrlMap'
grails.plugin.springsecurity.logout.postOnly = false
grails.plugin.springsecurity.password.algorithm = 'SHA-256'
grails.plugin.springsecurity.password.hash.iterations = 1
grails.plugin.springsecurity.providerNames = [
        'my2nAuthenticationProvider'
]
grails.plugin.springsecurity.controllerAnnotations.staticRules = [
    [pattern: '/oauth/authorize.dispatch', access: "IS_AUTHENTICATED_ANONYMOUSLY"],
    [pattern: '/oauth/token.dispatch', access: "IS_AUTHENTICATED_ANONYMOUSLY"]
]

// https://grails-plugins.github.io/grails-spring-security-core/v2/guide/filters.html
grails.plugin.springsecurity.filterChain.chainMap = [
            [pattern: '/oauth/token', filters: 'JOINED_FILTERS,-oauth2ProviderFilter,-clientCredentialsTokenEndpointFilter,-securityContextPersistenceFilter,-logoutFilter,-authenticationProcessingFilter,-rememberMeAuthenticationFilter,-exceptionTranslationFilter'],
            [pattern: '/oauth/authorize', filters: 'JOINED_FILTERS,-oauth2ProviderFilter,-clientCredentialsTokenEndpointFilter,-securityContextPersistenceFilter,-logoutFilter,-authenticationProcessingFilter,-rememberMeAuthenticationFilter,-exceptionTranslationFilter'],
            ...
            [pattern: '/**', filters: 'JOINED_FILTERS,-statelessSecurityContextPersistenceFilter,-oauth2ProviderFilter,-clientCredentialsTokenEndpointFilter,-oauth2BasicAuthenticationFilter,-oauth2ExceptionTranslationFilter,-restTokenValidationFilter,-restExceptionTranslationFilter']   // Traditional chain
    ]

// Added by the Spring Security OAuth2 Provider plugin:
grails.plugin.springsecurity.oauthProvider.clientLookup.className = 'cz.quanti.my2n.domains.hipmo.OauthClient'
grails.plugin.springsecurity.oauthProvider.authorizationCodeLookup.className = 'cz.quanti.my2n.domains.hipmo.OauthAuthorizationCode'
grails.plugin.springsecurity.oauthProvider.accessTokenLookup.className = 'cz.quanti.my2n.domains.hipmo.OauthAccessToken'
grails.plugin.springsecurity.oauthProvider.refreshTokenLookup.className = 'cz.quanti.my2n.domains.hipmo.OauthRefreshToken'
grails.plugin.springsecurity.oauthProvider.authorization.requireScope = false

你能给我一些建议吗?

共有2个答案

东门秦迟
2023-03-14

您将 securityConfigType 声明为 “InterceptUrlMap”,但您使用 controllerAnnotations 进行映射。更新 securityConfigType 以使用“注释”

杜祺
2023-03-14

我还没有使用过这个插件,但如果您希望您的bean注册替换插件注册的bean,则需要在resources.groovy中使用相同的bean名称。从插件源代码来看,我假设您希望替换<code>clientCredentialsAuthenticationProvider</code>bean,因此您的提供者注册应该如下

clientCredentialsAuthenticationProvider(My2nAuthenticationProvider) {
   userDetailsService = ref('userDetailsService')

}

 类似资料:
  • 问题内容: Sun的PKCS11 JCE安全提供程序缺少我们需要的某些功能。 因此,我使用原始资源编写了它的增强版本。 不幸的是,JCE基础结构拒绝新的提供者 “ JCE无法验证提供者”, 因为它没有正确签名。 抛出。 (呼叫) 关于如何签署新提供商以使其与JCE一起工作的任何建议? 问题答案: 该过程在文档“如何实现 提供者”中进行了描述。 它涉及到电子邮件 太阳向Oracle提供一些信息(包括

  • 我正在尝试创建一个自定义的KeyClope提供程序,它将为登录逻辑添加一些内容。我已经读过如何为KeyClope创建提供者(或插件),我正在与之合作的项目中已经有一个提供者(或插件),但我对它们知之甚少。 我需要为用户身份验证/授权添加自定义逻辑:我希望能够检查内部数据库中的一些字段来验证人员帐户。但是我没有找到任何关于类似情况的指南或好文章。有人能给我提供一些关于从什么开始的链接吗?为了实现这样

  • 我正在使用Symfony Security和系统中的自定义用户提供程序。它通过web服务为用户提供服务。 我根据本教程配置提供程序(http://symfony.com/doc/current/cookbook/security/custom_provider.html). 这里是检查用户的功能: 这很好,函数使用用户名调用一个web服务,然后返回一个包含用户数据的数组。但是现在我需要通过另一个w

  • 我将为我的网站创建自定义用户提供程序,对于用户来说,没有“用户名”和“密码”这样的概念(实际上有类似于密码的东西,但它的名称不同)。在文档中,用户实体必须实现来自安全包的UserInterface,该安全包具有诸如getUsername、getPassword之类的方法。我能用我自己的领域吗?或者我应该使用名称冲突(例如,getUsername将返回我的唯一字段)来实现我的行为吗?

  • 如果我创建一个提供者并将其绑定到一个类,就像这样 然后

  • JCA提供者提出的解决方案是将JAR放在jre/lib/ext文件夹中,但不是从那里加载的。据我所知,这是由于OSGi(Eclipse equinox)类加载器策略将bootstrap类加载器作为每个bundle类加载器的父类,从而排除了从jre/lib/ext文件夹加载的扩展类加载器。即。在jre/lib/ext文件夹中没有一个bundle可以看到任何东西。 是否有一种方法可以让Eclipse