我正在使用Spring MVC + Security构建一个简单的Web应用程序,目前在登录方面遇到了问题。如果要保护/**(基本上是所有内容),我无法将登录页面从Spring Security中排除。以下是我的配置:
spring.security.xml
<http pattern="/login" security="none"/>
<http pattern="/view_register.htm" security="none"/>
<http>
<intercept-url pattern="/**" access="ROLE_USER" />
<form-login login-page="/login" default-target-url="/game" authentication-failure-url="/failedlogin" />
<logout logout-success-url="/login" />
</http>
登录控制器
@Controller
public class LoginLogoutController {
@RequestMapping(value="/login", method = RequestMethod.GET)
public String login(ModelMap model) {
return "login";
}
@RequestMapping(value="/failedlogin", method = RequestMethod.GET)
public String loginerror(ModelMap model) {
model.addAttribute("error", "true");
return "login";
}
}
login.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<html>
<head>
<title>Login Page</title>
<style>
.errorblock {
color: #ff0000;
background-color: #ffEEEE;
border: 3px solid #ff0000;
padding: 8px;
margin: 16px;
}
</style>
</head>
<body onload='document.f.j_username.focus();'>
<h3>Login with Username and Password (Custom Page)</h3>
<c:if test="${not empty error}">
<div class="errorblock">
Your login attempt was not successful, try again.<br /> Caused :
${sessionScope["SPRING_SECURITY_LAST_EXCEPTION"].message}
</div>
</c:if>
<form name='f' action="<c:url value='j_spring_security_check' />"
method='POST'>
<table>
<tr>
<td>User:</td>
<td><input type='text' name='j_username' value=''>
</td>
</tr>
<tr>
<td>Password:</td>
<td><input type='password' name='j_password' />
</td>
</tr>
<tr>
<td colspan='2'><input name="submit" type="submit"
value="submit" />
</td>
</tr>
<tr>
<td>Don't have an account yet.</td>
<td> <a href="<c:url value="view_register.htm" />" > Register here</a>
</td>
</tr>
</table>
</form>
</body>
</html>
我希望保护整个应用程序,但排除登录和注册页面。在我的当前配置中,整个安全性的行为非常奇怪。如果我输入错误的凭据,
@RequestMapping(value="/login", method = RequestMethod.GET)
public String login(ModelMap model) {
如果我输入错误的用户名/密码,将调用登录失败控制器方法,反之正确的用户名/密码将会调用该方法。
发现如果我修改
<intercept-url pattern="/**" access="ROLE_USER" />
to
<intercept-url pattern="/game*" access="ROLE_USER" />
并且删除
<http pattern="/login" security="none"/>
一切都按预期进行。这非常奇怪,真的无法弄清楚为什么会发生这种情况。
编辑
我刚刚创建了一个小版本的示例项目(maven),并上传到: fileswap。 任何帮助或建议都将非常酷,因为我仍然感到困惑。