diff --git a/core/src/main/java/org/springframework/security/access/vote/RoleVoter.java b/core/src/main/java/org/springframework/security/access/vote/RoleVoter.java index 29b5af2660..31bebc26b3 100644 --- a/core/src/main/java/org/springframework/security/access/vote/RoleVoter.java +++ b/core/src/main/java/org/springframework/security/access/vote/RoleVoter.java @@ -92,6 +92,9 @@ public class RoleVoter implements AccessDecisionVoter { } public int vote(Authentication authentication, Object object, Collection attributes) { + if(authentication == null) { + return ACCESS_DENIED; + } int result = ACCESS_ABSTAIN; Collection authorities = extractAuthorities(authentication); diff --git a/core/src/test/java/org/springframework/security/access/vote/RoleVoterTests.java b/core/src/test/java/org/springframework/security/access/vote/RoleVoterTests.java index 148dd5a176..cf636e03e4 100644 --- a/core/src/test/java/org/springframework/security/access/vote/RoleVoterTests.java +++ b/core/src/test/java/org/springframework/security/access/vote/RoleVoterTests.java @@ -1,6 +1,7 @@ package org.springframework.security.access.vote; import static org.junit.Assert.*; +import static org.fest.assertions.Assertions.*; import org.junit.Test; import org.springframework.security.access.AccessDecisionVoter; @@ -21,4 +22,13 @@ public class RoleVoterTests { // Vote on attribute list that has two attributes A and C (i.e. only one matching) assertEquals(AccessDecisionVoter.ACCESS_GRANTED, voter.vote(userAB, this, SecurityConfig.createList("A","C"))); } + + // SEC-3128 + @Test + public void nullAuthenticationDenies() { + RoleVoter voter = new RoleVoter(); + voter.setRolePrefix(""); + Authentication notAuthenitcated = null; + assertThat(voter.vote(notAuthenitcated, this, SecurityConfig.createList("A"))).isEqualTo(AccessDecisionVoter.ACCESS_DENIED); + } }