java - Spring Security,针对 REST 请求禁用 formLogin()

标签 java spring spring-boot spring-security spring-data-rest

我正在使用 Spring Boot、Spring Security、Spring Data REST、Hibernate。 我正在创建一个 REST API 服务器。

我将访问 REST API 的安全性配置为:

@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
@CrossOrigin(origins = "*")
public class WebSecurityConfiguration extends WebSecurityConfigurerAdapter {

    @Autowired
    private UserDetailsServiceImpl userDetailsService;

    @Autowired
    private TenantFilter tenantFilter;


    @Autowired
    public void configureAuthentication(AuthenticationManagerBuilder authenticationManagerBuilder) throws Exception {
        authenticationManagerBuilder.userDetailsService(this.userDetailsService).passwordEncoder(User.PASSWORD_ENCODER);
    }

    @Bean
    @Override
    public AuthenticationManager authenticationManagerBean() throws Exception {
        return super.authenticationManagerBean();
    }

    @Bean
    public JwtAuthenticationTokenFilter jwtTokenFilter() throws Exception {
        return new JwtAuthenticationTokenFilter();
    }

    @Bean
    public CookieAuthFilter cookieAuthFilter() throws Exception {
        return new CookieAuthFilter();
    }

    @Bean
    public CustomWebAuthenticationDetailsSource customWebAuthenticationDetailsSource() {
        return new CustomWebAuthenticationDetailsSource();
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
                //********************************************************************
                // PERMIT OPTIONS
                //********************************************************************
                .antMatchers(HttpMethod.OPTIONS, "/**").permitAll()

                //********************************************************************
                //WEBSOCKET
                //********************************************************************
                .antMatchers("/socket/**").permitAll()

                .antMatchers("/images/**").permitAll()

                .antMatchers("/resources/templates/**").permitAll()

                .antMatchers("/api/v1/notifications/**").permitAll()

                //********************************************************************
                // SWAGGER
                //********************************************************************
                .antMatchers("/v2/api-docs", "/swagger-accounts/configuration/ui", "/swagger-accounts", "/swagger-accounts/configuration/security",
                        "/swagger-ui.html", "/webjars/**", "/swagger-resources/**").permitAll()


                .antMatchers("/api/v1/").permitAll()

                .antMatchers("/api/v1/auth/**").permitAll()
                .antMatchers("/api/v1/formLogin/**").permitAll()

                .antMatchers("/api/v1/logout").permitAll()

                .antMatchers("/api/v1/agents/verifyEmail").permitAll()

                .antMatchers("/api/v1/agents/**/verificationToken").permitAll()

                .antMatchers("/api/v1/agents/**/resetPassword").permitAll()

                .antMatchers("/api/v1/agents/**/verifyPasswordReset").permitAll()

                .antMatchers("/api/v1/agents/**/changePassword").permitAll()

                .antMatchers("/api/v1/errors/**").permitAll()

                .antMatchers("/api/v1/verifyCaptcha").permitAll()

                .antMatchers("/api/v1/ping").permitAll()

                .antMatchers("/api/v1/tenants/**").permitAll()

                // all other endpoints are authenticated
                .antMatchers("/**").authenticated()

                // global settings
                .and()
                .csrf()
                .disable();

       http.formLogin().loginPage("/login").permitAll();


        // Custom JWT based security filter
        http.addFilterBefore(tenantFilter, UsernamePasswordAuthenticationFilter.class);
        http.addFilterBefore(jwtTokenFilter(), UsernamePasswordAuthenticationFilter.class);
        http.addFilterBefore(cookieAuthFilter(), UsernamePasswordAuthenticationFilter.class);

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

我想要达到的目标是:

  • 当用户尝试访问类似 http://myhost/swagger-ui.html#/ 的 URL 时显示表单登录信息为了能够轻松使用swagger

  • 当使用 REST 调用(通过 Angular 或 Postman 或其他方式)调用服务器时,避免表单登录。事实上,否则如果认证失败,服务器会回复登录页面的html代码

有没有办法用Spring来完成这个任务,而不需要关闭formLogin()?

最佳答案

其他配置看起来不错

如果您注意到与 swagger 相关的 url 也被标记为 permitAll()。

只需删除 swagger 的 allowedAll 部分并将其添加到最后作为authentiated() 类似的东西

.antMatchers("/v2/api-docs", "/swagger-accounts/configuration/ui", "/swagger-accounts", "/swagger-accounts/configuration/security",
                        "/swagger-ui.html", "/webjars/**", "/swagger-resources/**").authenticated()

对于 REST 调用,只需查看它们是否添加到 permitAll()

另请注意:规则的顺序很重要,更具体的规则应该放在前面

例如

.antMatchers("/admin/**").authenticated()
.antMatchers("/admin/login").permitAll()

此处/admin/login也将进行身份验证。

关于java - Spring Security,针对 REST 请求禁用 formLogin(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56824071/

相关文章:

spring-boot - ElasticSearchRepository空查询不起作用

java - 获取Page对象的每个页面 - Spring

java - 数据库更新后运行的 PUT 和 PATCH 的 Spring 数据剩余验证

java - 将 Spring Boot 1.x 中的 netflix feign 迁移到 Spring Boot 2.x 中的 openfeign

java - Spring Boot - OAuth2 - 所有请求都被禁止

java - 无法为同一切面类的方法设置建议

java - Spring Boot 自动 JSON 到 Controller 中的对象

java - 如何使用 Java 8 `Files.find` 方法?

java - 将图像设置为剪贴板 - Java

java - 如何像横版卷轴游戏那样换行?