spring security 改变 spring_security_login 表单

Posted

技术标签:

【中文标题】spring security 改变 spring_security_login 表单【英文标题】:spring security changing spring_security_login form 【发布时间】:2011-03-09 13:22:50 【问题描述】:

我正在使用 Spring Security,我想知道如何更改默认登录表单

我发现我需要指向我的新表单位置。我想保留具有所有登录异常显示的现有默认表单的现有功能。所以我必须先知道如何复制它。

在我的研究中,我遇到了它

http://www.codercorp.com/blog/spring/security-spring/spring-security-login-logout-form.html

感谢他的代码

<%@ taglib prefix='c' uri='http://java.sun.com/jstl/core_rt' %>
<%@ page import="org.springframework.security.ui.AbstractProcessingFilter" %>
<%@ page import="org.springframework.security.ui.webapp.AuthenticationProcessingFilter" %>
<%@ page import="org.springframework.security.AuthenticationException" %>

<html>
  <head>
    <title>Login</title>
  </head>

  <body>
    <h1>Login</h1>

    <c:if test="$not empty param.login_error">
      <font color="red">
        Your login attempt was not successful, try again.<br/><br/>
        Reason: <c:out value="$SPRING_SECURITY_LAST_EXCEPTION.message"/>.
      </font>
    </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='<c:if test="$not empty param.login_error"><c:out value="$SPRING_SECURITY_LAST_USERNAME"/></c:if>'/></td></tr>
        <tr><td>Password:</td><td><input type='password' name='j_password'></td></tr>
        <tr><td><input type="checkbox" name="_spring_security_remember_me"></td><td>Don't ask for my password for two weeks</td></tr>

        <tr><td colspan='2'><input name="submit" type="submit"></td></tr>
        <tr><td colspan='2'><input name="reset" type="reset"></td></tr>
      </table>
    </form>
  </body>
</html>

但代码似乎不适用于 spring security 3. 一些已过时的库,我将它们一一替换。我把它们改成下面这个

<%@ page import="org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter" %>
<%@ page import="org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter" %>
<%@ page import="org.springframework.security.core.AuthenticationException" %>

但它仍然拒绝报告登录错误。我还应该尝试什么?

【问题讨论】:

【参考方案1】:

当您使用自定义登录页面时,Spring Security 不会自动指定您的登录页面是由于登录错误而显示的。您应该手动执行,通常通过向authentication-failure-url 添加参数,您的代码需要一个名为login_error 的参数:

<form-login 
    login-page="/login.htm" 
    authentication-failure-url = "/login.htm?login_error=1" />

【讨论】:

重点是,谢谢!我没有意识到 param.login_error 的错是参数...【参考方案2】:

您还记得更新您的 Spring Security 应用程序上下文 xml 配置吗?这是我的一个示例:

<http auto-config="true">
  <intercept-url pattern="/login.htm" access="ROLE_ANONYMOUS,ROLE_USER" />
  <intercept-url pattern="/**" access="ROLE_USER" />
  <form-login login-page="/login.htm" default-target-url="/home.htm" />
  <logout logout-url="/logout.htm" logout-success-url="/home.htm"/>
</http>

所以 form-login 标签允许你设置一个自定义的登录页面。您还需要记住将登录页面的访问权限授予匿名角色,否则任何人都无法访问登录页面。

【讨论】:

我的登录页面确实出现了。但是当我尝试让它报告登录错误时,它没有显示错误。我在想jsp页面上是否有我错过的东西或者是访问权限问题

以上是关于spring security 改变 spring_security_login 表单的主要内容,如果未能解决你的问题,请参考以下文章

spring security

Spring Boot Security 忽略 cors 配置

Spring Security bcrypt 编码登录不起作用

如何在 Spring Security 3 中设置用户角色?

Spring Security 在运行时动态添加/删除 antMatchers 和角色

Jersey Spring-Security HTML AJAX 未按预期工作