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

只有在重定向uri localhost时,使用nginx代理的keydepot Spring Boot才有效

蒙才
2023-03-14

我一直在为这件事头疼。

我有一个基本的web应用程序,使用Spring Boot在localhost:8082上运行,一个Docked Keyclope服务器在localhost:8081上运行,一个Docked nginx服务器在端口80上运行。

当我在没有Spring Security集成的情况下使用keyCloak时,访问安全资源的用户将被重定向到超文本传输协议://{keyCloak-server}/auth/realms/{myReal}/协议/openid-Connect/auth/...一切都很好。

根据本教程和其他几个教程,当我将Spring Security性添加到组合中时,我的应用程序突然尝试重定向到http://{myapp}/sso/login,其中没有/sso/loginendpoint,因此我得到了一个404。

我只能通过直接访问应用程序来将其路由到正确的登录endpointhttp://localhost:8082以及在KeyClope中为客户端设置重定向urihttp://localhost:8082/*.

我怀疑它可能与nginx config有关,但同样,在我将Spring Security性添加到组合中之前,它是有效的,所以我挠头了。这是我的nginx。形态

worker_processes 2;

events {
    worker_connections 1024;
}

http {

    proxy_set_header    Host               $host;
    proxy_set_header    X-Real-IP          $remote_addr;
    proxy_set_header    X-Forwarded-For    $proxy_add_x_forwarded_for;
    proxy_set_header    X-Forwarded-Host   $host;
    proxy_set_header    X-Forwarded-Server $host;
    proxy_set_header    X-Forwarded-Port   $server_port;
    proxy_set_header    X-Forwarded-Proto  $scheme;

    # auth local (keycloak)
    server {
        listen  80;
        server_name auth.local;

            location / {
                # keycloak
                proxy_pass http://host.docker.internal:8081/;
            }

        }

        server {
            listen  80;
            server_name guardian.local;

                location / {
                    # send to portal
                    rewrite ^/(.*)$ http://guardian.local/portal/$1 permanent;
                }

                location /portal {
                    # guardian web-portal
                    proxy_pass http://host.docker.internal:8082;
                }
            }

}

我的安全配置类:

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

    // Submits the KeycloakAuthenticationProvider to the AuthenticationManager
    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
        KeycloakAuthenticationProvider keycloakAuthenticationProvider = keycloakAuthenticationProvider();
        keycloakAuthenticationProvider.setGrantedAuthoritiesMapper(new SimpleAuthorityMapper());
        auth.authenticationProvider(keycloakAuthenticationProvider);
    }

    /**
     * Used by Spring Security to add Keycloak config from spring config resource (like application.properties).
     * @return
     */
    @Bean
    public KeycloakSpringBootConfigResolver KeycloakConfigResolver() {
        return new KeycloakSpringBootConfigResolver();
    }

    // Specifies the session authentication strategy
    @Bean
    @Override
    protected SessionAuthenticationStrategy sessionAuthenticationStrategy() {
        return new RegisterSessionAuthenticationStrategy(new SessionRegistryImpl());
    }

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

还有我的application.properties

server.port = 8082

keycloak.auth-server-url = http://auth.local/auth
keycloak.realm = myRealm
keycloak.resource = guardian-web-portal
keycloak.public-client = true
keycloak.use-resource-role-mappings = true
keycloak.principal-attribute = preferred_username

在此方面的任何帮助都将不胜感激。我使用的是KeyClope spring boot starter 12.0.4和spring boot starter security 2.4.5。

共有1个答案

华恩
2023-03-14

尝试添加以下内容,并将permitAll()更改为authenticated()

.antMatchers("/login*", "/error*", "/sso*" ).permitAll()

在你的

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

所以最后你会有:

@Override
protected void configure(HttpSecurity http) throws Exception {
    super.configure(http);
    http.authorizeRequests()
            .antMatchers("/login*", "/error*", "/sso*" ).permitAll()
            .antMatchers("/portal/client*")
            .hasRole("user")
            .anyRequest()
            .authenticated();
}
 类似资料:
  • Nginx的配置文件如下: server { listen 80; #此处应该配置你的域名: server_name doc.iminho.me; charset utf-8; #此处配置你的访问日志,请手动创建该目录: access_log /var/log/nginx/webhook.iminho.me/access.log

  • 我怎么能那么做?我也不知道。我在等你的帮助。谢谢。 我的代码:

  • 我有一个机器人,如果你在非命令通道中使用命令,它会发送一条消息,告诉你只在正确的通道中使用命令,但我希望它不会影响员工角色的人,这是我的代码,我得到了这个错误的属性角色我的代码: 我试图这样做是不和谐的。JSV12

  • 有史以来最奇怪的事情是:我从一个模块运行一个程序,该模块调用另一个模块的一些函数。问题是,相同的代码在使用基本函数时可以完美运行,但第三个函数只有在unittest类内部使用时才会失败,消息如下: NoSuchElementException:消息:没有这样的元素:无法定位元素:{“方法”:“xpath”,“选择器”:”//*[@id=“app_skeleton”]/tbody/tr[6]/td/

  • 问题内容: 我已经在托管jenkins和其他一些应用程序的ubuntu实例上将nginx设置为反向代理。我正在使用nginx根据相对路径路由到各种应用程序。从客户端到nginx的所有流量都通过https。在防火墙后面,nginx将所有内容通过http路由到配置的路径和端口号。看起来像这样: Nginx配置文件的相关部分是这样的: 问题是jenkins使用简单的身份验证,并且在成功登录后会发送302

  • 主要内容:1. 代理服务器介绍,2. 将请求传递给代理的服务器,3. 传递请求标头,4. 配置缓冲区,5. 选择传出IP地址本文介绍代理服务器的基本配置。 您将学习如何通过不同协议将NGINX请求传递给代理的服务器,修改发送到代理服务器的客户端请求标头,以及配置来自代理服务器的响应缓冲。 代理服务器的基本配置目录 代理服务器介绍 将请求传递给代理的服务器 传递请求标头 配置缓冲区 选择传出IP地址 1. 代理服务器介绍 代理通常用于在多个服务器之间分配负载,无缝地显示来自不同网站的内容,或者通过