Spring Security:身份验证导致 HTTP 405“方法不允许”

Posted

技术标签:

【中文标题】Spring Security:身份验证导致 HTTP 405“方法不允许”【英文标题】:Spring Security: Authentication results in HTTP 405 "Method not allowed" 【发布时间】:2020-06-23 19:53:40 【问题描述】:

我在 spring-security.xml 的代码中使用 csrf。 我认为这些问题与csrf有关。 所有代码都在工作,但 login.jsp 和 spring-security.xml 存在问题。 spring-security.xml 看起来像这样:

<http auto-config="true">
    <intercept-url pattern="/list" access="ROLE_USER"/>
    <intercept-url pattern="/security" access="isAnonymous()"/>

    <form-login login-page="/security"
                  default-target-url="/list"
                  authentication-failure-url="/security?error"
                  username-parameter="username"
                  password-parameter="password"/>
    <logout logout-success-url="/security?logout"/>
    <csrf disabled="true"/>
</http>


<authentication-manager>
    <authentication-provider>
        <user-service>
            <user name="user" password="password" authorities="ROLE_USER"/>
        </user-service>
    </authentication-provider>
</authentication-manager>

我的 LoginController 如下所示:

@Controller
public class LoginController 

    @RequestMapping(value = "/security", method = RequestMethod.GET)
    public String login(@RequestParam(value = "error", required = false) String error,
                         @RequestParam(value = "logout", required = false) String logout,
                         Model model) 
        if (error != null) 
            model.addAttribute("error", "Invalid username or password");
        
        if (logout != null) 
            model.addAttribute("msg", "You logout successfully");
        

        return "login";
    

这是我在 login.jsp 中的代码:

<body onload='document.loginForm.username.focus();'>
<div id="login-box">
    <h2>Insert Your Login and password:</h2>
    <c:if test="$not empty error">
        <div class="error">$error</div>
    </c:if>
    <c:if test="$not empty msg">
        <div class="msg">$msg</div>
    </c:if>
    <form name='loginForm' action="<c:url value='/security'/>" method="post">
        <table>
            <tr>
                <td>User:</td>
                <td><input type="text" name="username"/></td>
            </tr>
            <tr>
                <td>Password:</td>
                <td><input type="password" name="password"/></td>
            </tr>
            <tr>
                <td colspan="3">
                    <input name="submit" type="submit" value="submit"/>
                </td>
            </tr>
        </table>
        <input type="hidden" name="$_csrf.parameterName" value="$_csrf.token"/>
    </form>
</div>

当你打开页面时

但是当我登录到主页时,这样的错误会崩溃

我应该如何修复我的代码?

【问题讨论】:

【参考方案1】:

我认为错误是因为您缺少login-processing-url,这是Spring Login将触发身份验证过程的URL。

通过 XML 添加:

login-processing-url="/security"

或者,如果您不想添加它,请让您的表单将其 POST 请求发送到 /login,这是 Spring 触发身份验证的默认 URL(对于 Spring Security 4 及更高版本)。

查看更多here。

【讨论】:

以上是关于Spring Security:身份验证导致 HTTP 405“方法不允许”的主要内容,如果未能解决你的问题,请参考以下文章

Spring security 自定义身份验证提供程序总是导致错误的客户端凭据

在身份验证 Spring Security + WebFlux 期间抛出和处理自定义异常

Spring Security:如何在公共页面中识别用户已通过身份验证

我们可以将输入的用户名传递给spring security中的身份验证失败url吗?

#翻译#通往SQL Server安全级别2的阶梯:身份验证; 唐?吉利; 原文链接:Stairway to SQL Server Security Level 2: Authentication ht

Spring-Security:优化获取当前经过身份验证的用户...