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

Spring应用程序keycloack上的基本auth

欧阳德运
2023-03-14

我发现的大多数示例都使用org.keycloak:keycloak-spring-boot-starter的重定向特性。虽然我在这里找到了enable-basic-auth,但它对我不起作用。我知道必须使用keycloak.bearer-only=true来关闭重定向,但它的工作原理是这样的,而不是重定向,它为未经授权的用户返回401。

我的安全配置:

@Configuration
@EnableWebSecurity
@ComponentScan(basePackageClasses = KeycloakSecurityComponents.class)
public class SecurityConfig extends KeycloakWebSecurityConfigurerAdapter {

    @Bean
    public KeycloakSpringBootConfigResolver KeycloakConfigResolver() {
        return new KeycloakSpringBootConfigResolver();
    }

    @Override
    protected SessionAuthenticationStrategy sessionAuthenticationStrategy() {
        return new RegisterSessionAuthenticationStrategy(new SessionRegistryImpl());
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        super.configure(http);
        http
            .authorizeRequests()
            .antMatchers("/admin/**").hasRole("ADMIN")
            .anyRequest().permitAll();
    }
}

我的keycloak属性(我不使用占位符,这只是出于安全考虑):

keycloak.auth-server-url=https://${keycloak.host}/auth/
keycloak.realm=master
keycloak.resource=${client.name}
keycloak.enable-basic-auth=true
keycloak.credentials.secret=${client.secret}

共有1个答案

段干恺
2023-03-14

下面是一种通过keycloak openid和资源所有者密码凭据流向应用程序添加基本auth的方法。

首先,您需要将其添加到pom.xml中:

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.keycloak.bom</groupId>
            <artifactId>keycloak-adapter-bom</artifactId>
            <version>4.2.0.Final</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

...

<dependencies>
...
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>
        <dependency>
            <groupId>org.keycloak</groupId>
            <artifactId>keycloak-spring-boot-starter</artifactId>
        </dependency>
...
</dependencies>

添加keycloak服务器属性:

keycloak.auth-server-url=https://${keycloak.host}/auth/
keycloak.realm=master
keycloak.resource=${client.name}
keycloak.credentials.secret=${client.secret}
keycloak.enable-basic-auth=true
keycloak.bearer-only=true
@Configuration
@ComponentScan(basePackageClasses = KeycloakSecurityComponents.class)
@EnableWebSecurity
public class SecurityConfig extends KeycloakWebSecurityConfigurerAdapter {

    @Bean
    public KeycloakAuthenticationProvider authenticationProvider() {
        KeycloakAuthenticationProvider provider = new KeycloakAuthenticationProvider();
        provider.setGrantedAuthoritiesMapper(new SimpleAuthorityMapper());
        return provider;
    }

    @Bean
    public KeycloakSpringBootConfigResolver KeycloakConfigResolver() {
        return new KeycloakSpringBootConfigResolver();
    }

    @Override
    protected SessionAuthenticationStrategy sessionAuthenticationStrategy() {
        return new RegisterSessionAuthenticationStrategy(new SessionRegistryImpl());
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        super.configure(http);
        http
                .csrf().disable()
                .exceptionHandling().authenticationEntryPoint((request, response, authException) -> {
                    response.addHeader(HttpHeaders.WWW_AUTHENTICATE, "Basic realm=\"Restricted Content\"");
                    response.sendError(HttpStatus.UNAUTHORIZED.value(), HttpStatus.UNAUTHORIZED.getReasonPhrase());
                })
                .and()
                .authorizeRequests()
                .antMatchers("/admin/**").hasRole("admin")
                .anyRequest().permitAll();
    }
}
        .exceptionHandling().authenticationEntryPoint((request, response, authException) -> {
            response.addHeader(HttpHeaders.WWW_AUTHENTICATE, "Basic realm=\"Restricted Content\"");
            response.sendError(HttpStatus.UNAUTHORIZED.value(), HttpStatus.UNAUTHORIZED.getReasonPhrase());
        })
 类似资料:
  • 主要内容:创建项目,在Eclipse中导入项目,运行项目从这篇文章开始,我们使用Spring-AOP框架编写实际的AOP应用程序。在开始使用Spring-WS框架编写第一个示例之前,必须确保已经按照Spring AOP安装配置教程中的说明正确设置了Spring-AOP开发运行环境。 现在我们继续来编写一个简单的基于控制台的Spring AOP应用程序,它用于演示AOP的概念。 先来看看要创建的项目的目录结构 - 创建项目 打开命令控制台,进入目录并执行

  • 问题内容: 有时,您需要在servlet / JSP /基于的任何内容中构造指向Web应用程序上下文的完整URL 。类似于 **http://server.name:8080/context/** 。Servlet API没有实现此目的的单一方法。 直接的方法是将所有URL组件附加到,例如 我想知道这种选择是否有问题(速度快10倍): 上述两种方法是否 总是会 产生相同的结果? 问题答案: 它称为

  • 我准备在Windows10上开发一个libGDXAndroid应用程序,最新的EclipseMars。2、最新Android SDK和最新版本的libGDX。我将按照此处的设置说明进行操作:项目设置Gradle 在这里: 设置开发环境(Eclipse、Intellij IDEA、NetBeans) 这里呢 渐变与日食 我当我运行我的Android应用程序它崩溃与输出在logcat: 知道我做错了什

  • 我尝试了《Spring in Action第三版》一书中描述的Spring MVC应用程序。不幸的是,到目前为止,在浪费了6个小时之后,我无法运行最简单的应用程序。我总是会收到“HTTP状态404”错误。 我在这个论坛上找到了很多关于“@RequestMappingSpring不工作”的帖子,现在想知道我是否在遵循正确的书,或者是否有一些非常基本的东西困扰着这么多Spring的学习者。 我试着运行

  • 我有一个yii2基本模板在本地工作正常,但当我在服务器上上传文件时,它不工作。 index.php 当我打开URL它给了我以下错误 我发现这是由于在删除加载的文件时使用了导致的。但进一步说,我必须根据它更改供应商目录中的任何地方,我认为这不是一个好的做法。 有人能告诉我解决办法吗? 编辑:此问题是输入: '\' (ASCII=92)state=1中意外字符的重复

  • 我正在研究访问HTTP请求和响应体的最佳方式,以便在Spring反应式应用程序中进行跟踪。 对于以前的版本,我们已经利用Servlet过滤器和Servlet请求包装器来使用传入请求的输入流,并保存其副本,以便异步处理跟踪(我们将其发送给Elasticsearch)。 但对于一个Spring反应式应用程序(使用webflux),我想知道在解码之前访问请求的最合适方式是什么。有什么想法吗?