diff --git a/samples/airline/pom.xml b/samples/airline/pom.xml index d3c71bc8..65918830 100644 --- a/samples/airline/pom.xml +++ b/samples/airline/pom.xml @@ -1,4 +1,5 @@ - + spring-ws-samples org.springframework.ws @@ -134,7 +135,8 @@ process-classes - + @@ -307,49 +309,12 @@ runtime - org.acegisecurity - acegi-security - - - org.springframework - spring-remoting - - - org.springframework - spring-jdbc - - - org.springframework - spring-support - - - commons-lang - commons-lang - - - commons-lang - commons-lang - - - commons-codec - commons-codec - - - commons-collections - commons-collections - - + org.springframework.security + spring-security-core - org.acegisecurity - acegi-security-tiger - 1.0.5 - - - org.springframework - spring-aop - - + org.springframework.security + spring-security-core-tiger org.apache.activemq diff --git a/samples/airline/src/main/java/org/springframework/ws/samples/airline/security/FrequentFlyerDetails.java b/samples/airline/src/main/java/org/springframework/ws/samples/airline/security/FrequentFlyerDetails.java index ce269f74..18e56b08 100644 --- a/samples/airline/src/main/java/org/springframework/ws/samples/airline/security/FrequentFlyerDetails.java +++ b/samples/airline/src/main/java/org/springframework/ws/samples/airline/security/FrequentFlyerDetails.java @@ -16,9 +16,9 @@ package org.springframework.ws.samples.airline.security; -import org.acegisecurity.GrantedAuthority; -import org.acegisecurity.GrantedAuthorityImpl; -import org.acegisecurity.userdetails.UserDetails; +import org.springframework.security.GrantedAuthority; +import org.springframework.security.GrantedAuthorityImpl; +import org.springframework.security.userdetails.UserDetails; import org.springframework.ws.samples.airline.domain.FrequentFlyer; /** diff --git a/samples/airline/src/main/java/org/springframework/ws/samples/airline/security/SpringFrequentFlyerSecurityService.java b/samples/airline/src/main/java/org/springframework/ws/samples/airline/security/SpringFrequentFlyerSecurityService.java new file mode 100644 index 00000000..42f2ea7f --- /dev/null +++ b/samples/airline/src/main/java/org/springframework/ws/samples/airline/security/SpringFrequentFlyerSecurityService.java @@ -0,0 +1,84 @@ +/* + * Copyright 2006 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.ws.samples.airline.security; + +import org.springframework.dao.DataAccessException; +import org.springframework.security.Authentication; +import org.springframework.security.context.SecurityContext; +import org.springframework.security.context.SecurityContextHolder; +import org.springframework.security.userdetails.UserDetails; +import org.springframework.security.userdetails.UserDetailsService; +import org.springframework.security.userdetails.UsernameNotFoundException; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.ws.samples.airline.dao.FrequentFlyerDao; +import org.springframework.ws.samples.airline.domain.FrequentFlyer; +import org.springframework.ws.samples.airline.service.NoSuchFrequentFlyerException; + +/** + * Implementation of the FrequentFlyerSecurityService that uses Spring Security. + * + * @author Arjen Poutsma + */ +public class SpringFrequentFlyerSecurityService implements FrequentFlyerSecurityService, UserDetailsService { + + private FrequentFlyerDao frequentFlyerDao; + + public SpringFrequentFlyerSecurityService(FrequentFlyerDao frequentFlyerDao) { + this.frequentFlyerDao = frequentFlyerDao; + } + + @Transactional + public FrequentFlyer getCurrentlyAuthenticatedFrequentFlyer() { + SecurityContext context = SecurityContextHolder.getContext(); + Authentication authentication = context.getAuthentication(); + if (authentication != null) { + if (authentication.getPrincipal() instanceof FrequentFlyerDetails) { + FrequentFlyerDetails details = (FrequentFlyerDetails) authentication.getPrincipal(); + return details.getFrequentFlyer(); + } + else { + return (FrequentFlyer) authentication.getPrincipal(); + } + } + else { + return null; + } + } + + @Transactional + public FrequentFlyer getFrequentFlyer(String username) throws NoSuchFrequentFlyerException { + FrequentFlyer frequentFlyer = frequentFlyerDao.get(username); + if (frequentFlyer != null) { + return frequentFlyer; + } + else { + throw new NoSuchFrequentFlyerException(username); + } + } + + @Transactional + public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException, DataAccessException { + FrequentFlyer frequentFlyer = frequentFlyerDao.get(username); + if (frequentFlyer != null) { + return new FrequentFlyerDetails(frequentFlyer); + } + else { + throw new UsernameNotFoundException("Frequent flyer '" + username + "' not found"); + } + } + +} diff --git a/samples/airline/src/main/java/org/springframework/ws/samples/airline/security/StubFrequentFlyerSecurityService.java b/samples/airline/src/main/java/org/springframework/ws/samples/airline/security/StubFrequentFlyerSecurityService.java index df2c0035..b4c1f569 100644 --- a/samples/airline/src/main/java/org/springframework/ws/samples/airline/security/StubFrequentFlyerSecurityService.java +++ b/samples/airline/src/main/java/org/springframework/ws/samples/airline/security/StubFrequentFlyerSecurityService.java @@ -22,7 +22,7 @@ import org.springframework.ws.samples.airline.service.NoSuchFrequentFlyerExcepti /** * Stub implementation of FrequentFlyerSecurityService. This implementation is used by default by {@link * org.springframework.ws.samples.airline.service.impl.AirlineServiceImpl}, to allow it to run without depending on - * Acegi Security. + * Spring Security. * * @author Arjen Poutsma */ diff --git a/samples/airline/src/main/java/org/springframework/ws/samples/airline/service/AirlineService.java b/samples/airline/src/main/java/org/springframework/ws/samples/airline/service/AirlineService.java index e23b52de..851a5a4e 100644 --- a/samples/airline/src/main/java/org/springframework/ws/samples/airline/service/AirlineService.java +++ b/samples/airline/src/main/java/org/springframework/ws/samples/airline/service/AirlineService.java @@ -17,11 +17,9 @@ package org.springframework.ws.samples.airline.service; import java.util.List; -import org.acegisecurity.annotation.Secured; import org.joda.time.DateTime; import org.joda.time.LocalDate; -import org.springframework.transaction.annotation.Transactional; import org.springframework.ws.samples.airline.domain.Flight; import org.springframework.ws.samples.airline.domain.FrequentFlyer; import org.springframework.ws.samples.airline.domain.Passenger; @@ -74,8 +72,6 @@ public interface AirlineService { * @see org.springframework.ws.samples.airline.domain.Passenger * @see org.springframework.ws.samples.airline.domain.FrequentFlyer */ - @Transactional(readOnly = false, - rollbackFor = {NoSuchFlightException.class, NoSeatAvailableException.class, NoSuchFrequentFlyerException.class}) Ticket bookFlight(String flightNumber, DateTime departureTime, List passengers) throws NoSuchFlightException, NoSeatAvailableException, NoSuchFrequentFlyerException; @@ -84,6 +80,5 @@ public interface AirlineService { * * @return the amount of frequent flyer miles */ - @Secured({"ROLE_FREQUENT_FLYER"}) int getFrequentFlyerMileage(); } diff --git a/samples/airline/src/main/java/org/springframework/ws/samples/airline/service/impl/AirlineServiceImpl.java b/samples/airline/src/main/java/org/springframework/ws/samples/airline/service/impl/AirlineServiceImpl.java index 470e3a75..26b37eaa 100644 --- a/samples/airline/src/main/java/org/springframework/ws/samples/airline/service/impl/AirlineServiceImpl.java +++ b/samples/airline/src/main/java/org/springframework/ws/samples/airline/service/impl/AirlineServiceImpl.java @@ -23,6 +23,7 @@ import org.joda.time.DateTime; import org.joda.time.LocalDate; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.annotation.Secured; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.Assert; @@ -134,6 +135,7 @@ public class AirlineServiceImpl implements AirlineService { return flights; } + @Secured({"ROLE_FREQUENT_FLYER"}) public int getFrequentFlyerMileage() { if (logger.isDebugEnabled()) { logger.debug("Using " + frequentFlyerSecurityService + " for security"); diff --git a/samples/airline/src/main/resources/org/springframework/ws/samples/airline/security/applicationContext-security.xml b/samples/airline/src/main/resources/org/springframework/ws/samples/airline/security/applicationContext-security.xml index 1ed5f316..580a0825 100644 --- a/samples/airline/src/main/resources/org/springframework/ws/samples/airline/security/applicationContext-security.xml +++ b/samples/airline/src/main/resources/org/springframework/ws/samples/airline/security/applicationContext-security.xml @@ -1,83 +1,40 @@ + http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-2.0.xsd"> - This application context contains the WS-Security and Acegi beans. + This application context contains the WS-Security and Sprign Security beans. - - - - + + + + class="org.springframework.ws.samples.airline.security.SpringFrequentFlyerSecurityService"> A security service used to obtain Frequent Flyer information. - - This interceptor validates incoming messages according to the policy defined in 'securityPolicy.xml'. The policy defines that all incoming requests must have a UsernameToken with a password digest in it. - The actual authentication is performed by the Acegi callback handler. + The actual authentication is performed by the Spring Security callback handler. - + - - - - - - A standard Acegi authentication manager. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/samples/airline/src/test/java/org/springframework/ws/samples/airline/security/AcegiFrequentFlyerSecurityServiceTest.java b/samples/airline/src/test/java/org/springframework/ws/samples/airline/security/SpringFrequentFlyerSecurityServiceTest.java similarity index 81% rename from samples/airline/src/test/java/org/springframework/ws/samples/airline/security/AcegiFrequentFlyerSecurityServiceTest.java rename to samples/airline/src/test/java/org/springframework/ws/samples/airline/security/SpringFrequentFlyerSecurityServiceTest.java index 014eec11..39bd251e 100644 --- a/samples/airline/src/test/java/org/springframework/ws/samples/airline/security/AcegiFrequentFlyerSecurityServiceTest.java +++ b/samples/airline/src/test/java/org/springframework/ws/samples/airline/security/SpringFrequentFlyerSecurityServiceTest.java @@ -17,23 +17,24 @@ package org.springframework.ws.samples.airline.security; import junit.framework.TestCase; -import org.acegisecurity.context.SecurityContext; -import org.acegisecurity.context.SecurityContextHolder; -import org.acegisecurity.context.SecurityContextImpl; -import org.acegisecurity.providers.TestingAuthenticationToken; import static org.easymock.EasyMock.*; + +import org.springframework.security.context.SecurityContext; +import org.springframework.security.context.SecurityContextHolder; +import org.springframework.security.context.SecurityContextImpl; +import org.springframework.security.providers.TestingAuthenticationToken; import org.springframework.ws.samples.airline.dao.FrequentFlyerDao; import org.springframework.ws.samples.airline.domain.FrequentFlyer; -public class AcegiFrequentFlyerSecurityServiceTest extends TestCase { +public class SpringFrequentFlyerSecurityServiceTest extends TestCase { - private AcegiFrequentFlyerSecurityService securityService; + private SpringFrequentFlyerSecurityService securityService; private FrequentFlyerDao flyerDaoMock; protected void setUp() throws Exception { flyerDaoMock = createMock(FrequentFlyerDao.class); - securityService = new AcegiFrequentFlyerSecurityService(flyerDaoMock); + securityService = new SpringFrequentFlyerSecurityService(flyerDaoMock); } public void testGetCurrentlyAuthenticatedFrequentFlyer() throws Exception {