Статьи

Обновление AppFuse до Spring Security 3.1 и Spring 3.1

Перед праздником я потратил некоторое время на обновление 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