【问题标题】:Spring security: REST with MVCSpring 安全:REST 与 MVC
【发布时间】:2023-01-15 20:17:25
【问题描述】:

我是初学者在春季安全!我有在 Spring Boot 上编写的 MVC + REST 应用程序。我有一个用于保护我的应用程序的代码:

@Configuration
@EnableWebSecurity
@EnableMethodSecurity(securedEnabled = true)
public class SecurityConfig {
    @Bean
    @Order(1)
    public SecurityFilterChain apiFilterChain(
            HttpSecurity httpSecurity) throws Exception {
        return httpSecurity.csrf().disable()
            .sessionManagement()
            .sessionCreationPolicy(
                SessionCreationPolicy.STATELESS).and()
            .securityMatcher("/api/**")
            .authorizeHttpRequests(authorize ->
                authorize.requestMatchers("/api/user/**").hasRole("ROOT")
                    .anyRequest().authenticated())
            .httpBasic(basic ->
                basic.authenticationEntryPoint(
                    (request, response, exp)->
                        response.setStatus(401)))
            .build();
    }

    @Bean
    public SecurityFilterChain formFilterChain(
            HttpSecurity httpSecurity) throws Exception {
        return httpSecurity
            .authorizeHttpRequests(authorize ->
                authorize.requestMatchers("/login*", "/web-res/**").permitAll()
                    .anyRequest().authenticated())
            .formLogin(form ->
                form.loginPage("/login")
                    .failureUrl("/login?error"))
            .logout(logout ->
                logout.logoutUrl("/logout")
                    .logoutSuccessUrl("/")
                    .invalidateHttpSession(true)
                    .clearAuthentication(true)
                    .deleteCookies("JSESSIONID"))
            .build();
    }
}

这很好用,但是当我尝试从 MVC(由 formFilterChain 授权)和 ajax/api/**(由 apiFilterChain 控制)获取数据时 - 我需要使用基本身份验证。 我如何解决该问题以通过表单登录方法授权从 /api/** 获取数据?

【问题讨论】:

    标签: java spring-boot spring-security


    【解决方案1】:

    阅读文档后我的方法:

    @Configuration
    @EnableWebSecurity
    @EnableMethodSecurity(securedEnabled = true)
    public class SecurityConfig {
        private final Customizer<AuthorizeHttpRequestsConfigurer<HttpSecurity>
                .AuthorizationManagerRequestMatcherRegistry> securedRequests = authorize -> {
            authorize.requestMatchers("/login*", "/web-res/**").permitAll()
                .requestMatchers("/api/user/**").hasRole("ROOT")
                .anyRequest().authenticated();
        };
    
        @Bean
        @Order(1)
        public SecurityFilterChain apiFilterChain(
                HttpSecurity httpSecurity) throws Exception {
            return httpSecurity.csrf().disable()
                .sessionManagement()
                .sessionCreationPolicy(
                    SessionCreationPolicy.NEVER).and()
                .authorizeHttpRequests(securedRequests)
                // checking for "Authorization" header
                .securityMatcher(request ->
                    request.getHeader("Authorization") != null)
                .httpBasic(basic ->
                    basic.authenticationEntryPoint(
                        (request, response, exp)->
                            response.setStatus(401)))
                .build();
        }
    
        @Bean
        public SecurityFilterChain formFilterChain(
                HttpSecurity httpSecurity) throws Exception {
            return httpSecurity
                .authorizeHttpRequests(securedRequests)
                .formLogin(form ->
                    form.loginPage("/login")
                        .failureUrl("/login?error"))
                .logout(logout ->
                    logout.logoutUrl("/logout")
                        .logoutSuccessUrl("/")
                        .invalidateHttpSession(true)
                        .clearAuthentication(true)
                        .deleteCookies("JSESSIONID"))
                .build();
        }
    }
    

    如果请求具有标头“授权”,则第一个过滤器将起作用

    // checking for "Authorization" header
    ...
    .securityMatcher(request ->
      request.getHeader("Authorization") != null)
    ...
    

    如果未找到标头“授权”- 则执行formFilterChain

    【讨论】:

    • 您的答案可以通过其他支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写出好的答案的信息in the help center
    猜你喜欢
    • 1970-01-01
    • 2015-09-01
    • 2013-12-07
    • 2017-09-16
    • 2014-04-27
    • 2018-12-27
    • 2014-02-24
    • 1970-01-01
    • 2014-07-19
    相关资源
    最近更新 更多