2 changed files with 140 additions and 185 deletions
@ -1,185 +0,0 @@
@@ -1,185 +0,0 @@
|
||||
/* |
||||
* Copyright 2002-2013 the original author or authors. |
||||
* |
||||
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||
* you may not use this file except in compliance with the License. |
||||
* You may obtain a copy of the License at |
||||
* |
||||
* http://www.apache.org/licenses/LICENSE-2.0 |
||||
* |
||||
* Unless required by applicable law or agreed to in writing, software |
||||
* distributed under the License is distributed on an "AS IS" BASIS, |
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||
* See the License for the specific language governing permissions and |
||||
* limitations under the License. |
||||
*/ |
||||
package org.springframework.security.config.annotation.authentication |
||||
|
||||
import org.springframework.security.core.userdetails.PasswordEncodedUser |
||||
|
||||
import javax.sql.DataSource |
||||
|
||||
import org.springframework.beans.factory.annotation.Autowired |
||||
import org.springframework.context.annotation.Bean |
||||
import org.springframework.context.annotation.Configuration |
||||
import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseBuilder |
||||
import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType |
||||
import org.springframework.security.authentication.AuthenticationManager |
||||
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken |
||||
import org.springframework.security.authentication.dao.DaoAuthenticationProvider |
||||
import org.springframework.security.config.annotation.BaseSpringSpec |
||||
import org.springframework.security.config.annotation.authentication.NamespaceJdbcUserServiceTests.CustomJdbcUserServiceSampleConfig.CustomUserCache; |
||||
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; |
||||
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; |
||||
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; |
||||
import org.springframework.security.core.Authentication |
||||
import org.springframework.security.core.userdetails.UserCache |
||||
import org.springframework.security.core.userdetails.UserDetails; |
||||
import org.springframework.security.provisioning.JdbcUserDetailsManager |
||||
|
||||
/** |
||||
* |
||||
* @author Rob Winch |
||||
* |
||||
*/ |
||||
class NamespaceJdbcUserServiceTests extends BaseSpringSpec { |
||||
def "jdbc-user-service"() { |
||||
when: |
||||
loadConfig(DataSourceConfig,JdbcUserServiceConfig) |
||||
then: |
||||
findAuthenticationProvider(DaoAuthenticationProvider).userDetailsService instanceof JdbcUserDetailsManager |
||||
} |
||||
|
||||
@EnableWebSecurity |
||||
static class JdbcUserServiceConfig extends WebSecurityConfigurerAdapter { |
||||
@Autowired |
||||
private DataSource dataSource; |
||||
|
||||
protected void configure(AuthenticationManagerBuilder auth) throws Exception { |
||||
auth |
||||
.jdbcAuthentication() |
||||
.dataSource(dataSource) // jdbc-user-service@data-source-ref |
||||
} |
||||
|
||||
// Only necessary to have access to verify the AuthenticationManager |
||||
@Bean |
||||
@Override |
||||
public AuthenticationManager authenticationManagerBean() |
||||
throws Exception { |
||||
return super.authenticationManagerBean(); |
||||
} |
||||
} |
||||
|
||||
def "jdbc-user-service in memory testing sample"() { |
||||
when: |
||||
loadConfig(DataSourceConfig,JdbcUserServiceInMemorySampleConfig) |
||||
then: |
||||
Authentication auth = authenticationManager.authenticate(new UsernamePasswordAuthenticationToken("user", "password")) |
||||
auth.authorities.collect {it.authority} == ['ROLE_USER'] |
||||
auth.name == "user" |
||||
} |
||||
|
||||
@EnableWebSecurity |
||||
static class JdbcUserServiceInMemorySampleConfig extends WebSecurityConfigurerAdapter { |
||||
@Autowired |
||||
private DataSource dataSource; |
||||
|
||||
protected void configure(AuthenticationManagerBuilder auth) throws Exception { |
||||
auth |
||||
.jdbcAuthentication() |
||||
.dataSource(dataSource) |
||||
// imports the default schema (will fail if already exists) |
||||
.withDefaultSchema() |
||||
// adds this user automatically (will fail if already exists) |
||||
.withUser(PasswordEncodedUser.user()) |
||||
} |
||||
|
||||
// Only necessary to have access to verify the AuthenticationManager |
||||
@Bean |
||||
@Override |
||||
public AuthenticationManager authenticationManagerBean() |
||||
throws Exception { |
||||
return super.authenticationManagerBean(); |
||||
} |
||||
} |
||||
|
||||
@Configuration |
||||
static class DataSourceConfig { |
||||
@Bean |
||||
public DataSource dataSource() { |
||||
EmbeddedDatabaseBuilder builder = new EmbeddedDatabaseBuilder() |
||||
return builder.setType(EmbeddedDatabaseType.HSQL).build(); |
||||
} |
||||
} |
||||
|
||||
def "jdbc-user-service custom"() { |
||||
when: |
||||
loadConfig(CustomDataSourceConfig,CustomJdbcUserServiceSampleConfig) |
||||
then: |
||||
findAuthenticationProvider(DaoAuthenticationProvider).userDetailsService.userCache instanceof CustomUserCache |
||||
when: |
||||
Authentication auth = authenticationManager.authenticate(new UsernamePasswordAuthenticationToken("user", "password")) |
||||
then: |
||||
auth.authorities.collect {it.authority}.sort() == ['ROLE_DBA','ROLE_USER'] |
||||
auth.name == 'user' |
||||
} |
||||
|
||||
@EnableWebSecurity |
||||
static class CustomJdbcUserServiceSampleConfig extends WebSecurityConfigurerAdapter { |
||||
@Autowired |
||||
private DataSource dataSource; |
||||
|
||||
protected void configure(AuthenticationManagerBuilder auth) throws Exception { |
||||
auth |
||||
.jdbcAuthentication() |
||||
// jdbc-user-service@dataSource |
||||
.dataSource(dataSource) |
||||
// jdbc-user-service@cache-ref |
||||
.userCache(new CustomUserCache()) |
||||
// jdbc-user-service@users-byusername-query |
||||
.usersByUsernameQuery("select principal,credentials,true from users where principal = ?") |
||||
// jdbc-user-service@authorities-by-username-query |
||||
.authoritiesByUsernameQuery("select principal,role from roles where principal = ?") |
||||
// jdbc-user-service@group-authorities-by-username-query |
||||
.groupAuthoritiesByUsername(JdbcUserDetailsManager.DEF_GROUP_AUTHORITIES_BY_USERNAME_QUERY) |
||||
// jdbc-user-service@role-prefix |
||||
.rolePrefix("ROLE_") |
||||
|
||||
} |
||||
|
||||
// Only necessary to have access to verify the AuthenticationManager |
||||
@Bean |
||||
@Override |
||||
public AuthenticationManager authenticationManagerBean() |
||||
throws Exception { |
||||
return super.authenticationManagerBean(); |
||||
} |
||||
|
||||
static class CustomUserCache implements UserCache { |
||||
|
||||
@Override |
||||
public UserDetails getUserFromCache(String username) { |
||||
return null; |
||||
} |
||||
|
||||
@Override |
||||
public void putUserInCache(UserDetails user) { |
||||
} |
||||
|
||||
@Override |
||||
public void removeUserFromCache(String username) { |
||||
} |
||||
} |
||||
} |
||||
|
||||
@Configuration |
||||
static class CustomDataSourceConfig { |
||||
@Bean |
||||
public DataSource dataSource() { |
||||
EmbeddedDatabaseBuilder builder = new EmbeddedDatabaseBuilder() |
||||
// simulate that the DB already has the schema loaded and users in it |
||||
.addScript("CustomJdbcUserServiceSampleConfig.sql") |
||||
return builder.setType(EmbeddedDatabaseType.HSQL).build(); |
||||
} |
||||
} |
||||
} |
||||
@ -0,0 +1,140 @@
@@ -0,0 +1,140 @@
|
||||
/* |
||||
* Copyright 2002-2018 the original author or authors. |
||||
* |
||||
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||
* you may not use this file except in compliance with the License. |
||||
* You may obtain a copy of the License at |
||||
* |
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
* |
||||
* Unless required by applicable law or agreed to in writing, software |
||||
* distributed under the License is distributed on an "AS IS" BASIS, |
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||
* See the License for the specific language governing permissions and |
||||
* limitations under the License. |
||||
*/ |
||||
|
||||
package org.springframework.security.config.annotation.authentication; |
||||
|
||||
import org.junit.Rule; |
||||
import org.junit.Test; |
||||
import org.springframework.beans.factory.annotation.Autowired; |
||||
import org.springframework.context.annotation.Bean; |
||||
import org.springframework.context.annotation.Configuration; |
||||
import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseBuilder; |
||||
import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType; |
||||
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; |
||||
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; |
||||
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; |
||||
import org.springframework.security.config.test.SpringTestRule; |
||||
import org.springframework.security.core.userdetails.PasswordEncodedUser; |
||||
import org.springframework.security.core.userdetails.UserCache; |
||||
import org.springframework.security.core.userdetails.UserDetails; |
||||
import org.springframework.security.provisioning.JdbcUserDetailsManager; |
||||
import org.springframework.test.web.servlet.MockMvc; |
||||
|
||||
import javax.sql.DataSource; |
||||
|
||||
import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestBuilders.formLogin; |
||||
import static org.springframework.security.test.web.servlet.response.SecurityMockMvcResultMatchers.authenticated; |
||||
|
||||
/** |
||||
* @author Rob Winch |
||||
*/ |
||||
public class NamespaceJdbcUserServiceTests { |
||||
|
||||
@Rule |
||||
public final SpringTestRule spring = new SpringTestRule(); |
||||
|
||||
@Autowired |
||||
private MockMvc mockMvc; |
||||
|
||||
@Test |
||||
public void jdbcUserService() throws Exception { |
||||
this.spring.register(DataSourceConfig.class, JdbcUserServiceConfig.class).autowire(); |
||||
|
||||
this.mockMvc.perform(formLogin()) |
||||
.andExpect(authenticated().withUsername("user")); |
||||
} |
||||
|
||||
@EnableWebSecurity |
||||
static class JdbcUserServiceConfig extends WebSecurityConfigurerAdapter { |
||||
@Autowired |
||||
private DataSource dataSource; |
||||
|
||||
protected void configure(AuthenticationManagerBuilder auth) throws Exception { |
||||
auth |
||||
.jdbcAuthentication() |
||||
.withDefaultSchema() |
||||
.withUser(PasswordEncodedUser.user()) |
||||
.dataSource(this.dataSource); // jdbc-user-service@data-source-ref
|
||||
} |
||||
} |
||||
|
||||
@Configuration |
||||
static class DataSourceConfig { |
||||
@Bean |
||||
public DataSource dataSource() { |
||||
EmbeddedDatabaseBuilder builder = new EmbeddedDatabaseBuilder(); |
||||
return builder.setType(EmbeddedDatabaseType.HSQL).build(); |
||||
} |
||||
} |
||||
|
||||
@Test |
||||
public void jdbcUserServiceCustom() throws Exception { |
||||
this.spring.register(CustomDataSourceConfig.class, CustomJdbcUserServiceSampleConfig.class).autowire(); |
||||
|
||||
this.mockMvc.perform(formLogin()) |
||||
.andExpect(authenticated().withUsername("user").withRoles("DBA", "USER")); |
||||
} |
||||
|
||||
@EnableWebSecurity |
||||
static class CustomJdbcUserServiceSampleConfig extends WebSecurityConfigurerAdapter { |
||||
@Autowired |
||||
private DataSource dataSource; |
||||
|
||||
protected void configure(AuthenticationManagerBuilder auth) throws Exception { |
||||
auth |
||||
.jdbcAuthentication() |
||||
// jdbc-user-service@dataSource
|
||||
.dataSource(this.dataSource) |
||||
// jdbc-user-service@cache-ref
|
||||
.userCache(new CustomUserCache()) |
||||
// jdbc-user-service@users-byusername-query
|
||||
.usersByUsernameQuery("select principal,credentials,true from users where principal = ?") |
||||
// jdbc-user-service@authorities-by-username-query
|
||||
.authoritiesByUsernameQuery("select principal,role from roles where principal = ?") |
||||
// jdbc-user-service@group-authorities-by-username-query
|
||||
.groupAuthoritiesByUsername(JdbcUserDetailsManager.DEF_GROUP_AUTHORITIES_BY_USERNAME_QUERY) |
||||
// jdbc-user-service@role-prefix
|
||||
.rolePrefix("ROLE_"); |
||||
|
||||
} |
||||
|
||||
static class CustomUserCache implements UserCache { |
||||
|
||||
@Override |
||||
public UserDetails getUserFromCache(String username) { |
||||
return null; |
||||
} |
||||
|
||||
@Override |
||||
public void putUserInCache(UserDetails user) { |
||||
} |
||||
|
||||
@Override |
||||
public void removeUserFromCache(String username) { |
||||
} |
||||
} |
||||
} |
||||
@Configuration |
||||
static class CustomDataSourceConfig { |
||||
@Bean |
||||
public DataSource dataSource() { |
||||
EmbeddedDatabaseBuilder builder = new EmbeddedDatabaseBuilder() |
||||
// simulate that the DB already has the schema loaded and users in it
|
||||
.addScript("CustomJdbcUserServiceSampleConfig.sql"); |
||||
return builder.setType(EmbeddedDatabaseType.HSQL).build(); |
||||
} |
||||
} |
||||
} |
||||
Loading…
Reference in new issue