如何实现Spring的预认证过滤器?

Koo*_*inn 5 java spring web-applications spring-security

我正在尝试在我们的 Web 应用程序中实施预身份验证的安全性,但我不确定如何正确执行。没有那么多例子。而那些似乎比我们的设置要简单得多的设置。

我们在请求标头中以 XML 形式获取身份验证详细信息,其中包含名字、姓氏、用户 ID 和错误标记(如果发生)。

我正在扩展AbstractPreAuthenticatedProcessingFilter并在其getPreAuthenticatedPrincipal()提取标头,对其进行解组,并进行一些验证。

现在的问题:

  • 如果一切正常,我是不是把我未编组的 shibboleth 从 getPreAuthenticatedPrincipal()
  • 如果出了什么问题,我就扔一个PreAuthenticatedCredentialsNotFoundException吗?
  • 我从getPreAuthenticatedCredentials()什么地方回来?是否"N/A"足够?

我想在某些时候我还没有创建一个Authentication和一个Principal.

  • 这是一个好方法吗?

    Principal dynamicUser = new DynamicUser(rijksregisterNummer);
    List<SimpleGrantedAuthority> grantedAuthorities = Arrays.asList(new SimpleGrantedAuthority("ROLE_USER"));
    Authentication authentication = new AnonymousAuthenticationToken(rijksregisterNummer, dynamicUser, grantedAuthorities);
    
    Run Code Online (Sandbox Code Playgroud)
  • 在什么时候(在哪个班级)我在 Spring Security 中设置它?

  • 我还需要扩展哪些其他类?

  • 如何配置 Spring Security 配置 XML?像这样?我错过了什么?

    <http>
      <custom-filter position="PRE_AUTH_FILTER" ref="myPreAuthFilter" />
    </http>
    
    <bean id="myPreAuthFilter" class="my.package.MyPreAuthenticationFilter">
      <property name="authenticationManager" ref="authenticationManager"/>
    </bean>
    
    <authentication-manager alias="authenticationManager">
      <authentication-provider ref="customAuthenticationProvider"/>
    </authentication-manager>
    
    Run Code Online (Sandbox Code Playgroud)

外部用户通过预认证(使用电子身份证和读卡器),然后点击我们的 Web 应用程序。但是,内部用户必须使用用户名和密码进行身份验证,这是正常的身份验证程序。

  • 我如何设置,当没有 shibboleth(因此来自我们内部用户的登录)时,我可以显示登录表单?

很多问题,我知道。我希望你能指导我通过。

小智 4

这是一个老问题但仍然相关。正如所说,有很多问题。引起我注意的是,没有太多示例实现。

我一直在玩一个实现。您可以在这里找到它: https: //github.com/klaalo/reqTokenAuth

它很容易与身份验证方法混合和匹配,WebSecurityConfigurerAdapter以便您可以为旧用户进行基于传统表单的身份验证。

该实现基于 Apache mod_auth_openidc位于应用程序前面的设置。然而,与Shibboleth SP一起实施也应该可以正常工作。

我不太明白您对在 HTTP 请求标头中以 XML 形式发送身份验证详细信息的看法。Shibboleth SP 是关于 SAML 身份验证的。您应该保留有关 SAML SP 身份验证的详细信息,并且仅在应用程序中享受易于身份验证的用户带来的好处。无需解组 XML,Shibboleth 会为您完成此操作。您可以将用户详细信息作为表示 HTTP 标头或HttpServletRequest属性中的 SAML 属性值的干净字符串(当使用 Tomcat/AJP 时)。