Spring Security HTTP Basic for RESTFul and FormLogin (Cookies) for web - Annotations

前端 未结 2 388
北恋
北恋 2020-12-02 07:04

In Specific

I want to have HTTP Basic authentication ONLY for a specific URL pattern.

In Detail

I\'m creating an A

相关标签:
2条回答
  • 2020-12-02 07:58

    I dunno if it can be helpful but I couldn't implement the above solution. I found a workaround defining a single Security

    @Configuration class

    extending

    WebSecurityConfigurerAdapter

    with both httpBasic() and formLogin() configured. Then I created a custom

    CustomAuthEntryPoint implements AuthenticationEntryPoint

    that has this logic in the commence method:

        @Override
        public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException authException) throws IOException, ServletException
       {
            String urlContext = UtilityClass.extractUrlContext(request);
            if (!urlContext.equals(API_URL_PREFIX))
            {
                String redirectUrl = "urlOfFormLogin"
                response.sendRedirect(request.getContextPath() + redirectUrl);
           }
            else
            {
                response.sendError(HttpServletResponse.SC_UNAUTHORIZED);
            }
    

    Dunno which is the "best practice strategy" about this issue

    0 讨论(0)
  • 2020-12-02 07:59

    Waited for 2 days and didn't get any help here. But my research provided me a solution :)

    Solution

    @Configuration
    @EnableWebMvcSecurity
    @EnableGlobalMethodSecurity(securedEnabled = true, prePostEnabled = true, proxyTargetClass = true)
    public class WebSecurityConfig extends WebSecurityConfigurerAdapter{
    
        @Autowired
        private AuthenticationProvider authenticationProvider;
    
        @Autowired
        public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
            auth.authenticationProvider(authenticationProvider);
        }
    
        @Configuration
        @Order(1)
        public static class ApiWebSecurityConfig extends WebSecurityConfigurerAdapter{
            @Override
            protected void configure(HttpSecurity http) throws Exception {
                http.csrf().disable()
                        .antMatcher("/api/**")
                        .authorizeRequests()
                            .anyRequest().hasAnyRole("ADMIN", "API")
                            .and()
                        .httpBasic();
            }
        }
    
        @Configuration
        @Order(2)
        public static class FormWebSecurityConfig extends WebSecurityConfigurerAdapter{
    
            @Override
            public void configure(WebSecurity web) throws Exception {
                web.ignoring().antMatchers("/css/**", "/js/**", "/img/**", "/lib/**");
            }
    
            @Override
            protected void configure(HttpSecurity http) throws Exception {
                http.csrf().disable() //HTTP with Disable CSRF
                        .authorizeRequests() //Authorize Request Configuration
                            .antMatchers("/connect/**").permitAll()
                            .antMatchers("/", "/register").permitAll()
                            .antMatchers("/admin/**").hasRole("ADMIN")
                            .anyRequest().authenticated()
                            .and() //Login Form configuration for all others
                        .formLogin()
                            .loginPage("/login").permitAll()
                            .and() //Logout Form configuration
                        .logout().permitAll();
            }
        }
    }
    
    0 讨论(0)
提交回复
热议问题