SEC-3019: Java Config for Http Basic supports Rememberme
This commit is contained in:
parent
b96cee7950
commit
0e36f85dab
|
@ -29,6 +29,7 @@ import org.springframework.security.config.annotation.web.builders.HttpSecurity;
|
||||||
import org.springframework.security.web.AuthenticationEntryPoint;
|
import org.springframework.security.web.AuthenticationEntryPoint;
|
||||||
import org.springframework.security.web.authentication.DelegatingAuthenticationEntryPoint;
|
import org.springframework.security.web.authentication.DelegatingAuthenticationEntryPoint;
|
||||||
import org.springframework.security.web.authentication.HttpStatusEntryPoint;
|
import org.springframework.security.web.authentication.HttpStatusEntryPoint;
|
||||||
|
import org.springframework.security.web.authentication.RememberMeServices;
|
||||||
import org.springframework.security.web.authentication.WebAuthenticationDetailsSource;
|
import org.springframework.security.web.authentication.WebAuthenticationDetailsSource;
|
||||||
import org.springframework.security.web.authentication.www.BasicAuthenticationEntryPoint;
|
import org.springframework.security.web.authentication.www.BasicAuthenticationEntryPoint;
|
||||||
import org.springframework.security.web.authentication.www.BasicAuthenticationFilter;
|
import org.springframework.security.web.authentication.www.BasicAuthenticationFilter;
|
||||||
|
@ -65,6 +66,7 @@ import org.springframework.web.accept.HeaderContentNegotiationStrategy;
|
||||||
*
|
*
|
||||||
* <ul>
|
* <ul>
|
||||||
* <li>{@link AuthenticationManager}</li>
|
* <li>{@link AuthenticationManager}</li>
|
||||||
|
* <li>{@link RememberMeServices}</li>
|
||||||
* </ul>
|
* </ul>
|
||||||
*
|
*
|
||||||
* @author Rob Winch
|
* @author Rob Winch
|
||||||
|
@ -177,6 +179,10 @@ public final class HttpBasicConfigurer<B extends HttpSecurityBuilder<B>> extends
|
||||||
basicAuthenticationFilter
|
basicAuthenticationFilter
|
||||||
.setAuthenticationDetailsSource(authenticationDetailsSource);
|
.setAuthenticationDetailsSource(authenticationDetailsSource);
|
||||||
}
|
}
|
||||||
|
RememberMeServices rememberMeServices = http.getSharedObject(RememberMeServices.class);
|
||||||
|
if(rememberMeServices != null) {
|
||||||
|
basicAuthenticationFilter.setRememberMeServices(rememberMeServices);
|
||||||
|
}
|
||||||
basicAuthenticationFilter = postProcess(basicAuthenticationFilter);
|
basicAuthenticationFilter = postProcess(basicAuthenticationFilter);
|
||||||
http.addFilter(basicAuthenticationFilter);
|
http.addFilter(basicAuthenticationFilter);
|
||||||
}
|
}
|
||||||
|
|
|
@ -24,6 +24,7 @@ import org.springframework.security.config.annotation.web.configuration.EnableWe
|
||||||
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter
|
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter
|
||||||
import org.springframework.security.web.AuthenticationEntryPoint
|
import org.springframework.security.web.AuthenticationEntryPoint
|
||||||
import org.springframework.security.web.access.ExceptionTranslationFilter
|
import org.springframework.security.web.access.ExceptionTranslationFilter
|
||||||
|
import org.springframework.security.web.authentication.rememberme.RememberMeAuthenticationFilter;
|
||||||
import org.springframework.security.web.authentication.www.BasicAuthenticationEntryPoint
|
import org.springframework.security.web.authentication.www.BasicAuthenticationEntryPoint
|
||||||
import org.springframework.security.web.authentication.www.BasicAuthenticationFilter
|
import org.springframework.security.web.authentication.www.BasicAuthenticationFilter
|
||||||
|
|
||||||
|
@ -130,4 +131,29 @@ class HttpBasicConfigurerTests extends BaseSpringSpec {
|
||||||
.inMemoryAuthentication()
|
.inMemoryAuthentication()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
def "SEC-3019: Basic Authentication uses RememberMe Config"() {
|
||||||
|
when:
|
||||||
|
loadConfig(BasicUsesRememberMeConfig)
|
||||||
|
then:
|
||||||
|
findFilter(BasicAuthenticationFilter).rememberMeServices == findFilter(RememberMeAuthenticationFilter).rememberMeServices
|
||||||
|
}
|
||||||
|
|
||||||
|
@EnableWebSecurity
|
||||||
|
@Configuration
|
||||||
|
static class BasicUsesRememberMeConfig extends WebSecurityConfigurerAdapter {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void configure(HttpSecurity http) throws Exception {
|
||||||
|
http
|
||||||
|
.httpBasic().and()
|
||||||
|
.rememberMe()
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
|
||||||
|
auth
|
||||||
|
.inMemoryAuthentication()
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
|
@ -3047,7 +3047,10 @@ create table persistent_logins (username varchar(64) not null,
|
||||||
|
|
||||||
[[remember-me-impls]]
|
[[remember-me-impls]]
|
||||||
=== Remember-Me Interfaces and Implementations
|
=== Remember-Me Interfaces and Implementations
|
||||||
Remember-me authentication is not used with basic authentication, given it is often not used with `HttpSession` s. Remember-me is used with `UsernamePasswordAuthenticationFilter`, and is implemented via hooks in the `AbstractAuthenticationProcessingFilter` superclass. The hooks will invoke a concrete `RememberMeServices` at the appropriate times. The interface looks like this:
|
Remember-me is used with `UsernamePasswordAuthenticationFilter`, and is implemented via hooks in the `AbstractAuthenticationProcessingFilter` superclass.
|
||||||
|
It is also used within `BasicAuthenticationFilter`.
|
||||||
|
The hooks will invoke a concrete `RememberMeServices` at the appropriate times.
|
||||||
|
The interface looks like this:
|
||||||
|
|
||||||
[source,java]
|
[source,java]
|
||||||
----
|
----
|
||||||
|
|
Loading…
Reference in New Issue