21

我无法准确地发现我需要实现什么才能使用 Spring Security 在我的 Web 应用程序中使用自定义身份验证方法。我有一个带有 Spring Security 插件的 Grails 应用程序,该插件当前使用标准用户/密码身份验证和浏览器表单。这工作正常。

我需要实现一种机制来实现一种MAC身份验证。如果 HTTP 请求包含多个参数(例如用户标识符、时间戳、签名等),我需要获取这些参数,执行一些散列和签名/时间戳比较,然后对用户进行身份验证。

我不是 100% 确定从哪里开始。我需要扩展/实现哪些 Spring Security 类?我已经阅读了参考文档并且对这些概念有一个很好的理解,但我不确定我是否需要过滤器、提供者或管理器,或者在哪里/如何准确地创建身份验证对象。我一直在尝试扩展AbstractProcessingFilter和/或实现AuthenticationProvider,但我只是理解如何让它们都玩得很好。

4

3 回答 3

23
  1. 实现一个自定义AuthenticationProvider,从Authentication: getCredentials()getDetails()getPrincipal().

    使用以下配置片段将其绑定到您的 Spring Security 身份验证机制中:

<bean id="myAuthenticationProvider" class="com.example.MyAuthenticationProvider">
    <security:custom-authentication-provider />
</bean>
  1. 如果您可以从标准实现中找到合适的步骤,则此步骤是可选的。如果没有,请实现一个扩展Authentication接口的类,您可以在其上放置身份验证参数:

    (e.g. a user identifier, timestamp, signature, etc.)
    
  2. 扩展一个SpringSecurityFilter将上述两个类联系在一起的自定义。例如,过滤器可能会使用您的实现作为输入来获取AuthenticationManager和调用。authenticate()Authentication

    您可以扩展AbstractAuthenticationProcessingFilter作为开始。

    您可以参考扩展的UsernamePasswordAuthenticationFilterAbstractAuthenticationProcessingFilterUsernamePasswordAuthenticationFilter实现标准的用户名/密码认证。

  3. 配置您的 Spring Security 以添加或替换标准AUTHENTICATION_PROCESSING_FILTER. 有关 Spring Security 过滤器的订单,请参阅http://static.springsource.org/spring-security/site/docs/3.0.x/reference/ns-config.html#filter-stack

    以下是如何用您的实现替换它的配置片段:

<beans:bean id="myFilter" class="com.example.MyAuthenticationFilter">
    <custom-filter position="AUTHENTICATION_PROCESSING_FILTER"/>
</beans:bean>
于 2009-04-10T11:37:31.453 回答
1

下面是一个使用自定义 autenticationFilter(扩展 AUTHENTICATION_PROCESSING_FILTER)和 authenticationProvider 的 securityContext.xml 配置文件示例。用户认证数据由 jdbc 连接提供。配置适用于 Spring Security 2.0.x

<?xml version="1.0" encoding="UTF-8"?>

 <sec:global-method-security />

 <sec:http auto-config="false" realm="CUSTOM" create-session="always" servlet-api-provision="true"
  entry-point-ref="authenticationProcessingFilterEntryPoint" access-denied-page="/notauthorized.xhtml"
  session-fixation-protection="migrateSession">
  <sec:port-mappings>
   <sec:port-mapping http="80" https="443" />
  </sec:port-mappings>

  <sec:anonymous granted-authority="ROLE_ANONYMOUS" username="Anonymous" />
  <sec:intercept-url pattern="/**" access="ROLE_ANONYMOUS, ROLE_USER" />

  <sec:logout logout-url="/logoff" logout-success-url="/home.xhtml" invalidate-session="false" />

 </sec:http>

 <bean id="authenticationProcessingFilterEntryPoint" class="org.springframework.security.ui.webapp.AuthenticationProcessingFilterEntryPoint">
  <property name="loginFormUrl" value="/login.xhtml" />
  <property name="forceHttps" value="false" />
 </bean>

 <bean id="authenticationProcessingFilter" class="mypackage.CustomAuthenticationProcessingFilter">
  <sec:custom-filter position="AUTHENTICATION_PROCESSING_FILTER" />
  <property name="defaultTargetUrl" value="/" />
  <property name="filterProcessesUrl" value="/logon" />
  <property name="authenticationFailureUrl" value="/loginError.xhtml" />
  <property name="alwaysUseDefaultTargetUrl" value="false" />
  <property name="authenticationManager" ref="authenticationManager" />
 </bean>

 <jee:jndi-lookup id="securityDataSource" jndi-name="jdbc/DB_DS" /> 

 <bean id="myUserDetailsService" class="mypackage.CustomJdbcDaoImpl">
  <property name="dataSource" ref="securityDataSource" />
  <property name="rolePrefix" value="ROLE_" />
 </bean>

 <bean id="apcAuthenticationProvider" class="mypackage.CustomDaoAuthenticationProvider">
  <property name="userDetailsService" ref="myUserDetailsService" />
  <sec:custom-authentication-provider />
 </bean>

 <bean id="authenticationManager" class="org.springframework.security.providers.ProviderManager">
  <property name="providers">
   <list>
    <ref local="apcAuthenticationProvider" />
   </list>
  </property>
 </bean>

</beans>
于 2010-11-18T08:44:52.200 回答
1

我最近提出了一个使用 Spring Security 3 进行自定义身份验证的示例应用程序。源代码在这里。更多细节在这篇博文中。

于 2011-07-19T00:52:35.533 回答