/ / Come posso creare due configurazioni di sicurezza http con configurazione basata su Java? - java, sicurezza primaverile

Come posso creare due configurazioni di sicurezza http con configurazione java? - java, sicurezza della primavera

Nella configurazione XML ho potuto creare quanto segue:

<security:http pattern="/api/**"
create-session="never"
use-expressions="true">
<security:http-basic entry-point-ref="xBasicAuthenticationEntryPoint"/>
<security:session-management />
<security:intercept-url pattern="/tests/**" access="isAuthenticated()"/>
<security:intercept-url pattern="/api/**" access="isAuthenticated()"/>
</security:http>

<security:http auto-config="true" use-expressions="true" realm="ACME">
<security:intercept-url pattern="/favicon.ico" access="permitAll" />
<security:intercept-url pattern="/static/**" access="permitAll"/>
<security:intercept-url pattern="/error/**" access="permitAll" />
<security:intercept-url pattern="/" access="permitAll"/>
<security:intercept-url pattern="/login" access="permitAll"/>
<security:intercept-url pattern="/logout" access="isAuthenticated()"/>
<security:form-login login-page="/login"
authentication-failure-url="/login?error"/>
<security:logout logout-url="/logout" logout-success-url="/"/>
</security:http>

Ciò consentirebbe a tutte le chiamate a /api/** per non tentare di autenticare l'utente in assenza di sessione.

Come posso creare questa stessa configurazione con la configurazione basata su Java?

Mio WebSecurityConfigurerAdapter#configure(HttpSecurity) il metodo ha il seguente aspetto:

@Override
protected void configure(HttpSecurity http) throws Exception {
http.addFilter(switchUserFilter())
.authorizeRequests()
.antMatchers("/").permitAll()
.antMatchers("/static/**").permitAll()
.anyRequest().authenticated()
.and().formLogin()
.loginPage("/login")
.permitAll()
.defaultSuccessUrl("/")
.and().logout()
.logoutUrl("/logout")
.logoutSuccessUrl("/");
}

risposte:

5 per risposta № 1

Bene, è esplicito nel Manuale di riferimento di Spring Security, ne metti molti @Configuration classi interne annotate con un @Order() annotazione per specificare quali vengono esaminati per primi. Nel tuo esempio potrebbe apparire come:

@Order(1)
@Configuration
private static class ApiSecurityConfigurationAdapter
extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.antMatcher("/api/**")
.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.NEVER)
.and.httpBasic().authenticationEntryPoint(xBasicAuthenticationEntryPoint)
.and.authorizeRequests()
.anyRequest().authenticated();
}
}

@Configuration
private static class NormalSecurityConfigurationAdapter
extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.addFilter(switchUserFilter())
.authorizeRequests()
.antMatchers("/").permitAll()
.antMatchers("/static/**").permitAll()
.anyRequest().authenticated()
.and().formLogin()
.loginPage("/login")
.permitAll()
.defaultSuccessUrl("/")
.and().logout()
.logoutUrl("/logout")
.logoutSuccessUrl("/");
}
}