当前位置: 首页 > 知识库问答 >
问题:

Spring Security 4.1升级-错误403拒绝访问

沈弘盛
2023-03-14

在升级到Spring Security 4.1.2和Spring 4.3.2时,我得到了403拒绝访问错误代码

    ...
<spring:bean id="roleVoter" class="org.springframework.security.access.vote.RoleVoter">
</spring:bean>

<spring:bean id="authenticatedVoter" class="org.springframework.security.access.vote.AuthenticatedVoter"/>

<spring:bean id="webExpressionVoter" class="org.springframework.security.web.access.expression.WebExpressionVoter" />

<spring:bean id="accessDecisionManager" class="org.springframework.security.access.vote.AffirmativeBased">
      <spring:constructor-arg>
       <spring:list>
            <spring:ref bean="roleVoter"/>
            <spring:ref bean="authenticatedVoter"/>
            <spring:ref bean="webExpressionVoter"/>
        </spring:list>
  </spring:constructor-arg>
</spring:bean>

<security:http access-decision-manager-ref="accessDecisionManager" auto-config='true' use-expressions="true">

    <security:intercept-url pattern="/login.jsp" access="hasRole('ROLE_ANONYMOUS')" />
    <security:intercept-url pattern="/j_spring_security_check" access="hasRole('ROLE_ANONYMOUS')" />

    <security:intercept-url pattern="/index*" access="hasRole('ROLE_USER')"/>

    <security:form-login login-page="/login.jsp"
        username-parameter="j_username"
        password-parameter="j_password"
        login-processing-url="/j_spring_security_check"
        authentication-failure-url="/accessDenied.jsp" />

    <security:logout invalidate-session="true"  delete-cookies="JSESSIONID"/>

    <security:csrf disabled="true"/>

</security:http>
...

我正在使用Spring Security AuthenticationProvider类进行身份类中的authenticate(Authentication Authentication)方法成功执行,并返回新的UsernamePasswordAuthenticationToken(user、pwd、authorities)。

错误StackTrace:

2016-09-02 14:59:21,461 DEBUG [http-/127.0.0.1:8080-1] [org.springframework.security.access.vote.AffirmativeBased.decide(AffirmativeBased.java:66)] - Voter: org.springframework.security.access.vote.RoleVoter@52989292, returned: 0
2016-09-02 14:59:21,461 DEBUG [http-/127.0.0.1:8080-1] [org.springframework.security.access.vote.AffirmativeBased.decide(AffirmativeBased.java:66)] - Voter: org.springframework.security.access.vote.AuthenticatedVoter@203cc7cd, returned: 0
2016-09-02 14:59:21,461 DEBUG [http-/127.0.0.1:8080-1] [org.springframework.security.access.vote.AffirmativeBased.decide(AffirmativeBased.java:66)] - Voter: org.springframework.security.web.access.expression.WebExpressionVoter@5e01cc46, returned: -1
2016-09-02 14:59:21,462 DEBUG [http-/127.0.0.1:8080-1] [org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:362)] - Publishing event in Root WebApplicationContext: org.springframework.security.access.event.AuthorizationFailureEvent[source=FilterInvocation: URL: /index.html]
2016-09-02 14:59:21,462 DEBUG [http-/127.0.0.1:8080-1] [org.springframework.security.web.access.ExceptionTranslationFilter.handleSpringSecurityException(ExceptionTranslationFilter.java:186)] - Access is denied (user is not anonymous); delegating to AccessDeniedHandler
org.springframework.security.access.AccessDeniedException: Access is denied
    at org.springframework.security.access.vote.AffirmativeBased.decide(AffirmativeBased.java:84)
    at org.springframework.security.access.intercept.AbstractSecurityInterceptor.beforeInvocation(AbstractSecurityInterceptor.java:233)
    at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:124)
    at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:91)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331)
    at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:115)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331)
    at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:137)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331)
    at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:111)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331)
    at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:169)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331)

从错误stacktrace中,WebExpressionVoter返回-1。

共有1个答案

郑旭
2023-03-14

如果我们在许多地方使用HasanyRoleHasRole,那么用HasAuthority替换all是不可行的。这是一个真正令人困惑的Spring升级。如果我们想使用与Spring3相同的角色名,我们需要在角色名中附加ROLE_。例如,如果您使用的是APP_ADMIN,则如果登录用户具有APP_ADMIN角色,spring3将对hasrole(APP_ADMIN)计算为true。为了在Spring4中实现同样的功能,您需要将角色更改为ROLE_APP_ADMIN,以便hasrole(APP_ADMIN)为true。

无论“造物主”给出的解释是什么,除了制造混乱之外,这都没有任何意义

 类似资料:
  • 我正在尝试查看一个只有管理员才能查看的特定页面,但每次我提出请求时都会出现错误。它似乎与我的security-context文件中的hasRole()在一起。 当我请求查看admin jsp页面时,错误只显示HTTP状态403-访问被拒绝 我数据库中的两个表是一个用户(用户名,电子邮件,启用,密码)和一个当局(用户名,当局)。 谁能建议一下我的错误是什么或者如何修复它?

  • 我在负载平衡器后面有web服务器,系统成功地将我重定向到OKTA登录页面,当我输入凭据时,并在OKTA服务器执行回调操作时单击登录按钮,使用 我得到一个错误: 403-禁止:拒绝访问。您没有使用提供的凭据查看此目录或页的权限。 我在Startup.cs文件中使用下面的代码,我在Blazor服务器上的应用程序

  • 我正在制作一个RESTFul API(不是web应用程序)并添加Spring Security性,但无法成功完成。 在阅读了大量有关stackoverflow的文章和帖子后,我终于发布了我的问题。请检查一下,让我知道我遗漏了什么或配置错误了什么? 基本实体 角色实体 用户实体 SecurtiyConfig类 CurrentUserDetails UserDetailsService 用户控制器类

  • 我正在制作一个RESTFul API(不是web-app)并添加Spring Security性,但无法成功地做到这一点。 在浏览了stackoverflow上的大量文章和帖子之后,我终于发表了我的问题。请仔细检查一下,让我知道我错过了什么或者配置错误了什么? 基本实体 UserDetailsService UserController类 AdminContrller类 尝试使用ROLE_USER

  • 我已经将我的一个api配置为受保护,当我试图访问它时,它给我一个拒绝访问的错误消息,我不知道是什么原因。请注意,我正在传递有效的访问令牌。 我的场景:基本上我已经在授权服务器中创建了logout rest api,我希望允许带有有效令牌的请求访问这个api。 请求: 回应: 我发现下面的方法返回false,因此它引发了访问拒绝错误。 下面是我通过框架调试捕获的屏幕截图。还请检查评论中提到的图像。