Перед праздником я потратил некоторое время на обновление AppFuse для использования последних версий Spring и Spring Security. Я начал с Spring Security в начале декабря и быстро обнаружил, что его 3.1 XSD требует некоторых изменений. После перехода на XSD версии 3.1 в моем файле security.xml мне пришлось изменить его элемент <http>, чтобы использовать security = «none» вместо filters = «none». В Spring Security 3.0.5 у меня было:
<http auto-config="true" lowercase-comparisons="false"> <intercept-url pattern="/images/**" filters="none"/> <intercept-url pattern="/styles/**" filters="none"/> <intercept-url pattern="/scripts/**" filters="none"/>
После обновления до 3.1 мне пришлось изменить это на:
<http pattern="/images/**" security="none"/> <http pattern="/styles/**" security="none"/> <http pattern="/scripts/**" security="none"/> <http auto-config="true">
Следующим, что мне пришлось изменить, был UserSecurityAdvice.java . Вместо использования Collection <GrantedAuthority> для метода getAuthority () Аутентификации мне пришлось изменить его на использование Collection <? расширяет GrantedAuthority>.
Authentication auth = ctx.getAuthentication(); Collection<? extends GrantedAuthority> roles = auth.getAuthorities();
Наконец, я обнаружил, что SPRING_SECURITY_CONTEXT_KEY перемещен в HttpSessionSecurityContextRepository . Нажмите здесь, чтобы увидеть список изменений для этого обновления в AppFuse’s FishEye.
Вы можете прочитать больше о том, что нового в Spring Security 3.1 на InfoQ . Я особенно рад видеть поддержку файлов cookie только для http для Servlet 3.0. Я обнаружил, что Spring Security не поддерживает это при тестировании с использованием Zed Attack Proxy .
Обновление до Spring Framework 3.1
По сравнению с обновлением Spring Security, обновление до Spring 3.1 было быстрым . Первое, что я обнаружил после изменения версии моего pom.xml, было то, что Spring Security требовал некоторых дополнительных исключений для получения последних версий Spring. Конечно, это было сообщено мне из-за следующей загадочной ошибки
------------------------------------------------------------------------------- Test set: org.appfuse.dao.LookupDaoTest ------------------------------------------------------------------------------- Tests run: 1, Failures: 0, Errors: 1, Skipped: 0, Time elapsed: 0.004 sec <<< FAILURE! testGetRoles(org.appfuse.dao.LookupDaoTest) Time elapsed: 0.001 sec <<< ERROR! java.lang.NoSuchMethodError: org.springframework.context.support.GenericApplicationContext.getEnvironment()Lorg/springframework/core/env/ConfigurableEnvironment; at org.springframework.test.context.support.AbstractGenericContextLoader.loadContext(AbstractGenericContextLoader.java:97) at org.springframework.test.context.support.AbstractGenericContextLoader.loadContext(AbstractGenericContextLoader.java:1) at org.springframework.test.context.support.DelegatingSmartContextLoader.loadContext(DelegatingSmartContextLoader.java:228) at org.springframework.test.context.TestContext.loadApplicationContext(TestContext.java:124) at org.springframework.test.context.TestContext.getApplicationContext(TestContext.java:148) at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.injectDependencies
(DependencyInjectionTestExecutionListener.java:109)
Без этих дополнительных исключений Spring Security вытащил Spring 3.0.6. Мне пришлось исключить spring-expression, spring-context и spring-web из taglibs Spring-security, чтобы получить версию Spring для 3.1.0.RELEASE.
<dependency> <groupId>org.springframework.security</groupId> <artifactId>spring-security-taglibs</artifactId> <version>${spring.security.version}</version> <exclusions> <exclusion> <groupId>org.springframework</groupId> <artifactId>spring-expression</artifactId> </exclusion> <exclusion> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> </exclusion> <exclusion> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> </exclusion> </exclusions> </dependency>
Мне также пришлось исключить Spring-context из Spring-Security-Config, а Spring-Context и Spring-выражение из Spring-Security-Core. Разве Maven не замечательный?
<dependency> <groupId>org.springframework.security</groupId> <artifactId>spring-security-core</artifactId> <version>${spring.security.version}</version> <exclusions> <exclusion> <groupId>org.springframework</groupId> <artifactId>spring-expression</artifactId> </exclusion> <exclusion> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.springframework.security</groupId> <artifactId>spring-security-config</artifactId> <version>${spring.security.version}</version> <exclusions> <exclusion> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> </exclusion> </exclusions> </dependency>
После внесения этих изменений я продвинулся немного дальше, но в итоге был заблокирован ошибкой в поддержке Spring в Tapestry 5 . По сути, после обновления до Spring 3.1 я начал видеть следующую ошибку:
java.lang.RuntimeException: Service id 'environment' has already been defined by org.apache.tapestry5.services.TapestryModule.buildEnvironment(PerthreadManager)
К счастью, я смог легко это исправить с помощью совета, который я нашел в списке рассылки Tapestry . К сожалению, хотя я и представил исправление 15 декабря, оно не попало в релиз Tapestry 5.3.1 21 декабря . Как только выйдет Tapestry 5.3.2, я надеюсь, что сборка AppFuse снова пройдет (в настоящее время она не работает ).
Я надеюсь, что эта статья поможет вам обновить приложения, запущенные в AppFuse, до последних версий Spring и Spring Security. В течение следующих нескольких недель я буду изучать многие
новые функции Spring 3.1 и реализовывать их по своему усмотрению. Сейчас я думаю о средах / профилях, поддержке Servlet 3 / Java 7 и поддержке Hibernate 4. Похоже, это лучшие новые функции, о которых я узнал за
несколько недель .
От http://raibledesigns.com/rd/entry/upgrading_appfuse_to_spring_security