Spring Security:出现错误“服务器理解请求但拒绝授权”

问题描述 投票:0回答:6

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

spring-security web.xml
6个回答
0
投票

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

0
投票

我遇到了这个问题,但在使用 spring 时没有。我们在同一台服务器上托管我们自己的内部应用程序的两个实例,但使用两个不同的端口。登录到一个实例是可以的,但是从同一个浏览器(另一个选项卡)登录到另一个实例会导致从 tomcat 抛出上述错误,并显示此消息“CSRF nonce 验证失败”。
我所做的解决方法是从不同的浏览器登录到另一个实例。我知道这不是解决方法,但如果您遇到与我类似的情况,它可能会有所帮助


0
投票

发生这种情况是因为您使用具有 spring 安全性的普通

标签,同时它会检查 CSRF 攻击。

解决方法是:

  • 为每个 标签添加 CSRF 隐藏字段

<form action="..." method="POST">
  <input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}" />
</form>

  • 或者使用自动包含这个隐藏字段的 spring MVC 标签(推荐)

<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>

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

</form:form>

这也发生在我身上,因为我不小心在不同的 tomcat 服务器上启动了我的应用程序的两个实例。我通过删除我的

webapps
work
文件夹中的应用程序的工作目录并重新启动服务器来解决它。

在处理 spring security 时使用

<form:form>
标签,而不是如下所示为每个表单手动添加 CSRF 令牌

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

在我的例子中,这是因为

authorities
标签下的
user-service
设置。删除 hasRole 对我有用。

<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="ROLE-USER" />
    </user-service>
    </authentication-provider>
</authentication-manager>

最好在隐身窗口中打开 Web 应用程序。


0
投票

这也发生在我身上,因为我不小心在不同的 tomcat 服务器上启动了我的应用程序的两个实例。我通过删除我的

webapps
work
文件夹中的应用程序的工作目录并重新启动服务器来解决它。


0
投票

在处理 spring security 时使用

<form:form>
标签,而不是如下所示为每个表单手动添加 CSRF 令牌

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

0
投票

在我的例子中,这是因为

authorities
标签下的
user-service
设置。删除 hasRole 对我有用。

<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="ROLE-USER" />
    </user-service>
    </authentication-provider>
</authentication-manager>

最好在隐身窗口中打开 Web 应用程序。

© www.soinside.com 2019 - 2024. All rights reserved.