【问题标题】:Spring Security: Getting error "The server understood the request but refuses to authorize it"Spring Security:出现错误“服务器理解请求但拒绝授权”
【发布时间】:2018-12-23 09:39:10
【问题描述】:

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


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

        发生这种情况是因为您使用带有 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>

        【讨论】:

          【解决方案4】:

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

          【讨论】:

            猜你喜欢
            • 2021-11-17
            • 2017-02-23
            • 2021-10-29
            • 2015-05-22
            • 2017-11-21
            • 2016-09-29
            • 2019-09-05
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多