使用XML配置的Spring Security不会对用户进行身份验证

时间:2014-09-02 20:04:50

标签: java spring spring-security

我有一个网站部分(/secure URL下的所有内容),我试图使用Spring Security 3.2.5保护。我使用以下XML配置:

<http use-expressions="true">
    <intercept-url pattern="/secure/login" access="permitAll" />
    <intercept-url pattern="/secure/**" access="isAuthenticated()" />
    <form-login default-target-url="/secure/home" always-use-default-target="true" login-page="/secure/login" />
</http>

<authentication-manager>
    <authentication-provider>
        <user-service>
            <user name="user" password="password" authorities="ROLE_SECURE" />
        </user-service>
    </authentication-provider>
</authentication-manager>

我试图使用我拥有此控制器的自定义登录表单:

@Controller
@RequestMapping(value = "/secure")
public class LoginController {
    @RequestMapping(value = "/login", method = RequestMethod.GET)
    public String getLogin() {
        return "secure/login";
    }

    @RequestMapping(value = "/home", method = RequestMethod.GET)
    public String getHome() {
        return "secure/home";
    }
}

并在登录页面内输入此代码:

<form method="POST" action="<c:url value="/secure/login" />">
    username: <input type="text" name="username" /><br/>
    password: <input type="password" name="password" /><br/>
    <input type="submit" value="Login" />
</form>

我使用web.xmlContextLoaderListenerspringSecurityFilterChain中加载了安全上下文 /secure委托代理过滤器也已设置。

当我尝试访问/secure/login网址时,我被重定向到getLogin,我的控制器在LoginController方法中被调用,我看到了我的登录页面。一切都好。

现在我的问题:我在登录表单中提交的任何内容都会直接发送到@RequestMapping(value = "/login", method = RequestMethod.POST) public String postLogin() { return "redirect:/secure/home"; } ,我得到一个例外,说POST不受支持 方法,这是有道理的,因为控制器中没有POST处理程序。

如果我在控制器中添加这样的方法:

postLogin

我不再收到错误,但调用了我的/secure/home方法,我发送给/secure/login未经身份验证,然后将我重定向到/secure,然后我回到原点。

我不知道自己做错了什么。我在网上看到的所有示例都是Java配置,我不想使用它,并且所有工作流都在应用程序的上下文中,而不是在一些额外的URL路径下(在我的情况下为{{1}})。

我错过了什么?

2 个答案:

答案 0 :(得分:1)

形成文档(http://docs.spring.io/spring-security/site/docs/3.0.x/reference/appendix-namespace.html):

默认目标-网址

映射到UsernamePasswordAuthenticationFilter的defaultTargetUrl属性。如果未设置,则默认值为&#34; /&#34; (应用程序根目录)。登录后,用户将被带到此URL,前提是他们在尝试访问受保护资源时未被要求登录,而这些用户将被带到最初请求的URL。

您必须将表单提交至j_spring_security_check

<form name='loginForm'
          action="<c:url value='j_spring_security_check' />" method='POST'>

这将由Spring Security处理,并将根据您的配置检查用户并传递。 请参阅此示例http://www.mkyong.com/spring-security/spring-security-form-login-example/

修改:还应支持j_security_check

答案 1 :(得分:0)

这篇文章帮助我得到了正确的结果:http://codehustler.org/blog/spring-security-tutorial-form-login/