如何使用Spring Security/Spring MVC处理表单登录

Dav*_*rks 17 java spring-mvc spring-security

简单的问题,我只需要一个正确方向的指针:

我有一个简单的Spring MVC/Spring Security webapp.起初,我成立了春季安全,这样的默认登录页显示,妥善认证(我实现了UserDetailsServiceDaoAuthenticationProvider要做到这一点).

下一步:使用我的登录页面替换默认的spring登录页面并发布凭据.

但是我如何处理提交的登录凭据?我假设我将表单发布到控制器,验证凭据,但我不清楚在此之后正确的步骤是什么.例如:

  • 我在调用AuthenticationManager的方法吗?
  • 我需要为此定义一个bean吗?
  • 是否有我需要实现的接口/服务,如AuthenticationEntryPoint或其他什么?

我已经完成了3次文档,并没有完全遵循它们.我知道这很简单,所以我只需要听听过程应该如何流动.

Dav*_*rks 20

我会为将来阅读此内容的人添加澄清答案:

当您在spring security中定义标记时,它将为您处理登录,我将详细介绍它的工作原理(希望它在文档中详细说明):

<security:http auto-config="true">
    <security:form-login login-page="/login"
         login-processing-url="/postlogin"
         default-target-url="/myaccount"
         authentication-failure-url="/login?loginError=true" />
    <security:logout logout-url="/logout" />
</security:http>
Run Code Online (Sandbox Code Playgroud)

登录页面是登录页面的URL.你应该有一个服务于这个页面的控制器(或静态HTML页面),这是你漂亮的登录表单.

登录处理-URL是其中表单登录组件处理的URL.就像表单登录组件为此页面实现了自己的控制器一样.您应该将表单发布到此页面.您还需要知道如何命名您的用户名/密码参数"j_username"和"j_login"

除此之外,以及上面其他相当明显的选项,您应该实现一个UserDetailsService- 即创建一个类并实现UserDetailsService获取并返回UserDetails给定用户名的对象(用户名/密码)的接口- 并提供UserDetails具有其余安全配置的对象:

<security:authentication-manager>
        <security:authentication-provider ref="daoAuthenticationProvider" />
</security:authentication-manager>

<bean id="daoAuthenticationProvider"
    class="org.springframework.security.authentication.dao.DaoAuthenticationProvider" >
    <property name="userDetailsService" ref="myAuthorizationService" />
</bean>
Run Code Online (Sandbox Code Playgroud)

  • 请注意,在Spring Security 4+中,用户名/密码参数现在默认为"username"和"password" (2认同)

Nee*_*aks 11

Spring Security 参考文档概述了Web应用程序5.4身份验证的基本处理流程.有点#6:

接下来,服务器将决定所呈现的凭证是否有效.如果它们有效,下一步就会发生.如果它们无效,通常会要求您的浏览器重试(因此您将返回上面的第二步).

...

Spring Security有不同的类负责上述大多数步骤.主要参与者(按照它们使用的顺序)是ExceptionTranslationFilter,AuthenticationEntryPoint和" 认证机制 ",它负责调用我们在上一节中看到的AuthenticationManager.

我不得不承认,这里的文档有点令人困惑所以我会给你一些指针 - 这里提到的" 身份验证机制 "就是你所追求的东西,它负责处理浏览器发送的凭据.

由于将凭证附加到HTTP请求的细节在不同的身份验证方法(表单数据与普通标头与摘要标头)之间差异很大,因此没有通用的" 身份验证机制 " - 相反,每个方法都实现了自己的机制和在基于Web的身份验证的情况下,它通常是您必须配置的特殊过滤器web.xml.

在您的情况下,您很可能对UsernamePasswordAuthenticationFilter感兴趣- 这用于处理基本的基于表单的登录信息.您的自定义登录表单和过滤器之间的合同是URL(发布表单的位置)+用户名和密码字段名称:

登录表单只包含j_username和j_password输入字段,并发布到过滤器监视的URL(默认情况下为/ j_spring_security_check).