我有一个网站部分(/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>
我使用 ContextLoaderListener
在 web.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/