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

标签 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 的自定义登录表单:

@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>

我使用 ContextLoaderListenerweb.xml 中加载了安全上下文,并且 springSecurityFilterChain 委托(delegate)代理过滤器也已设置。

当我尝试访问 /secure URL 时,我被重定向到 /secure/login,我的 Controller 在 getLogin 方法中被调用,我看到了我的登录页面。没关系。

现在我的问题:我在登录表单中提交的任何内容都会直接发送到 LoginController 并且我收到一个异常,说 POST 不受支持 方法,这是有道理的,因为 Controller 中没有 POST 处理程序。

如果我在 Controller 中添加这样的方法:

@RequestMapping(value = "/login", method = RequestMethod.POST)
public String postLogin() {
    return "redirect:/secure/home";
}

我不再收到错误,但我的 postLogin 方法被调用,它将我发送到未经身份验证的 /secure/home ,然后将我重定向到 /secure/login 并且我回到了第一步。

我不知道我做错了什么。我在网上看到的所有示例都是 Java 配置的,我不喜欢使用它,并且所有工作流程都发生在应用程序的上下文中,而不是在某些额外的 URL 路径下(在我的例子中 /secure)。

我错过了什么?

最佳答案

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

默认目标网址:

映射到 UsernamePasswordAuthenticationFilter 的 defaultTargetUrl 属性。如果未设置,则默认值为“/”(应用程序根目录)。如果用户在尝试访问安全资源时没有被要求登录,则登录后将被带到此 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

关于java - 使用 XML 配置的 Spring Security 不会对用户进行身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25631477/

相关文章:

java - Java 数组上线程 "main"java.lang.NullPointerException 中的异常

java - 如何在 spring boot 远程 shell 中将参数和选项传递给自定义远程 shell 命令?

Java Spring Boot Hibernate、JPA、MVC、REST混淆

java - 使图像在 JFrame 内容 Pane 中可滚动

Java语法: switch case as variable?

java - 出现空指针异常但不知道如何修复它

java - PropertyEditorSupport 中的 getAsText() 何时被调用或调用

spring-mvc - Spring OAuth - 没有 PlatformTransactionManager 类型的合格 bean

spring - 如何 Autowiring 此 TokenStore

java - 自定义页面登录表单以利用 spring 登录身份验证