Spring mvc / security:从spring security中删除登录页面

时间:2014-01-02 00:01:12

标签: java spring spring-mvc spring-security

我使用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>

的LoginController

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

<intercept-url pattern="/game*" access="ROLE_USER" />

并删除

<http pattern="/login" security="none"/>

一切都按预期工作。它非常奇怪,无法弄清楚为什么会这样。

修改

刚刚创建了我的示例项目(maven)的一个小版本并上传到: fileswap。 任何帮助或建议将非常酷,因为我仍然感到困惑。

2 个答案:

答案 0 :(得分:2)

尝试插入以下行:

<intercept-url pattern="/login/**" access="ROLE_ANONYMOUS,ROLE_USER" />
<intercept-url pattern="/failedlogin/**" access="ROLE_ANONYMOUS,ROLE_USER" />
<intercept-url pattern="/view_register/**" access="ROLE_ANONYMOUS,ROLE_USER" />
<http>之后

,并在auto-config="true"内添加<http>

<http auto-config="true">

    <intercept-url pattern="/login/**" access="ROLE_ANONYMOUS,ROLE_USER" />
    <intercept-url pattern="/failedlogin/**" access="ROLE_ANONYMOUS,ROLE_USER" />
    <intercept-url pattern="/view_register/**" access="ROLE_ANONYMOUS,ROLE_USER" />

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

并删除:

<http pattern="/login" security="none"/>

我不知道这条线的用途,但没有它就行。

有关匿名身份验证的详细信息,请参阅Spring Security Reference(需要了解的重要一点是,如果匿名用户可以访问某个网页,则不会自动表示经过身份验证的用户可以访问它也是。)

BWT,ROLE_ANONYMOUS是一个内置角色,但ROLE_USER不是,正如here所解释的那样。您需要确保为用户分配了ROLE_USER

This answer解释了为什么模式应以/**结尾。

答案 1 :(得分:0)

尝试使用此配置,允许匿名访问这些网址:

<http>
        <intercept-url pattern="/**" access="ROLE_USER" />
        <intercept-url pattern="/login" access="IS_AUTHENTICATED_ANONYMOUSLY"/>
        <intercept-url pattern="/view_register.htm" access="IS_AUTHENTICATED_ANONYMOUSLY"/>
        <form-login login-page="/login" default-target-url="/game" authentication-failure-url="/failedlogin" />
        <logout logout-success-url="/login" />
</http>

指定以下内容时:

<intercept-url pattern="/game*" access="ROLE_USER" />

只有~/game*这样的网址才会受到保护,所有其他网址都不受保护。

相关问题