2014-10-17 14 views
6

Trong một ứng dụng Xuân An 3.2 dựa Tôi có một rõ ràng cấu hình UsernamePasswordAuthenticationFilter, mà cần một tham chiếu đến sessionAuthenticationStrategy (theo thứ tự để gọi .onAuthentication). *Làm thế nào để có được một tham chiếu đến SessionAuthenticationStrategy mà không cần cấu hình chiến lược rõ ràng?

Các sessionAuthenticationStrategy là một trong những mặc định được tạo ra bởi <security:http> (HttpSecurityBeanDefinitionParser).

Câu hỏi của tôi: Làm cách nào để tôi có thể tham chiếu đến SessionAuthenticationStrategy mà không định cấu hình hoàn thành SessionAuthenticationStrategy explicite, để tôi có thể đưa tham chiếu này vào cấu hình XML?

<security:http auto-config="false" use-expressions="true" 
    entry-point-ref="loginUrlAuthenticationEntryPoint" 
    access-decision-manager-ref="httpAccessDecisionManager"> 
    ... 
    <security:custom-filter 
      ref="usernamePasswordAuthenticationFilter" 
      position="FORM_LOGIN_FILTER"/> 
    ... 
</security:http> 

... 

<bean id="usernamePasswordAuthenticationFilter" 
    class=" o.s.scurity.web.authentication.UsernamePasswordAuthenticationFilter"> 

    <property name="sessionAuthenticationStrategy" ref="????"> <!-- ?? -> 
    ... 
</bean> 

* tôi thực UsernamePasswordAuthenticationFilter là một lớp con tùy chỉnh, nhưng đó không phải vấn đề cho câu hỏi này

+0

Tôi mở một vấn đề tham khảo câu hỏi này. https://github.com/spring-projects/spring-security/issues/3995 – mhnagaoka

Trả lời

3

Tôi sợ không có cách nào rõ ràng để có được nó.

Nhưng tất cả các ví dụ trong tài liệu tham khảo của nhãn hiệu mùa xuân-an ninh là chặt chẽ về điều đó: bạn thậm chí không nên muốn có được nó: tất cả cho thấy một rõ ràng SessionAuthenticationStrategy tiêm trong UserNamePasswordAuthenticationFilter và nếu thích hợp trong SessionManagementFilter.

Theo javadocs của 2 loại cổ phiếu này, mặc định SessionAuthenticationStrategy là:

  • SessionFixationProtectionStrategy cho Servlet < 3.1
  • ChangeSessionIdAuthenticationStrategy cho Servlet 3.1+

Vì vậy, một cách chính xác là tạo ra một bean thực hiện SessionAuthenticationStrategy hoặc một trong các giá trị mặc định ở trên hoặc một triển khai khác nếu bạn có nhu cầu đặc biệt và sử dụng nó bất cứ nơi nào bạn cần. Tất nhiên, bạn luôn có thể sử dụng sự phản chiếu để truy cập các thành viên riêng tư của lớp triển khai bảo mật mùa xuân, nhưng bạn biết đó là xấu và có nguy cơ cao bị vỡ trong bản phát hành bảo mật mùa xuân tiếp theo.

3

Tôi đã xem qua số HttpSecurityBeanDefinitionParser (và HttpConfigurationBuilder.createSessionManagementFilters()) là lớp có trách nhiệm phân tích cú pháp thẻ security:http và để tạo hạt SessionAuthenticationStrategy.

Vì vậy, tôi biết rằng Bảo mật mùa xuân 3.2.5.RELEASE tạo (trong cấu hình của tôi) một hạt CompositeSessionAuthenticationStrategy và sử dụng điều này làm chiến lược phiên. đậu này sẽ lấy tên mặc định: org.springframework.security.web.authentication.session.CompositeSessionAuthenticationStrategy#0

Vì vậy, cách giải quyết hiện tại của tôi là phải có một tài liệu tham khảo để đậu này, theo tên của nó:

<bean id="usernamePasswordAuthenticationFilter" 
    class=" o.s.scurity.web.authentication.UsernamePasswordAuthenticationFilter"> 

    <property name="sessionAuthenticationStrategy"> 
     <ref 
      bean="org.springframework.security.web.authentication.session.CompositeSessionAuthenticationStrategy#0"/>     
    </property> 
    ... 
</bean> 

workaround này có một số hạn chế nghiêm trọng:

  • khi một phiên bản mới hơn của bảo mật mùa xuân hoạt động theo cách khác (tạo một bean khác) thì nó sẽ thất bại.
  • khi có một khác tên CompositeSessionAuthenticationStrategy Thats là tạo ra với ReaderContext.generateBeanName sau đó phương pháp này có thể thất bại, vì #0 có thể trở thành #1 (phụ thuộc vào thứ tự mà các hạt cà phê được tạo ra)
1

Khi làm việc với JavaConfig (tôi sợ không phải là trường hợp của bạn), bạn có thể nhận được một tài liệu tham khảo bằng cách làm

 http.getConfigurer(SessionManagementConfigurer.class).init(http); 
     http.getSharedObject(SessionAuthenticationStrategy.class); 
1

Mở rộng trên Ralph's answer, bạn có thể sử dụng một FactoryBean để có được một tham chiếu đến AuthenticationStrategy.

public class SessionAuthenticationStrategyFactoryBean implements BeanFactoryAware, FactoryBean<SessionAuthenticationStrategy> { 

    private BeanFactory beanFactory; 

    @Override 
    public void setBeanFactory(BeanFactory beanFactory) throws BeansException { 
     this.beanFactory = beanFactory; 
    } 

    @Override 
    public SessionAuthenticationStrategy getObject() throws Exception { 
     final CompositeSessionAuthenticationStrategy sas = beanFactory.getBean(CompositeSessionAuthenticationStrategy.class); 
     return sas; 
    } 

    @Override 
    public Class<?> getObjectType() { 
     return SessionAuthenticationStrategy.class; 
    } 

    @Override 
    public boolean isSingleton() { 
     return true; 
    } 
} 

... và làm cho nó có sẵn trên bạn cấu hình XML:

<bean id="sas" class="com.example.SessionAuthenticationStrategyFactoryBean" /> 

<bean id="usernamePasswordAuthenticationFilter" 
    class=" o.s.scurity.web.authentication.UsernamePasswordAuthenticationFilter"> 

    <property name="sessionAuthenticationStrategy" ref="sas"> 
    ... 
</bean> 
Các vấn đề liên quan