@Secured会抛出AccessDeniedException,尽管角色是正确的

时间:2009-09-18 10:12:47

标签: java exception spring-mvc spring-security

在我的第一个Spring Web应用程序中解决了所有authentication related problems之后,我现在仍然处于授权状态。

使用@Secured注释进行配置非常简单,所以我不认为我在这里犯了错误。另外,我使用LDAP身份验证提供程序使用Active Directory并按AD组分配角色,因此也不是问题。

所以这里是我的问题的简要总结:

  • 不安全的行动工作
  • 使用@Secured("IS_AUTHENTICATED_FULLY") 工作
  • 的操作
  • 使用@Secured("GROUP_*") 之类的操作无效

在调用安全操作时,会抛出org.springframework.security.AccessDeniedException。以下是日志的摘录:

DEBUG: org.springframework.security.intercept.AbstractSecurityInterceptor - Secure object: ReflectiveMethodInvocation: public org.springframework.web.servlet.ModelAndView de.dillinger.resources.controllers.HostsController.index(); target is of class [de.dillinger.resources.controllers.HostsController]; ConfigAttributes: [GROUP_IT]
DEBUG: org.springframework.security.intercept.AbstractSecurityInterceptor - Previously Authenticated: org.springframework.security.providers.UsernamePasswordAuthenticationToken@2a5333d9: Principal: org.springframework.security.userdetails.ldap.Person@1422384: Username: di32001; Password: [PROTECTED]; Enabled: true; AccountNonExpired: true; credentialsNonExpired: true; AccountNonLocked: true; Granted Authorities: GROUP_ITS, GROUP_ITS-IT, GROUP_INTERNET, GROUP_SYSTEMGRUPPE, GROUP_IT; Password: [PROTECTED]; Authenticated: true; Details: org.springframework.security.ui.WebAuthenticationDetails@0: RemoteIpAddress: 127.0.0.1; SessionId: 773943FFB14E512872BB6CE25F46C00A; Granted Authorities: GROUP_ITS, GROUP_ITS-IT, GROUP_INTERNET, GROUP_SYSTEMGRUPPE, GROUP_IT

正如您所看到的,该操作需要GROUP_IT角色,而我的用户对象具有此权限。我真的不知道是什么导致了这个问题。

1 个答案:

答案 0 :(得分:2)

您使用 org.springframework.security.access.vote.UnanimousBased 角色投票人吗?尝试将其更改为 org.springframework.security.access.vote.AffirmativeBased 这种问题与角色选民配置有关。

编辑1(已添加示例):

<security:global-method-security 
    secured-annotations="enabled"  
    access-decision-manager-ref="accessDecisionManager"
/>
<bean 
    id="accessDecisionManager" 
    class="org.springframework.security.access.vote.AffirmativeBased">
    <property name="allowIfAllAbstainDecisions" value="false" />
    <property name="decisionVoters">
        <list>
            <bean id="roleVoter" class="org.springframework.security.access.vote.RoleVoter" />
        </list>
    </property>
 </bean>