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

如何在使用spring security Spring Boot应用程序中跳过HAL浏览器的授权

壤驷俊逸
2023-03-14
 implementation 'org.springframework.boot:spring-boot-starter-data-rest'
 implementation 'org.springframework.boot:spring-boot-starter-hateoas'
 implementation 'org.springframework.boot:spring-boot-starter-validation'
 implementation 'org.springframework.boot:spring-boot-starter-security'


        @Configuration
        @EnableWebSecurity
        public class SecurityConfiguration extends WebSecurityConfigurerAdapter {


            @Override
            protected void configure(AuthenticationManagerBuilder auth) throws Exception {
                auth.authenticationProvider(daoAuthenticationProvider());
            }

            @Override
            protected void configure(HttpSecurity http) throws Exception {
                http
                        .csrf().disable()
                        .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
                        .and()
                        .addFilter(new AuthorizationFilter(authenticationManager(), userRepository))
                        .authorizeRequests()
                        // configure access rules
                        .antMatchers("/browser/index.html**").permitAll()
                        .anyRequest().authenticated();

                http.headers().frameOptions().disable();
            }

            @Override
            public void configure(WebSecurity web) throws Exception {
                web.ignoring().antMatchers("/browser/index.html");
            }

        }

     


        public class AuthorizationFilter extends BasicAuthenticationFilter {

            public static final String HEADER_STRING_REMOTE_USER = "Remote-User";

            /**
             * Security pipe line is composed of different filters so we need to delegate to the rest of the pipeline.
             *
             * @param request
             * @param response
             * @param chain
             * @throws IOException
             * @throws ServletException
             */
            @Override
            protected void doFilterInternal (HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws IOException, ServletException {

                // Read the Authorization header, where we get the userId
                String userId = request.getHeader(HEADER_STRING_REMOTE_USER);

                // If header does not contain userId or is null delegate to Spring impl and exit
                if (userId == null) {
                    chain.doFilter(request, response);
                    return;
                }

                // If userId is present, try grab user principal from database and perform authorization
                Authentication authentication = getUsernamePasswordAuthentication(userId);
                SecurityContextHolder.getContext().setAuthentication(authentication);

                // Continue filter execution
                chain.doFilter(request, response);
            }

            private Authentication getUsernamePasswordAuthentication (String userId) {

                // Search in the DB if we find the user by userId
                // If so, then grab user details and create spring auth token using username, pass, authorities/roles
                if (userId != null) {
                    List user = userRepository.findByUserId(userId);
                    UserPrincipal principal = new UserPrincipal(user.get(0));
                    UsernamePasswordAuthenticationToken auth = new UsernamePasswordAuthenticationToken(principal, null, principal.getAuthorities());
                    return auth;
                }

                return null;
            }
        }

有没有人遇到过类似的问题...

共有1个答案

明利
2023-03-14

我最后做的是使用spring活动配置文件进行管理。

有关spring profiles的更多信息,请参阅链接

我为“secure”配置文件启用了Spring Security,为“dev”配置文件禁用了它。因此在“dev”配置文件中,HAL浏览器可以在没有任何安全中断的情况下工作。

@Configuration
@EnableWebSecurity
@Profile("secure")
public class WebSecurityConfigEnable extends WebSecurityConfigurerAdapter {

    @Autowired
    UserPrincipalDetailsService userPrincipalDetailsService;

    private UserRepository userRepository;

    @Value("${spring.profiles.active}")
    private String activeProfile;

        public WebSecurityConfigEnable (UserPrincipalDetailsService 
userPrincipalDetailsService, UserRepository userRepository) {
        this.userPrincipalDetailsService = userPrincipalDetailsService;
        this.userRepository = userRepository;
    }

    @Override
    protected void configure (AuthenticationManagerBuilder auth) throws 
Exception {
        auth.authenticationProvider(daoAuthenticationProvider());
    }

    @Override
    protected void configure (HttpSecurity http) throws Exception {
        http
                .cors().configurationSource(request -> new 
CorsConfiguration().applyPermitDefaultValues())
                .and()
               .csrf().disable()

.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
                .and()
                .addFilter(new AuthorizationFilter(authenticationManager(), 
userRepository, activeProfile))
                .authorizeRequests()
                // configure access rules
                .anyRequest().authenticated();
    }

    @Bean
DaoAuthenticationProvider daoAuthenticationProvider () {
    DaoAuthenticationProvider daoAuthenticationProvider = new DaoAuthenticationProvider();
    daoAuthenticationProvider.setPasswordEncoder(this.passwordEncoder());
    daoAuthenticationProvider.setUserDetailsService(this.userPrincipalDetailsService);

    return daoAuthenticationProvider;
}

@Bean
PasswordEncoder passwordEncoder () {
    return new BCryptPasswordEncoder();
}
}
java -jar -Dspring.profiles.active=dev build\libs\springApp-0.1.1-SNAPSHOT.jar
 类似资料:
  • 我已经实现了一个使用基本身份验证(使用Spring Security性)的web服务器。 我在访问URL时禁用了默认身份验证入口点(它只返回401,而不是用www身份验证标头响应401),目的是防止浏览器显示身份验证弹出窗口。 我能够用javascript代码和命令行工具(如curl)连接到服务器,但是当我用浏览器(chrome)测试它时 <代码>curl-v-u用户:密码本地主机:8080/用户

  • 当我们出于开发目的或其他需要尝试访问SSL安全URL(或站点)时,当浏览器找不到我们正在访问的特定站点的有效SSL证书时,它会显示以下错误。 在WINDOWS OS中,它显示PROCEED选项,但在MAC OS中不显示此选项。 那么,如何简单地跳过MAC OS或其他操作系统中浏览器的SSL检查呢。

  • 你好,我在JavaFX应用程序中遇到了一个很大的问题,当所有浏览器窗口关闭时,会终止java进程。我试图处理stage.setonhidding或.setoncloseRequest,终止所有正在运行的线程,并在处理程序主体中执行platform.exit,但没有成功。首先,当我关闭浏览器时,没有调用任何处理程序setonHidding和setOnCloseRequest。此外,设置platfor

  • 问题内容: 我正在尝试在我的网站上部署Java applet。我还需要签名,因为我需要访问剪贴板。我遵循了所有可以找到但没有成功的签名教程。到目前为止,这是我所做的: 在NetBeans中编写了一个applet。它在applet查看器中运行良好。 从中制作一个.jar文件。 通过执行以下操作创建证书: 像这样用jarsigner签名: 制作了一个包含以下内容的html文件: 当我打开该html文件

  • 我制作了一个Java桌面应用程序,可以创建多个交互式窗口。我想向人们展示的不是压缩文件夹存档的下载链接,而是一个在他们打开我的网站后立即运行的程序。 在NetBeans编程环境中为这个项目启用Java Web Start,让我得以启动。html页面并启动。启动应用程序的jnlp文件。除了一个小细节,它还能工作。我需要在JAR文件旁边包含图标和其他文件,以便使其完全正常工作。打开网站时,这些文件可能

  • 我想创建一个基于JavaFx WebEngine的自定义FunctionPlotter组件。我的情节将在浏览器中显示。在执行plot命令之前,我必须等待浏览器初始化(它加载d3.js)。目前,我这样做的方法是将我的绘图表达式放入一个Runnable中,并将该Runnable传递给FunctionPlotter。(FunctionPlotter将runnable传递给浏览器的loading fini