2013-02-12 16 views
6

tôi cần an ninh của tôi để có logic sau đây:Tuỳ mùa xuân Filters 3.0 An ninh, Nhiều điểm nhập, AuthenticationProvider

  1. Kiểm tra sự hiện diện của một tham số tiêu đề
  2. Tùy thuộc vào sự hiện diện của paremeter làm hoặc là một chuyển hướng đến trang đăng nhập (nếu không được xác thực) hoặc kiểm tra mã xác thực cơ bản

Trong cả hai trường hợp, tôi có cùng nhà cung cấp xác thực nhưng tôi không thể làm việc đó. Các entrypoint ủy thác hoạt động tốt, nhưng tôi không bao giờ nhận được vào authenticationprovider tùy chỉnh của tôi ...

Dưới đây là cấu hình an ninh của tôi:

<security:global-method-security 
    secured-annotations="enabled" /> 

<security:http entry-point-ref="delegatingAuthenticationEntryPoint" 
    use-expressions="true" auto-config="false"> 
    <!-- <security:custom-filter position="FORM_LOGIN_FILTER" --> 
    <!-- ref="usernamePasswordAuthenticationFilter" /> --> 
    <!-- <security:custom-filter position="BASIC_AUTH_FILTER" --> 
    <!-- ref="basicAuthenticationFilter" /> --> 
    <security:intercept-url pattern="/login*" 
     filters="none" /> 
    <security:intercept-url pattern="/portimaLogin*" 
     filters="none" /> 
    <security:intercept-url pattern="/**" 
     access="isAuthenticated()" /> 
</security:http> 

<bean id="delegatingAuthenticationEntryPoint" 
    class="org.springframework.security.web.authentication.DelegatingAuthenticationEntryPoint"> 
    <constructor-arg> 
     <map> 
      <entry key="hasHeader('portima','true')" value-ref="PortimaLoginUrlAuthenticationEntryPoint" /> 
     </map> 
    </constructor-arg> 
    <property name="defaultEntryPoint" ref="authenticationEntryPoint" /> 
</bean> 

<bean id="usernamePasswordAuthenticationFilter" 
    class="org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter"> 
    <property name="authenticationManager" ref="authenticationManager" /> 
    <property name="authenticationFailureHandler" ref="authenticationFailureHandler" /> 
</bean> 

<bean id="basicAuthenticationFilter" 
    class="org.springframework.security.web.authentication.www.BasicAuthenticationFilter"> 
    <property name="authenticationManager" ref="authenticationManager" /> 
    <property name="authenticationEntryPoint" ref="authenticationEntryPoint" /> 
</bean> 

<bean id="PortimaLoginUrlAuthenticationEntryPoint" 
    class="be.ap.common.security.spring.PortimaLoginUrlAuthenticationEntryPoint"> 
    <property name="loginFormUrl" value="${portima.login.page}" /> 
</bean> 

<bean id="authenticationEntryPoint" 
    class="org.springframework.security.web.authentication.www.BasicAuthenticationEntryPoint"> 
    <property name="realmName" value="AP" /> 
</bean> 

<security:authentication-manager alias="authenticationManager"> 
    <security:authentication-provider 
     ref="authenticationProvider" /> 
</security:authentication-manager> 

<bean id="authenticationProvider" class="be.ap.common.security.spring.APAuthenticationProvider" /> 

<bean id="userDetailsService" class="be.ap.common.security.spring.APUserDetailsService" /> 

Bất kỳ ý tưởng?

+0

Trình xác thực tùy chỉnh của bạn có thực hiện đúng phương thức 'supports()' không? Nếu nó trả về false cho lớp 'UsernamePasswordAuthenticationToken', thì nó sẽ không bao giờ được yêu cầu xử lý mã thông báo xác thực được tạo bởi các bộ lọc của bạn. – zagyi

+0

Nó thậm chí không đi theo phương thức hỗ trợ ... –

+0

@Override hỗ trợ boolean công khai (Lớp xác thực) { trả về Tên người dùngPasswordAuthenticationToken.class.isAssignableFrom (xác thực); } –

Trả lời

12

Cuối cùng tôi cũng có nó hoạt động.

Đây là tập tin bối cảnh của tôi:

<security:http entry-point-ref="delegatingAuthenticationEntryPoint" 
    use-expressions="true"> 
    <security:custom-filter position="PRE_AUTH_FILTER" 
     ref="preAuthenticationFilter" /> 
    <security:custom-filter position="FORM_LOGIN_FILTER" 
     ref="usernamePasswordAuthenticationFilter" /> 
    <security:custom-filter position="BASIC_AUTH_FILTER" 
     ref="basicAuthenticationFilter" /> 
    <security:intercept-url pattern="/login*" 
     filters="none" /> 
    <security:intercept-url pattern="/portimaLogin*" 
     filters="none" /> 
    <security:intercept-url pattern="/accessDenied*" 
     filters="none" /> 
    <security:intercept-url pattern="/**" 
     access="isAuthenticated()" /> 
    <security:access-denied-handler ref="accessDeniedHandler" /> 
</security:http> 

<!-- Spring Security Custom Filters --> 

<bean id="usernamePasswordAuthenticationFilter" 
    class="org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter"> 
    <property name="authenticationManager" ref="authenticationManager" /> 
    <property name="authenticationFailureHandler" ref="authenticationFailureHandler" /> 
</bean> 

<bean id="basicAuthenticationFilter" 
    class="org.springframework.security.web.authentication.www.BasicAuthenticationFilter"> 
    <property name="authenticationManager" ref="authenticationManager" /> 
    <property name="authenticationEntryPoint" ref="authenticationEntryPoint" /> 
</bean> 

<bean id="preAuthenticationFilter" class="be.ap.common.security.spring.APPreAuthenticationFilter"> 
    <property name="authenticationManager" ref="authenticationManager" /> 
</bean> 

<!-- Spring Security Custom EntryPoint --> 

<bean id="delegatingAuthenticationEntryPoint" 
    class="org.springframework.security.web.authentication.DelegatingAuthenticationEntryPoint"> 
    <constructor-arg> 
     <map> 
      <entry key="hasHeader('portima','true')" value-ref="PortimaLoginUrlAuthenticationEntryPoint" /> 
     </map> 
    </constructor-arg> 
    <property name="defaultEntryPoint" ref="authenticationEntryPoint" /> 
</bean> 

<bean id="PortimaLoginUrlAuthenticationEntryPoint" 
    class="be.ap.common.security.spring.PortimaLoginUrlAuthenticationEntryPoint"> 
    <property name="loginFormUrl" value="${portima.login.page}" /> 
</bean> 

<bean id="authenticationEntryPoint" 
    class="be.ap.common.security.spring.APBasicAuthenticationEntryPoint"> 
    <property name="realmName" value="AP" /> 
</bean> 
<bean id="accessDeniedHandler" 
    class="org.springframework.security.web.access.AccessDeniedHandlerImpl"> 
    <property name="errorPage" value="/accessDenied" /> 
</bean> 

<bean id="authenticationFailureHandler" 
    class="org.springframework.security.web.authentication.ExceptionMappingAuthenticationFailureHandler"> 
    <property name="exceptionMappings"> 
     <props> 
      <prop 
       key="org.springframework.security.authentication.BadCredentialsException"> 
       /accessDenied 
      </prop> 
      <prop 
       key="org.springframework.security.authentication.CredentialsExpiredException"> 
       /accessDenied 
      </prop> 
      <prop key="org.springframework.security.authentication.LockedException"> 
       /accessDenied 
      </prop> 
      <prop 
       key="org.springframework.security.authentication.DisabledException"> 
       /accessDenied 
      </prop> 
     </props> 
    </property> 
</bean> 

<!-- Spring Security Authentication Manager --> 

<security:authentication-manager alias="authenticationManager"> 
    <security:authentication-provider 
     ref="authenticationProvider" /> 
</security:authentication-manager> 

<bean id="authenticationProvider" class="be.ap.common.security.spring.APAuthenticationProvider" /> 

<bean id="userDetailsService" class="be.ap.common.security.spring.APUserDetailsService" /> 

<!-- for Mock --> 
<bean id="SSOService" class="be.ap.security.service.SSOServiceMockImpl" /> 

Như bạn có thể thấy tôi bổ sung thêm một vài điều quá.

Để khắc phục, tôi sửa lại thuộc tính tự động định cấu hình, bỏ chọn bộ lọc và xác định chúng đúng cách.

Đối với những người muốn có một sự hiểu biết nhanh chóng của những gì nó làm, đây là dòng chảy:

  1. PRE_AUTH_FILTER sẽ kiểm tra một SSO như dịch vụ để điền trước các đối tượng xác thực (nếu đã được chứng thực trong SSO)
  2. delegatingAuthenticationEntryPoint sau đó sẽ chọn cách xác thực tùy thuộc vào tiêu đề yêu cầu
  3. hai cách là:
    • tùy chỉnh LoginUrlAuthenticationEntryPoint
    • tùy chỉnh BasicAuthenticationEntryPoint

BasicAuth và LoginURLAuth sử dụng AuthenticationProvider tương tự khi PreAuth sử dụng dịch vụ SSO của tôi.

Hy vọng nó sẽ giúp người khác!