Java 为什么我会得到一个;“访问被拒绝”;Spring Security和KeyClope导致的错误?

Java 为什么我会得到一个;“访问被拒绝”;Spring Security和KeyClope导致的错误?,java,spring,spring-boot,spring-security,keycloak,Java,Spring,Spring Boot,Spring Security,Keycloak,我用Docker设置了一个KeyClope服务器。配置了领域和客户端等。我成功地为一些RESTController编写了Spring引导服务。工作等等 但当我尝试将Spring安全性与KeyClope适配器一起使用时,我被卡住了 这是我的安全配置: @KeycloakConfiguration class SecurityConfig : KeycloakWebSecurityConfigurerAdapter() { @Autowired lateinit var keycl

我用Docker设置了一个KeyClope服务器。配置了领域和客户端等。我成功地为一些RESTController编写了Spring引导服务。工作等等

但当我尝试将Spring安全性与KeyClope适配器一起使用时,我被卡住了

这是我的安全配置:

@KeycloakConfiguration
class SecurityConfig : KeycloakWebSecurityConfigurerAdapter() {

    @Autowired
    lateinit var keycloakClientRequestFactory: KeycloakClientRequestFactory

    @Bean
    fun keycloakConfigResolver(): KeycloakSpringBootConfigResolver = KeycloakSpringBootConfigResolver()

    @Bean
    override fun sessionAuthenticationStrategy(): SessionAuthenticationStrategy =
        NullAuthenticatedSessionStrategy()

    @Autowired
    @Throws(Exception::class)
    fun configureGlobal(auth: AuthenticationManagerBuilder) {
        val keycloakAuthProvider: KeycloakAuthenticationProvider = keycloakAuthenticationProvider()
        keycloakAuthProvider.setGrantedAuthoritiesMapper(SimpleAuthorityMapper())
        auth.authenticationProvider(keycloakAuthProvider)
    }

    @Throws(Exception::class)
    override fun configure(http: HttpSecurity) {
        super.configure(http)
        http.cors().disable()
            .csrf().disable()
            .exceptionHandling().and()
            .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
            .sessionAuthenticationStrategy(sessionAuthenticationStrategy()).and()
            .formLogin().disable()
            .authorizeRequests()
            .antMatchers("/apps/manual-data-collection/**").hasRole("user")
            .anyRequest().permitAll()
    }

    /**
     * https://www.keycloak.org/docs/latest/securing_apps/index.html#avoid-double-bean-registration
     */
    @Bean
    @ConditionalOnMissingBean(HttpSessionManager::class)
    override fun httpSessionManager(): HttpSessionManager = HttpSessionManager()

}

现在我尝试访问服务器,但得到一个403禁止的错误。以下是spring的日志:

2020-01-08 14:08:01.817 DEBUG 12396 --- [nio-8080-exec-5] o.s.s.w.u.matcher.AntPathRequestMatcher  : Checking match of request : '/apps/manual-data-collection/document-templates'; against '/apps/manual-data-collection/**'
2020-01-08 14:08:01.817 DEBUG 12396 --- [nio-8080-exec-5] o.s.s.w.a.i.FilterSecurityInterceptor    : Secure object: FilterInvocation: URL: /apps/manual-data-collection/document-templates; Attributes: [hasRole('ROLE_user')]
2020-01-08 14:08:01.817 DEBUG 12396 --- [nio-8080-exec-5] o.s.s.w.a.i.FilterSecurityInterceptor    : Previously Authenticated: org.keycloak.adapters.springsecurity.token.KeycloakAuthenticationToken@bc432bbc: Principal: willy; Credentials: [PROTECTED]; Authenticated: true; Details: org.keycloak.adapters.springsecurity.account.SimpleKeycloakAccount@42db7613; Not granted any authorities
2020-01-08 14:08:01.818 DEBUG 12396 --- [nio-8080-exec-5] o.s.s.access.vote.AffirmativeBased       : Voter: org.springframework.security.web.access.expression.WebExpressionVoter@3d0602a7, returned: -1
2020-01-08 14:08:01.818 DEBUG 12396 --- [nio-8080-exec-5] o.s.s.w.a.ExceptionTranslationFilter     : Access is denied (user is not anonymous); delegating to AccessDeniedHandler

org.springframework.security.access.AccessDeniedException: Access is denied
让我困惑的是,上面写着:
没有授予任何权限
。如果我省略了这个部分,一切都很好。必要的角色(在本例中为“用户”)存储在域中。JWT令牌还提供了这些功能。我不知道为什么它不起作用

编辑:
我应该提一下。Spring引导服务器应该只用作角度应用程序的REST服务器,因此是无状态的。我在application.yml中激活了以下内容:

keycloak.use-resource-role-mappings=true
但它必须是
false
。请说以下内容:

使用资源角色映射- 如果设置为true,适配器将在令牌中查找用户的应用程序级角色映射。如果为false,它将在领域级别查看用户角色映射。这是可选的。默认值为false


猜测一下:
hasRole('ROLE\u user')
可能表示Spring security正在寻找一个名为
ROLE\u user
的角色。您在您的领域中是这样命名的吗?领域中的角色是
user
。Spring安全性使用了前缀
ROLE\uu
,因此我使用
SimpleAuthorityMapper
将keyClope角色映射到Spring角色。还是我误解了什么?然而,我只是创建了一个名为
role\u user
的角色。不幸的是,它也不起作用。将
.antMatchers(“/apps/manual data collection/**”)更改为
.antMatchers(“/apps/manual data collection/**”)。将其更改为
.antMatchers(“/apps/manual data collection/**”)。然后我得到一个错误:
IllegalArgumentException:角色不应以“ROLE\u”开头,因为它是自动插入的。获得了“ROLE\u user”
@BilalShah,因为他使用的是Key斗篷,所以没有(直接)数据库身份验证。还请注意,用户确实存在(
Authenticated:true
),但角色似乎不匹配。谢谢!这救了我一天!