春季安全性:收到错误“服务器理解了请求但拒绝授权”

时间:2018-07-15 19:45:53

标签: spring-security web.xml

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

4 个答案:

答案 0 :(得分: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'>

答案 1 :(得分:0)

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

答案 2 :(得分:0)

之所以发生这种情况,是因为您在检查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>

答案 3 :(得分:0)

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