spring-security Spring安全性:出现错误“服务器理解请求但拒绝授权”

utugiqy6  于 2022-11-11  发布在  Spring
关注(0)|答案(5)|浏览(421)

当使用Spring Security运行应用程序时,我在所有浏览器上都出现以下错误:
“服务器已了解要求,但拒绝受权”
我尝试将“spring-security.xml”文件中的角色从“ROLE_ADMIN”更改为“ROLE_USER”。
下面是“spring-security.xml”

<http auto-config="true">
    <intercept-url pattern ="/admin" access = "hasRole('ROLE-USER')"/>
    </http>
    <authentication-manager>
        <authentication-provider>
        <user-service>
            <user name = "abc" password = "xyz" authorities="hasRole('ROLE-USER')" />
        </user-service>
        </authentication-provider>
    </authentication-manager>

下面是SpringController类:

@Controller
public class SpringController {

@RequestMapping(value = "/")
    public String homePage() {
        return "HomePage";
    }
    @RequestMapping(value="/admin", method=RequestMethod.GET)
    public String loginPage() {
        return "login";
}

HomePage.jsp和login.jsp页面是加载的属性,但在login.jsp上传递凭据后出现错误:
HTTP状态403 -禁止
类型:状态报告
消息:访问被拒绝
说明:服务器理解请求,但拒绝授权。
Apache Tomcat/7.0.90版本的操作系统

d8tt03nd

d8tt03nd1#

403是一个非常常见的错误代码。我也遇到过同样的问题,但在做了一些修改后,我能够使它工作。仍然不确定问题是与密码加密或 form-login 标记的配置有关。

<security:http auto-config="true"  >
        <security:intercept-url pattern="/login*" access="isAnonymous()" />
        <security:intercept-url pattern="/**" access="isAuthenticated()"/>
        <security:form-login login-page="/login" login-processing-url="/login-user" authentication-failure-url="/login?error=true" />
        <security:csrf disabled="true" />
        <security:logout logout-success-url="/"  />
    </security:http>

    <security:authentication-manager>
        <security:authentication-provider>
            <security:user-service>
                <security:user name="admin" password="{noop}admin" authorities="ROLE_USER" />
            </security:user-service>
        </security:authentication-provider  >

    </security:authentication-manager>

忽略标记中的 security: 前缀。
密码前的 {noop} 确保我没有对密码使用任何加密。

显示登录JSP的控制器

@Controller
@RequestMapping("/login")
public class LoginController {

    @RequestMapping(value = { "/", "" }, method = { RequestMethod.GET})
    public String login(HttpServletRequest request) {
        System.out.println("LoginController.login() "+request.getRequestURI());
        return "login";
    }

}

表单操作

<form name='loginForm' action="login-user" method='POST'>
kqhtkvqz

kqhtkvqz2#

我遇到了这个问题,但不是在使用Spring的时候。我们在同一个服务器上托管了我们自己的内部应用程序的两个示例,但使用了两个不同的端口。登录到一个示例是可以的,但是从同一个浏览器登录到另一个示例(另一个选项卡)会导致Tomcat抛出上述错误,前面有这样的消息“CSRF nonce validation failed"。
我做的变通方法是从不同的浏览器登录到另一个示例。我知道这不是一个修复,但它可能会帮助如果你有一个类似的情况

vwkv1x7d

vwkv1x7d3#

发生这种情况是因为您使用了带有Spring安全性的普通标记,而它会检查CSRF攻击。
解决的办法是:

  • 为每个标签添加CSRF隐藏字段
<form action="..." method="POST">
  <input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}" />
</form>
  • 或者使用form:form自动包含此隐藏字段的Spring MVC标记(推荐)
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>

<form:form action="..." method="POST">

</form:form>
rbl8hiat

rbl8hiat4#

当我不小心在不同的tomcat服务器上启动应用程序的两个示例时,我也遇到过这种情况。我通过删除webappswork文件夹中应用程序的工作目录,并重新启动服务器来解决这个问题。

yzxexxkh

yzxexxkh5#

当您处理Spring安全性时,请使用<form:form>标记,而不是手动为每个表单添加CSRF标记,如下所示

<form:form action="", method="">
</form:form>

相关问题