From 0d84b1f0c1f29ed35628a5f3c2bf4546251e3269 Mon Sep 17 00:00:00 2001 From: linhvovn Date: Fri, 29 Dec 2017 01:24:21 +0800 Subject: [PATCH 1/5] [tlinh2110@gmail.com] Restructure to Method Security --- .../methodsecurity/annotation/IsViewer.java | 15 ++ .../config/MethodSecurityConfig.java | 4 +- .../entity/CustomUser.java | 2 +- .../repository/UserRoleRepository.java | 20 ++- .../service/CustomUserDetailsService.java | 4 +- .../service/UserRoleService.java | 107 ++++++++++++ .../service/UserRoleService.java | 29 ---- .../methodsecurity/TestMethodSecurity.java | 163 ++++++++++++++++++ .../TestWithMockUserAtClassLevel.java | 6 +- .../TestWithUserDetails.java | 15 +- .../WithMockJohnViewer.java | 2 +- .../TestMethodSecurity.java | 57 ------ 12 files changed, 323 insertions(+), 101 deletions(-) create mode 100644 spring-security-core/src/main/java/org/baeldung/methodsecurity/annotation/IsViewer.java rename spring-security-core/src/main/java/org/baeldung/{testmethodsecurity => methodsecurity}/config/MethodSecurityConfig.java (85%) rename spring-security-core/src/main/java/org/baeldung/{testmethodsecurity => methodsecurity}/entity/CustomUser.java (91%) rename spring-security-core/src/main/java/org/baeldung/{testmethodsecurity => methodsecurity}/repository/UserRoleRepository.java (71%) rename spring-security-core/src/main/java/org/baeldung/{testmethodsecurity => methodsecurity}/service/CustomUserDetailsService.java (79%) create mode 100644 spring-security-core/src/main/java/org/baeldung/methodsecurity/service/UserRoleService.java delete mode 100644 spring-security-core/src/main/java/org/baeldung/testmethodsecurity/service/UserRoleService.java create mode 100644 spring-security-core/src/test/java/org/baeldung/methodsecurity/TestMethodSecurity.java rename spring-security-core/src/test/java/org/baeldung/{testmethodsecurity => methodsecurity}/TestWithMockUserAtClassLevel.java (82%) rename spring-security-core/src/test/java/org/baeldung/{testmethodsecurity => methodsecurity}/TestWithUserDetails.java (64%) rename spring-security-core/src/test/java/org/baeldung/{testmethodsecurity => methodsecurity}/WithMockJohnViewer.java (72%) delete mode 100644 spring-security-core/src/test/java/org/baeldung/testmethodsecurity/TestMethodSecurity.java diff --git a/spring-security-core/src/main/java/org/baeldung/methodsecurity/annotation/IsViewer.java b/spring-security-core/src/main/java/org/baeldung/methodsecurity/annotation/IsViewer.java new file mode 100644 index 0000000000..da933fb19f --- /dev/null +++ b/spring-security-core/src/main/java/org/baeldung/methodsecurity/annotation/IsViewer.java @@ -0,0 +1,15 @@ +package org.baeldung.methodsecurity.annotation; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +import org.springframework.security.access.prepost.PreAuthorize; + +@Target(ElementType.METHOD) +@Retention(RetentionPolicy.RUNTIME) +@PreAuthorize("hasRole('VIEWER')") +public @interface IsViewer +{ +} \ No newline at end of file diff --git a/spring-security-core/src/main/java/org/baeldung/testmethodsecurity/config/MethodSecurityConfig.java b/spring-security-core/src/main/java/org/baeldung/methodsecurity/config/MethodSecurityConfig.java similarity index 85% rename from spring-security-core/src/main/java/org/baeldung/testmethodsecurity/config/MethodSecurityConfig.java rename to spring-security-core/src/main/java/org/baeldung/methodsecurity/config/MethodSecurityConfig.java index 1b2227f9be..4749c730dc 100644 --- a/spring-security-core/src/main/java/org/baeldung/testmethodsecurity/config/MethodSecurityConfig.java +++ b/spring-security-core/src/main/java/org/baeldung/methodsecurity/config/MethodSecurityConfig.java @@ -1,11 +1,11 @@ -package org.baeldung.testmethodsecurity.config; +package org.baeldung.methodsecurity.config; import org.springframework.context.annotation.Configuration; import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity; import org.springframework.security.config.annotation.method.configuration.GlobalMethodSecurityConfiguration; @Configuration -@EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = true) +@EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = true, jsr250Enabled = true) public class MethodSecurityConfig extends GlobalMethodSecurityConfiguration { } diff --git a/spring-security-core/src/main/java/org/baeldung/testmethodsecurity/entity/CustomUser.java b/spring-security-core/src/main/java/org/baeldung/methodsecurity/entity/CustomUser.java similarity index 91% rename from spring-security-core/src/main/java/org/baeldung/testmethodsecurity/entity/CustomUser.java rename to spring-security-core/src/main/java/org/baeldung/methodsecurity/entity/CustomUser.java index b145a82c80..19a7719373 100644 --- a/spring-security-core/src/main/java/org/baeldung/testmethodsecurity/entity/CustomUser.java +++ b/spring-security-core/src/main/java/org/baeldung/methodsecurity/entity/CustomUser.java @@ -1,4 +1,4 @@ -package org.baeldung.testmethodsecurity.entity; +package org.baeldung.methodsecurity.entity; import java.util.Collection; diff --git a/spring-security-core/src/main/java/org/baeldung/testmethodsecurity/repository/UserRoleRepository.java b/spring-security-core/src/main/java/org/baeldung/methodsecurity/repository/UserRoleRepository.java similarity index 71% rename from spring-security-core/src/main/java/org/baeldung/testmethodsecurity/repository/UserRoleRepository.java rename to spring-security-core/src/main/java/org/baeldung/methodsecurity/repository/UserRoleRepository.java index 565b46262d..82e74f0cd0 100644 --- a/spring-security-core/src/main/java/org/baeldung/testmethodsecurity/repository/UserRoleRepository.java +++ b/spring-security-core/src/main/java/org/baeldung/methodsecurity/repository/UserRoleRepository.java @@ -1,11 +1,11 @@ -package org.baeldung.testmethodsecurity.repository; +package org.baeldung.methodsecurity.repository; import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; -import org.baeldung.testmethodsecurity.entity.CustomUser; +import org.baeldung.methodsecurity.entity.CustomUser; import org.springframework.security.core.GrantedAuthority; import org.springframework.security.core.authority.SimpleGrantedAuthority; import org.springframework.security.core.userdetails.UsernameNotFoundException; @@ -38,4 +38,20 @@ public class UserRoleRepository { throw new UsernameNotFoundException("User "+username+" cannot be found"); } + public boolean isValidUsername(String username){ + return DB_BASED_USER_MAPPING.containsKey(username); + } + + public boolean isValidRole(String roleName){ + return roleName.startsWith("ROLE_"); + } + + public List getAllUsernames(){ + List usernames = new ArrayList<>(); + usernames.add("jane"); + usernames.add("john"); + usernames.add("jack"); + return usernames; + } + } diff --git a/spring-security-core/src/main/java/org/baeldung/testmethodsecurity/service/CustomUserDetailsService.java b/spring-security-core/src/main/java/org/baeldung/methodsecurity/service/CustomUserDetailsService.java similarity index 79% rename from spring-security-core/src/main/java/org/baeldung/testmethodsecurity/service/CustomUserDetailsService.java rename to spring-security-core/src/main/java/org/baeldung/methodsecurity/service/CustomUserDetailsService.java index a5adcd3408..91171468bb 100644 --- a/spring-security-core/src/main/java/org/baeldung/testmethodsecurity/service/CustomUserDetailsService.java +++ b/spring-security-core/src/main/java/org/baeldung/methodsecurity/service/CustomUserDetailsService.java @@ -1,6 +1,6 @@ -package org.baeldung.testmethodsecurity.service; +package org.baeldung.methodsecurity.service; -import org.baeldung.testmethodsecurity.repository.UserRoleRepository; +import org.baeldung.methodsecurity.repository.UserRoleRepository; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.core.userdetails.UserDetailsService; diff --git a/spring-security-core/src/main/java/org/baeldung/methodsecurity/service/UserRoleService.java b/spring-security-core/src/main/java/org/baeldung/methodsecurity/service/UserRoleService.java new file mode 100644 index 0000000000..3afd56110a --- /dev/null +++ b/spring-security-core/src/main/java/org/baeldung/methodsecurity/service/UserRoleService.java @@ -0,0 +1,107 @@ +package org.baeldung.methodsecurity.service; + +import java.util.List; +import java.util.stream.Collectors; + +import javax.annotation.security.RolesAllowed; + +import org.baeldung.methodsecurity.annotation.IsViewer; +import org.baeldung.methodsecurity.entity.CustomUser; +import org.baeldung.methodsecurity.repository.UserRoleRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.annotation.Secured; +import org.springframework.security.access.prepost.PostAuthorize; +import org.springframework.security.access.prepost.PostFilter; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.security.access.prepost.PreFilter; +import org.springframework.security.core.context.SecurityContext; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.stereotype.Service; + +@Service +public class UserRoleService { + + @Autowired + UserRoleRepository userRoleRepository; + + @Secured("ROLE_VIEWER") + public String getUsername(){ + SecurityContext securityContext = SecurityContextHolder.getContext(); + return securityContext.getAuthentication().getName(); + } + + @Secured({"ROLE_VIEWER","ROLE_EDITOR"}) + public boolean isValidUsername(String username){ + return userRoleRepository.isValidUsername(username); + } + + @RolesAllowed("ROLE_VIEWER") + public String getUsername2(){ + SecurityContext securityContext = SecurityContextHolder.getContext(); + return securityContext.getAuthentication().getName(); + } + + @RolesAllowed({"ROLE_VIEWER","ROLE_EDITOR"}) + public boolean isValidUsername2(String username){ + return userRoleRepository.isValidUsername(username); + } + + @PreAuthorize("hasRole('ROLE_VIEWER')") + public String getUsernameInUpperCase(){ + return getUsername().toUpperCase(); + } + + @PreAuthorize("hasAuthority('SYS_ADMIN')") + public String getUsernameInLowerCase(){ + return getUsername().toLowerCase(); + } + + @PreAuthorize("hasRole('ROLE_VIEWER') or hasRole('ROLE_EDITOR')") + public boolean isValidUsername3(String username){ + return userRoleRepository.isValidUsername(username); + } + + @PreAuthorize("#username == authentication.principal.username") + public String getMyRoles(String username){ + SecurityContext securityContext = SecurityContextHolder.getContext(); + return securityContext + .getAuthentication() + .getAuthorities() + .stream().map(auth -> auth.getAuthority()) + .collect(Collectors.joining(",")); + } + + @PostAuthorize("returnObject.username == authentication.principal.nickName") + public CustomUser loadUserDetail(String username){ + return userRoleRepository.loadUserByUserName(username); + } + + @PreFilter("filterObject != authentication.principal.username") + public String joinUsernames(List usernames){ + return usernames.stream().collect(Collectors.joining(";")); + } + + @PreFilter(value="filterObject != authentication.principal.username",filterTarget="usernames") + public String joinUsernamesAndRoles(List usernames,List roles){ + return usernames.stream().collect(Collectors.joining(";")) + +":"+roles.stream().collect(Collectors.joining(";")); + } + + @PostFilter("filterObject != authentication.principal.username") + public List getAllUsernamesExceptCurrent(){ + return userRoleRepository.getAllUsernames(); + } + + @IsViewer + public String getUsername4(){ + SecurityContext securityContext = SecurityContextHolder.getContext(); + return securityContext.getAuthentication().getName(); + } + + @PreAuthorize("#username == authentication.principal.username") + @PostAuthorize("returnObject.username == authentication.principal.nickName") + public CustomUser securedLoadUserDetail(String username){ + return userRoleRepository.loadUserByUserName(username); + } + +} diff --git a/spring-security-core/src/main/java/org/baeldung/testmethodsecurity/service/UserRoleService.java b/spring-security-core/src/main/java/org/baeldung/testmethodsecurity/service/UserRoleService.java deleted file mode 100644 index f4dc6cf335..0000000000 --- a/spring-security-core/src/main/java/org/baeldung/testmethodsecurity/service/UserRoleService.java +++ /dev/null @@ -1,29 +0,0 @@ -package org.baeldung.testmethodsecurity.service; - -import org.baeldung.testmethodsecurity.entity.CustomUser; -import org.baeldung.testmethodsecurity.repository.UserRoleRepository; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.security.access.prepost.PostAuthorize; -import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.security.core.context.SecurityContext; -import org.springframework.security.core.context.SecurityContextHolder; -import org.springframework.stereotype.Service; - -@Service -public class UserRoleService { - - @Autowired - UserRoleRepository userRoleRepository; - - @PreAuthorize("hasRole('ROLE_VIEWER') or hasAuthority('SYS_ADMIN')") - public String getUsername(){ - SecurityContext securityContext = SecurityContextHolder.getContext(); - return securityContext.getAuthentication().getName(); - } - - @PostAuthorize("returnObject.username == authentication.principal.nickName") - public CustomUser loadUserDetail(String username){ - return userRoleRepository.loadUserByUserName(username); - } - -} diff --git a/spring-security-core/src/test/java/org/baeldung/methodsecurity/TestMethodSecurity.java b/spring-security-core/src/test/java/org/baeldung/methodsecurity/TestMethodSecurity.java new file mode 100644 index 0000000000..dcc77fbab5 --- /dev/null +++ b/spring-security-core/src/test/java/org/baeldung/methodsecurity/TestMethodSecurity.java @@ -0,0 +1,163 @@ +package org.baeldung.methodsecurity; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + +import java.util.ArrayList; +import java.util.List; + +import org.baeldung.methodsecurity.service.UserRoleService; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; +import org.springframework.security.access.AccessDeniedException; +import org.springframework.security.authentication.AuthenticationCredentialsNotFoundException; +import org.springframework.security.test.context.support.WithAnonymousUser; +import org.springframework.security.test.context.support.WithMockUser; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringRunner; + +@RunWith(SpringRunner.class) +@ContextConfiguration +public class TestMethodSecurity{ + + @Autowired + UserRoleService userRoleService; + + @Configuration + @ComponentScan("org.baeldung.methodsecurity.*") + public static class SpringConfig { + + } + + @Test(expected=AuthenticationCredentialsNotFoundException.class) + public void givenNoSecurity_whenCallGetUsername_thenReturnException(){ + String userName = userRoleService.getUsername(); + assertEquals("john", userName); + } + + @Test + @WithMockUser(username="john",roles={"VIEWER"}) + public void givenRoleViewer_whenCallGetUsername_thenReturnUsername(){ + String userName = userRoleService.getUsername(); + assertEquals("john", userName); + } + + @Test + @WithMockUser(username="john",roles={"EDITOR"}) + public void givenUsernameJohn_whenCallIsValidUsername_thenReturnTrue(){ + boolean isValid = userRoleService.isValidUsername("john"); + assertEquals(true, isValid); + } + + @Test(expected = AccessDeniedException.class) + @WithMockUser(username = "john", roles = { "ADMIN" }) + public void givenRoleAdmin_whenCallGetUsername_thenReturnAccessDenied() { + userRoleService.getUsername(); + } + + @Test(expected = AccessDeniedException.class) + @WithMockUser(username = "john", roles = {"USER"}) + public void givenRoleUser_whenCallGetUsername2_thenReturnAccessDenied() { + userRoleService.getUsername2(); + } + + @Test + @WithMockUser(username="john",roles={"VIEWER","EDITOR"}) + public void givenRoleViewer_whenCallGetUsername2_thenReturnUsername(){ + String userName = userRoleService.getUsername2(); + assertEquals("john", userName); + } + + @Test + @WithMockUser(username="john",roles={"VIEWER"}) + public void givenUsernameJerry_whenCallIsValidUsername2_thenReturnFalse(){ + boolean isValid = userRoleService.isValidUsername2("jerry"); + assertEquals(false, isValid); + } + + @Test + @WithMockUser(username="JOHN",authorities={"SYS_ADMIN"}) + public void givenAuthoritySysAdmin_whenCallGetUsernameInLowerCase_thenReturnUsername(){ + String username = userRoleService.getUsernameInLowerCase(); + assertEquals("john", username); + } + + @Test + @WithMockUser(username="john",roles={"ADMIN","USER","VIEWER"}) + public void givenUserJohn_whenCallGetMyRolesWithJohn_thenReturnRoles(){ + String roles = userRoleService.getMyRoles("john"); + assertEquals("ROLE_ADMIN,ROLE_USER,ROLE_VIEWER", roles); + } + + @Test(expected=AccessDeniedException.class) + @WithMockUser(username="john",roles={"ADMIN","USER","VIEWER"}) + public void givenUserJane_whenCallGetMyRolesWithJane_thenAccessDenied(){ + userRoleService.getMyRoles("jane"); + } + + @Test(expected=AccessDeniedException.class) + @WithAnonymousUser + public void givenAnomynousUser_whenCallGetUsername_thenAccessDenied(){ + userRoleService.getUsername(); + } + + @Test + @WithMockJohnViewer + public void givenMockedJohnViewer_whenCallGetUsername_thenReturnUsername(){ + String userName = userRoleService.getUsername(); + assertEquals("john", userName); + } + + @Test + @WithMockUser(username="jane") + public void givenListContainCurrentUsername_whenJoinUsernames_thenReturnUsernames(){ + List usernames = new ArrayList<>(); + usernames.add("jane"); + usernames.add("john"); + usernames.add("jack"); + String containCurrentUser = userRoleService.joinUsernames(usernames); + assertEquals("john;jack", containCurrentUser); + + } + + @Test + @WithMockUser(username="john") + public void givenListNotContainCurrentUsername_whenCallContainCurrentUser_thenReturnAccessDenied(){ + List usernames = new ArrayList<>(); + usernames.add("jane"); + usernames.add("john"); + usernames.add("jack"); + + List roles = new ArrayList<>(); + roles.add("ROLE_ADMIN"); + roles.add("ROLE_TEST"); + + String containCurrentUser = userRoleService.joinUsernamesAndRoles(usernames,roles); + assertEquals("jane;jack:ROLE_ADMIN;ROLE_TEST", containCurrentUser); + } + + @Test + @WithMockUser(username="john") + public void givenUserJohn_whenCallGetAllUsernamesExceptCurrent_thenReturnOtherusernames(){ + List others = userRoleService.getAllUsernamesExceptCurrent(); + assertEquals(2, others.size()); + assertTrue(others.contains("jane")); + assertTrue(others.contains("jack")); + } + + @Test + @WithMockUser(username="john",roles={"VIEWER"}) + public void givenRoleViewer_whenCallGetUsername4_thenReturnUsername(){ + String userName = userRoleService.getUsername4(); + assertEquals("john", userName); + } + + @Test(expected=AccessDeniedException.class) + @WithMockUser(username="john") + public void givenDefaultRole_whenCallGetUsername4_thenAccessDenied(){ + userRoleService.getUsername4(); + } +} \ No newline at end of file diff --git a/spring-security-core/src/test/java/org/baeldung/testmethodsecurity/TestWithMockUserAtClassLevel.java b/spring-security-core/src/test/java/org/baeldung/methodsecurity/TestWithMockUserAtClassLevel.java similarity index 82% rename from spring-security-core/src/test/java/org/baeldung/testmethodsecurity/TestWithMockUserAtClassLevel.java rename to spring-security-core/src/test/java/org/baeldung/methodsecurity/TestWithMockUserAtClassLevel.java index a348a7799d..319aee63a6 100644 --- a/spring-security-core/src/test/java/org/baeldung/testmethodsecurity/TestWithMockUserAtClassLevel.java +++ b/spring-security-core/src/test/java/org/baeldung/methodsecurity/TestWithMockUserAtClassLevel.java @@ -1,8 +1,8 @@ -package org.baeldung.testmethodsecurity; +package org.baeldung.methodsecurity; import static org.junit.Assert.assertEquals; -import org.baeldung.testmethodsecurity.service.UserRoleService; +import org.baeldung.methodsecurity.service.UserRoleService; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; @@ -27,7 +27,7 @@ public class TestWithMockUserAtClassLevel { UserRoleService userService; @Configuration - @ComponentScan("org.baeldung.testmethodsecurity.*") + @ComponentScan("org.baeldung.methodsecurity.*") public static class SpringConfig { } diff --git a/spring-security-core/src/test/java/org/baeldung/testmethodsecurity/TestWithUserDetails.java b/spring-security-core/src/test/java/org/baeldung/methodsecurity/TestWithUserDetails.java similarity index 64% rename from spring-security-core/src/test/java/org/baeldung/testmethodsecurity/TestWithUserDetails.java rename to spring-security-core/src/test/java/org/baeldung/methodsecurity/TestWithUserDetails.java index ed8ed8cc85..3f60281380 100644 --- a/spring-security-core/src/test/java/org/baeldung/testmethodsecurity/TestWithUserDetails.java +++ b/spring-security-core/src/test/java/org/baeldung/methodsecurity/TestWithUserDetails.java @@ -1,9 +1,9 @@ -package org.baeldung.testmethodsecurity; +package org.baeldung.methodsecurity; import static org.junit.Assert.assertEquals; -import org.baeldung.testmethodsecurity.entity.CustomUser; -import org.baeldung.testmethodsecurity.service.UserRoleService; +import org.baeldung.methodsecurity.entity.CustomUser; +import org.baeldung.methodsecurity.service.UserRoleService; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; @@ -21,7 +21,7 @@ public class TestWithUserDetails { UserRoleService userService; @Configuration - @ComponentScan("org.baeldung.testmethodsecurity.*") + @ComponentScan("org.baeldung.methodsecurity.*") public static class SpringConfig { } @@ -32,4 +32,11 @@ public class TestWithUserDetails { CustomUser user = userService.loadUserDetail("jane"); assertEquals("jane",user.getNickName()); } + + @Test + @WithUserDetails(value="jane",userDetailsServiceBeanName="userDetailService") + public void whenJohn_callSecuredLoadUserDetail_thenOK(){ + CustomUser user = userService.securedLoadUserDetail("john"); + assertEquals("jane",user.getNickName()); + } } diff --git a/spring-security-core/src/test/java/org/baeldung/testmethodsecurity/WithMockJohnViewer.java b/spring-security-core/src/test/java/org/baeldung/methodsecurity/WithMockJohnViewer.java similarity index 72% rename from spring-security-core/src/test/java/org/baeldung/testmethodsecurity/WithMockJohnViewer.java rename to spring-security-core/src/test/java/org/baeldung/methodsecurity/WithMockJohnViewer.java index 994fe2e69b..5e1e882f3d 100644 --- a/spring-security-core/src/test/java/org/baeldung/testmethodsecurity/WithMockJohnViewer.java +++ b/spring-security-core/src/test/java/org/baeldung/methodsecurity/WithMockJohnViewer.java @@ -1,4 +1,4 @@ -package org.baeldung.testmethodsecurity; +package org.baeldung.methodsecurity; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; diff --git a/spring-security-core/src/test/java/org/baeldung/testmethodsecurity/TestMethodSecurity.java b/spring-security-core/src/test/java/org/baeldung/testmethodsecurity/TestMethodSecurity.java deleted file mode 100644 index 671229c726..0000000000 --- a/spring-security-core/src/test/java/org/baeldung/testmethodsecurity/TestMethodSecurity.java +++ /dev/null @@ -1,57 +0,0 @@ -package org.baeldung.testmethodsecurity; - -import static org.junit.Assert.assertEquals; - -import org.baeldung.testmethodsecurity.service.UserRoleService; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.annotation.ComponentScan; -import org.springframework.context.annotation.Configuration; -import org.springframework.security.access.AccessDeniedException; -import org.springframework.security.test.context.support.WithAnonymousUser; -import org.springframework.security.test.context.support.WithMockUser; -import org.springframework.test.context.ContextConfiguration; -import org.springframework.test.context.junit4.SpringRunner; - -@RunWith(SpringRunner.class) -@ContextConfiguration -public class TestMethodSecurity{ - - @Autowired - UserRoleService userRoleService; - - @Configuration - @ComponentScan("org.baeldung.testmethodsecurity.*") - public static class SpringConfig { - - } - - @Test - @WithMockUser(username="john",roles={"VIEWER"}) - public void givenRoleViewer_whenCallGetUsername_thenReturnUsername(){ - String userName = userRoleService.getUsername(); - assertEquals("john", userName); - } - - @Test - @WithMockUser(username="john",authorities={"SYS_ADMIN"}) - public void givenAuthoritySysAdmin_whenCallGetUsername_thenReturnUsername(){ - String userName = userRoleService.getUsername(); - assertEquals("john", userName); - } - - @Test(expected=AccessDeniedException.class) - @WithAnonymousUser - public void givenAnomynousUser_whenCallGetUsername_thenAccessDenied(){ - userRoleService.getUsername(); - } - - @Test - @WithMockJohnViewer - public void givenMockedJohnViewer_whenCallGetUsername_thenReturnUsername(){ - String userName = userRoleService.getUsername(); - assertEquals("john", userName); - } - -} \ No newline at end of file From 1b7e6957bbec07913762252edefe8e74e395cf45 Mon Sep 17 00:00:00 2001 From: linhvovn Date: Sun, 31 Dec 2017 22:56:35 +0800 Subject: [PATCH 2/5] [BAEL1411-tlinh2110] Add Class Level Security Example --- .../methodsecurity/service/SystemService.java | 18 +++++++ .../service/UserRoleService.java | 2 +- .../TestClassLevelSecurity.java | 49 +++++++++++++++++++ .../methodsecurity/TestMethodSecurity.java | 1 + .../methodsecurity/TestWithUserDetails.java | 18 ++++++- 5 files changed, 85 insertions(+), 3 deletions(-) create mode 100644 spring-security-core/src/main/java/org/baeldung/methodsecurity/service/SystemService.java create mode 100644 spring-security-core/src/test/java/org/baeldung/methodsecurity/TestClassLevelSecurity.java diff --git a/spring-security-core/src/main/java/org/baeldung/methodsecurity/service/SystemService.java b/spring-security-core/src/main/java/org/baeldung/methodsecurity/service/SystemService.java new file mode 100644 index 0000000000..5f29d7dee6 --- /dev/null +++ b/spring-security-core/src/main/java/org/baeldung/methodsecurity/service/SystemService.java @@ -0,0 +1,18 @@ +package org.baeldung.methodsecurity.service; + +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.stereotype.Service; + +@Service +@PreAuthorize("hasRole('ROLE_ADMIN')") +public class SystemService { + + public String getSystemYear(){ + return "2017"; + } + + public String getSystemDate(){ + return "31-12-2017"; + } + +} diff --git a/spring-security-core/src/main/java/org/baeldung/methodsecurity/service/UserRoleService.java b/spring-security-core/src/main/java/org/baeldung/methodsecurity/service/UserRoleService.java index 3afd56110a..7379ee5223 100644 --- a/spring-security-core/src/main/java/org/baeldung/methodsecurity/service/UserRoleService.java +++ b/spring-security-core/src/main/java/org/baeldung/methodsecurity/service/UserRoleService.java @@ -103,5 +103,5 @@ public class UserRoleService { public CustomUser securedLoadUserDetail(String username){ return userRoleRepository.loadUserByUserName(username); } - + } diff --git a/spring-security-core/src/test/java/org/baeldung/methodsecurity/TestClassLevelSecurity.java b/spring-security-core/src/test/java/org/baeldung/methodsecurity/TestClassLevelSecurity.java new file mode 100644 index 0000000000..502fd50c46 --- /dev/null +++ b/spring-security-core/src/test/java/org/baeldung/methodsecurity/TestClassLevelSecurity.java @@ -0,0 +1,49 @@ +package org.baeldung.methodsecurity; + +import static org.junit.Assert.*; + +import org.baeldung.methodsecurity.service.SystemService; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; +import org.springframework.security.access.AccessDeniedException; +import org.springframework.security.test.context.support.WithMockUser; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringRunner; + +@RunWith(SpringRunner.class) +@ContextConfiguration +public class TestClassLevelSecurity { + + @Autowired + SystemService systemService; + + @Configuration + @ComponentScan("org.baeldung.methodsecurity.*") + public static class SpringConfig { + + } + + @Test + @WithMockUser(username="john",roles={"ADMIN"}) + public void givenRoleAdmin_whenCallGetSystemYear_return2017(){ + String systemYear = systemService.getSystemYear(); + assertEquals("2017",systemYear); + } + + @Test(expected=AccessDeniedException.class) + @WithMockUser(username="john",roles={"VIEWER"}) + public void givenRoleViewer_whenCallGetSystemYear_returnAccessDenied(){ + String systemYear = systemService.getSystemYear(); + assertEquals("2017",systemYear); + } + + @Test + @WithMockUser(username="john",roles={"ADMIN"}) + public void givenRoleAdmin_whenCallGetSystemDate_returnDate(){ + String systemYear = systemService.getSystemDate(); + assertEquals("31-12-2017",systemYear); + } +} diff --git a/spring-security-core/src/test/java/org/baeldung/methodsecurity/TestMethodSecurity.java b/spring-security-core/src/test/java/org/baeldung/methodsecurity/TestMethodSecurity.java index dcc77fbab5..4e4b665fb2 100644 --- a/spring-security-core/src/test/java/org/baeldung/methodsecurity/TestMethodSecurity.java +++ b/spring-security-core/src/test/java/org/baeldung/methodsecurity/TestMethodSecurity.java @@ -160,4 +160,5 @@ public class TestMethodSecurity{ public void givenDefaultRole_whenCallGetUsername4_thenAccessDenied(){ userRoleService.getUsername4(); } + } \ No newline at end of file diff --git a/spring-security-core/src/test/java/org/baeldung/methodsecurity/TestWithUserDetails.java b/spring-security-core/src/test/java/org/baeldung/methodsecurity/TestWithUserDetails.java index 3f60281380..6c1d2ab62c 100644 --- a/spring-security-core/src/test/java/org/baeldung/methodsecurity/TestWithUserDetails.java +++ b/spring-security-core/src/test/java/org/baeldung/methodsecurity/TestWithUserDetails.java @@ -9,6 +9,7 @@ import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; +import org.springframework.security.access.AccessDeniedException; import org.springframework.security.test.context.support.WithUserDetails; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringRunner; @@ -35,8 +36,21 @@ public class TestWithUserDetails { @Test @WithUserDetails(value="jane",userDetailsServiceBeanName="userDetailService") - public void whenJohn_callSecuredLoadUserDetail_thenOK(){ - CustomUser user = userService.securedLoadUserDetail("john"); + public void givenJane_callSecuredLoadUserDetailWithJane_thenOK(){ + CustomUser user = userService.securedLoadUserDetail("jane"); assertEquals("jane",user.getNickName()); + assertEquals("jane",user.getUsername()); + } + + @Test(expected=AccessDeniedException.class) + @WithUserDetails(value="john",userDetailsServiceBeanName="userDetailService") + public void givenJohn_callSecuredLoadUserDetailWithJane_thenAccessDenied(){ + userService.securedLoadUserDetail("jane"); + } + + @Test(expected=AccessDeniedException.class) + @WithUserDetails(value="john",userDetailsServiceBeanName="userDetailService") + public void givenJohn_callSecuredLoadUserDetailWithJohn_thenAccessDenied(){ + userService.securedLoadUserDetail("john"); } } From 2bac6f88e71615c714f9a740c94bd98c44386533 Mon Sep 17 00:00:00 2001 From: linhvovn Date: Sun, 31 Dec 2017 23:32:33 +0800 Subject: [PATCH 3/5] [BAEL-1411] Format code --- .../methodsecurity/annotation/IsViewer.java | 3 +- .../methodsecurity/entity/CustomUser.java | 8 +- .../repository/UserRoleRepository.java | 42 +++---- .../service/UserRoleService.java | 73 ++++++----- .../methodsecurity/TestMethodSecurity.java | 116 +++++++++--------- .../TestWithMockUserAtClassLevel.java | 12 +- .../methodsecurity/TestWithUserDetails.java | 38 +++--- 7 files changed, 145 insertions(+), 147 deletions(-) diff --git a/spring-security-core/src/main/java/org/baeldung/methodsecurity/annotation/IsViewer.java b/spring-security-core/src/main/java/org/baeldung/methodsecurity/annotation/IsViewer.java index da933fb19f..711784adbb 100644 --- a/spring-security-core/src/main/java/org/baeldung/methodsecurity/annotation/IsViewer.java +++ b/spring-security-core/src/main/java/org/baeldung/methodsecurity/annotation/IsViewer.java @@ -10,6 +10,5 @@ import org.springframework.security.access.prepost.PreAuthorize; @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) @PreAuthorize("hasRole('VIEWER')") -public @interface IsViewer -{ +public @interface IsViewer { } \ No newline at end of file diff --git a/spring-security-core/src/main/java/org/baeldung/methodsecurity/entity/CustomUser.java b/spring-security-core/src/main/java/org/baeldung/methodsecurity/entity/CustomUser.java index 19a7719373..fb9174befa 100644 --- a/spring-security-core/src/main/java/org/baeldung/methodsecurity/entity/CustomUser.java +++ b/spring-security-core/src/main/java/org/baeldung/methodsecurity/entity/CustomUser.java @@ -6,15 +6,15 @@ import org.springframework.security.core.GrantedAuthority; import org.springframework.security.core.userdetails.User; @SuppressWarnings("serial") -public class CustomUser extends User{ - +public class CustomUser extends User { + private String nickName; public CustomUser(String username, String password, Collection authorities) { super(username, password, authorities); } - - public CustomUser(String username, String password, Collection authorities,String nickName) { + + public CustomUser(String username, String password, Collection authorities, String nickName) { super(username, password, authorities); this.nickName = nickName; } diff --git a/spring-security-core/src/main/java/org/baeldung/methodsecurity/repository/UserRoleRepository.java b/spring-security-core/src/main/java/org/baeldung/methodsecurity/repository/UserRoleRepository.java index 82e74f0cd0..fc1a32289d 100644 --- a/spring-security-core/src/main/java/org/baeldung/methodsecurity/repository/UserRoleRepository.java +++ b/spring-security-core/src/main/java/org/baeldung/methodsecurity/repository/UserRoleRepository.java @@ -13,45 +13,45 @@ import org.springframework.stereotype.Service; @Service public class UserRoleRepository { - - static Map DB_BASED_USER_MAPPING; - - static{ + + static Map DB_BASED_USER_MAPPING; + + static { DB_BASED_USER_MAPPING = new LinkedHashMap<>(); - DB_BASED_USER_MAPPING.put("jane", new CustomUser("jane","1234", getGrantedAuthorities("ROLE_USER","ROLE_VIEWER"),"jane")); - DB_BASED_USER_MAPPING.put("john", new CustomUser("john","1234", getGrantedAuthorities("ROLE_EDITOR","ROLE_ADMIN"),"jane")); - DB_BASED_USER_MAPPING.put("jack", new CustomUser("jack","1234", getGrantedAuthorities("ROLE_USER","ROLE_REVIEWER"),"jane")); + DB_BASED_USER_MAPPING.put("jane", new CustomUser("jane", "1234", getGrantedAuthorities("ROLE_USER", "ROLE_VIEWER"), "jane")); + DB_BASED_USER_MAPPING.put("john", new CustomUser("john", "1234", getGrantedAuthorities("ROLE_EDITOR", "ROLE_ADMIN"), "jane")); + DB_BASED_USER_MAPPING.put("jack", new CustomUser("jack", "1234", getGrantedAuthorities("ROLE_USER", "ROLE_REVIEWER"), "jane")); } - - private static List getGrantedAuthorities(String...roles){ + + private static List getGrantedAuthorities(String... roles) { ArrayList authorities = new ArrayList<>(); - for (String role : roles){ + for (String role : roles) { authorities.add(new SimpleGrantedAuthority(role)); } return authorities; } - - public CustomUser loadUserByUserName(String username){ - if (DB_BASED_USER_MAPPING.containsKey(username)){ + + public CustomUser loadUserByUserName(String username) { + if (DB_BASED_USER_MAPPING.containsKey(username)) { return DB_BASED_USER_MAPPING.get(username); } - throw new UsernameNotFoundException("User "+username+" cannot be found"); + throw new UsernameNotFoundException("User " + username + " cannot be found"); } - - public boolean isValidUsername(String username){ + + public boolean isValidUsername(String username) { return DB_BASED_USER_MAPPING.containsKey(username); } - - public boolean isValidRole(String roleName){ + + public boolean isValidRole(String roleName) { return roleName.startsWith("ROLE_"); } - - public List getAllUsernames(){ + + public List getAllUsernames() { List usernames = new ArrayList<>(); usernames.add("jane"); usernames.add("john"); usernames.add("jack"); return usernames; } - + } diff --git a/spring-security-core/src/main/java/org/baeldung/methodsecurity/service/UserRoleService.java b/spring-security-core/src/main/java/org/baeldung/methodsecurity/service/UserRoleService.java index 7379ee5223..c980334e82 100644 --- a/spring-security-core/src/main/java/org/baeldung/methodsecurity/service/UserRoleService.java +++ b/spring-security-core/src/main/java/org/baeldung/methodsecurity/service/UserRoleService.java @@ -20,88 +20,87 @@ import org.springframework.stereotype.Service; @Service public class UserRoleService { - + @Autowired UserRoleRepository userRoleRepository; - + @Secured("ROLE_VIEWER") - public String getUsername(){ + public String getUsername() { SecurityContext securityContext = SecurityContextHolder.getContext(); return securityContext.getAuthentication().getName(); } - - @Secured({"ROLE_VIEWER","ROLE_EDITOR"}) - public boolean isValidUsername(String username){ + + @Secured({ "ROLE_VIEWER", "ROLE_EDITOR" }) + public boolean isValidUsername(String username) { return userRoleRepository.isValidUsername(username); } - + @RolesAllowed("ROLE_VIEWER") - public String getUsername2(){ + public String getUsername2() { SecurityContext securityContext = SecurityContextHolder.getContext(); return securityContext.getAuthentication().getName(); } - - @RolesAllowed({"ROLE_VIEWER","ROLE_EDITOR"}) - public boolean isValidUsername2(String username){ + + @RolesAllowed({ "ROLE_VIEWER", "ROLE_EDITOR" }) + public boolean isValidUsername2(String username) { return userRoleRepository.isValidUsername(username); } - + @PreAuthorize("hasRole('ROLE_VIEWER')") - public String getUsernameInUpperCase(){ + public String getUsernameInUpperCase() { return getUsername().toUpperCase(); } - + @PreAuthorize("hasAuthority('SYS_ADMIN')") - public String getUsernameInLowerCase(){ + public String getUsernameLC() { return getUsername().toLowerCase(); } - + @PreAuthorize("hasRole('ROLE_VIEWER') or hasRole('ROLE_EDITOR')") - public boolean isValidUsername3(String username){ + public boolean isValidUsername3(String username) { return userRoleRepository.isValidUsername(username); } - + @PreAuthorize("#username == authentication.principal.username") - public String getMyRoles(String username){ + public String getMyRoles(String username) { SecurityContext securityContext = SecurityContextHolder.getContext(); return securityContext .getAuthentication() .getAuthorities() - .stream().map(auth -> auth.getAuthority()) - .collect(Collectors.joining(",")); + .stream() + .map(auth -> auth.getAuthority()).collect(Collectors.joining(",")); } - + @PostAuthorize("returnObject.username == authentication.principal.nickName") - public CustomUser loadUserDetail(String username){ + public CustomUser loadUserDetail(String username) { return userRoleRepository.loadUserByUserName(username); } - + @PreFilter("filterObject != authentication.principal.username") - public String joinUsernames(List usernames){ + public String joinUsernames(List usernames) { return usernames.stream().collect(Collectors.joining(";")); } - - @PreFilter(value="filterObject != authentication.principal.username",filterTarget="usernames") - public String joinUsernamesAndRoles(List usernames,List roles){ - return usernames.stream().collect(Collectors.joining(";")) - +":"+roles.stream().collect(Collectors.joining(";")); + + @PreFilter(value = "filterObject != authentication.principal.username", filterTarget = "usernames") + public String joinUsernamesAndRoles(List usernames, List roles) { + return usernames.stream().collect(Collectors.joining(";")) + ":" + roles.stream().collect(Collectors.joining(";")); } - + @PostFilter("filterObject != authentication.principal.username") - public List getAllUsernamesExceptCurrent(){ + public List getAllUsernamesExceptCurrent() { return userRoleRepository.getAllUsernames(); } - + @IsViewer - public String getUsername4(){ + public String getUsername4() { SecurityContext securityContext = SecurityContextHolder.getContext(); return securityContext.getAuthentication().getName(); } - + @PreAuthorize("#username == authentication.principal.username") @PostAuthorize("returnObject.username == authentication.principal.nickName") - public CustomUser securedLoadUserDetail(String username){ + public CustomUser securedLoadUserDetail(String username) { return userRoleRepository.loadUserByUserName(username); } - + } diff --git a/spring-security-core/src/test/java/org/baeldung/methodsecurity/TestMethodSecurity.java b/spring-security-core/src/test/java/org/baeldung/methodsecurity/TestMethodSecurity.java index 4e4b665fb2..bc66c0b081 100644 --- a/spring-security-core/src/test/java/org/baeldung/methodsecurity/TestMethodSecurity.java +++ b/spring-security-core/src/test/java/org/baeldung/methodsecurity/TestMethodSecurity.java @@ -21,144 +21,144 @@ import org.springframework.test.context.junit4.SpringRunner; @RunWith(SpringRunner.class) @ContextConfiguration -public class TestMethodSecurity{ - +public class TestMethodSecurity { + @Autowired UserRoleService userRoleService; - + @Configuration @ComponentScan("org.baeldung.methodsecurity.*") public static class SpringConfig { } - - @Test(expected=AuthenticationCredentialsNotFoundException.class) - public void givenNoSecurity_whenCallGetUsername_thenReturnException(){ + + @Test(expected = AuthenticationCredentialsNotFoundException.class) + public void givenNoSecurity_whenCallGetUsername_thenReturnException() { String userName = userRoleService.getUsername(); assertEquals("john", userName); } - + @Test - @WithMockUser(username="john",roles={"VIEWER"}) - public void givenRoleViewer_whenCallGetUsername_thenReturnUsername(){ + @WithMockUser(username = "john", roles = { "VIEWER" }) + public void givenRoleViewer_whenCallGetUsername_thenReturnUsername() { String userName = userRoleService.getUsername(); assertEquals("john", userName); } - + @Test - @WithMockUser(username="john",roles={"EDITOR"}) - public void givenUsernameJohn_whenCallIsValidUsername_thenReturnTrue(){ + @WithMockUser(username = "john", roles = { "EDITOR" }) + public void givenUsernameJohn_whenCallIsValidUsername_thenReturnTrue() { boolean isValid = userRoleService.isValidUsername("john"); assertEquals(true, isValid); } - + @Test(expected = AccessDeniedException.class) @WithMockUser(username = "john", roles = { "ADMIN" }) public void givenRoleAdmin_whenCallGetUsername_thenReturnAccessDenied() { userRoleService.getUsername(); } - + @Test(expected = AccessDeniedException.class) - @WithMockUser(username = "john", roles = {"USER"}) + @WithMockUser(username = "john", roles = { "USER" }) public void givenRoleUser_whenCallGetUsername2_thenReturnAccessDenied() { userRoleService.getUsername2(); } - + @Test - @WithMockUser(username="john",roles={"VIEWER","EDITOR"}) - public void givenRoleViewer_whenCallGetUsername2_thenReturnUsername(){ + @WithMockUser(username = "john", roles = { "VIEWER", "EDITOR" }) + public void givenRoleViewer_whenCallGetUsername2_thenReturnUsername() { String userName = userRoleService.getUsername2(); assertEquals("john", userName); } - + @Test - @WithMockUser(username="john",roles={"VIEWER"}) - public void givenUsernameJerry_whenCallIsValidUsername2_thenReturnFalse(){ + @WithMockUser(username = "john", roles = { "VIEWER" }) + public void givenUsernameJerry_whenCallIsValidUsername2_thenReturnFalse() { boolean isValid = userRoleService.isValidUsername2("jerry"); assertEquals(false, isValid); } - + @Test - @WithMockUser(username="JOHN",authorities={"SYS_ADMIN"}) - public void givenAuthoritySysAdmin_whenCallGetUsernameInLowerCase_thenReturnUsername(){ - String username = userRoleService.getUsernameInLowerCase(); + @WithMockUser(username = "JOHN", authorities = { "SYS_ADMIN" }) + public void givenAuthoritySysAdmin_whenCallGetUsernameInLowerCase_thenReturnUsername() { + String username = userRoleService.getUsernameLC(); assertEquals("john", username); } - + @Test - @WithMockUser(username="john",roles={"ADMIN","USER","VIEWER"}) - public void givenUserJohn_whenCallGetMyRolesWithJohn_thenReturnRoles(){ + @WithMockUser(username = "john", roles = { "ADMIN", "USER", "VIEWER" }) + public void givenUserJohn_whenCallGetMyRolesWithJohn_thenReturnRoles() { String roles = userRoleService.getMyRoles("john"); assertEquals("ROLE_ADMIN,ROLE_USER,ROLE_VIEWER", roles); } - - @Test(expected=AccessDeniedException.class) - @WithMockUser(username="john",roles={"ADMIN","USER","VIEWER"}) - public void givenUserJane_whenCallGetMyRolesWithJane_thenAccessDenied(){ + + @Test(expected = AccessDeniedException.class) + @WithMockUser(username = "john", roles = { "ADMIN", "USER", "VIEWER" }) + public void givenUserJane_whenCallGetMyRolesWithJane_thenAccessDenied() { userRoleService.getMyRoles("jane"); } - - @Test(expected=AccessDeniedException.class) + + @Test(expected = AccessDeniedException.class) @WithAnonymousUser - public void givenAnomynousUser_whenCallGetUsername_thenAccessDenied(){ + public void givenAnomynousUser_whenCallGetUsername_thenAccessDenied() { userRoleService.getUsername(); } - + @Test @WithMockJohnViewer - public void givenMockedJohnViewer_whenCallGetUsername_thenReturnUsername(){ + public void givenMockedJohnViewer_whenCallGetUsername_thenReturnUsername() { String userName = userRoleService.getUsername(); assertEquals("john", userName); } - + @Test - @WithMockUser(username="jane") - public void givenListContainCurrentUsername_whenJoinUsernames_thenReturnUsernames(){ + @WithMockUser(username = "jane") + public void givenListContainCurrentUsername_whenJoinUsernames_thenReturnUsernames() { List usernames = new ArrayList<>(); usernames.add("jane"); usernames.add("john"); usernames.add("jack"); String containCurrentUser = userRoleService.joinUsernames(usernames); assertEquals("john;jack", containCurrentUser); - + } - + @Test - @WithMockUser(username="john") - public void givenListNotContainCurrentUsername_whenCallContainCurrentUser_thenReturnAccessDenied(){ + @WithMockUser(username = "john") + public void givenListNotContainCurrentUsername_whenCallContainCurrentUser_thenReturnAccessDenied() { List usernames = new ArrayList<>(); usernames.add("jane"); usernames.add("john"); usernames.add("jack"); - + List roles = new ArrayList<>(); roles.add("ROLE_ADMIN"); roles.add("ROLE_TEST"); - - String containCurrentUser = userRoleService.joinUsernamesAndRoles(usernames,roles); + + String containCurrentUser = userRoleService.joinUsernamesAndRoles(usernames, roles); assertEquals("jane;jack:ROLE_ADMIN;ROLE_TEST", containCurrentUser); } - + @Test - @WithMockUser(username="john") - public void givenUserJohn_whenCallGetAllUsernamesExceptCurrent_thenReturnOtherusernames(){ + @WithMockUser(username = "john") + public void givenUserJohn_whenCallGetAllUsernamesExceptCurrent_thenReturnOtherusernames() { List others = userRoleService.getAllUsernamesExceptCurrent(); assertEquals(2, others.size()); assertTrue(others.contains("jane")); assertTrue(others.contains("jack")); } - + @Test - @WithMockUser(username="john",roles={"VIEWER"}) - public void givenRoleViewer_whenCallGetUsername4_thenReturnUsername(){ + @WithMockUser(username = "john", roles = { "VIEWER" }) + public void givenRoleViewer_whenCallGetUsername4_thenReturnUsername() { String userName = userRoleService.getUsername4(); assertEquals("john", userName); } - - @Test(expected=AccessDeniedException.class) - @WithMockUser(username="john") - public void givenDefaultRole_whenCallGetUsername4_thenAccessDenied(){ + + @Test(expected = AccessDeniedException.class) + @WithMockUser(username = "john") + public void givenDefaultRole_whenCallGetUsername4_thenAccessDenied() { userRoleService.getUsername4(); } - + } \ No newline at end of file diff --git a/spring-security-core/src/test/java/org/baeldung/methodsecurity/TestWithMockUserAtClassLevel.java b/spring-security-core/src/test/java/org/baeldung/methodsecurity/TestWithMockUserAtClassLevel.java index 319aee63a6..4df1af8ca9 100644 --- a/spring-security-core/src/test/java/org/baeldung/methodsecurity/TestWithMockUserAtClassLevel.java +++ b/spring-security-core/src/test/java/org/baeldung/methodsecurity/TestWithMockUserAtClassLevel.java @@ -14,18 +14,18 @@ import org.springframework.test.context.junit4.SpringRunner; @RunWith(SpringRunner.class) @ContextConfiguration -@WithMockUser(username="john",roles={"VIEWER"}) +@WithMockUser(username = "john", roles = { "VIEWER" }) public class TestWithMockUserAtClassLevel { - + @Test - public void givenRoleViewer_whenCallGetUsername_thenReturnUsername(){ + public void givenRoleViewer_whenCallGetUsername_thenReturnUsername() { String currentUserName = userService.getUsername(); - assertEquals("john",currentUserName); + assertEquals("john", currentUserName); } - + @Autowired UserRoleService userService; - + @Configuration @ComponentScan("org.baeldung.methodsecurity.*") public static class SpringConfig { diff --git a/spring-security-core/src/test/java/org/baeldung/methodsecurity/TestWithUserDetails.java b/spring-security-core/src/test/java/org/baeldung/methodsecurity/TestWithUserDetails.java index 6c1d2ab62c..3ef5996554 100644 --- a/spring-security-core/src/test/java/org/baeldung/methodsecurity/TestWithUserDetails.java +++ b/spring-security-core/src/test/java/org/baeldung/methodsecurity/TestWithUserDetails.java @@ -17,40 +17,40 @@ import org.springframework.test.context.junit4.SpringRunner; @RunWith(SpringRunner.class) @ContextConfiguration public class TestWithUserDetails { - + @Autowired UserRoleService userService; - + @Configuration @ComponentScan("org.baeldung.methodsecurity.*") public static class SpringConfig { } - + @Test - @WithUserDetails(value="john",userDetailsServiceBeanName="userDetailService") - public void whenJohn_callLoadUserDetail_thenOK(){ + @WithUserDetails(value = "john", userDetailsServiceBeanName = "userDetailService") + public void whenJohn_callLoadUserDetail_thenOK() { CustomUser user = userService.loadUserDetail("jane"); - assertEquals("jane",user.getNickName()); + assertEquals("jane", user.getNickName()); } - + @Test - @WithUserDetails(value="jane",userDetailsServiceBeanName="userDetailService") - public void givenJane_callSecuredLoadUserDetailWithJane_thenOK(){ + @WithUserDetails(value = "jane", userDetailsServiceBeanName = "userDetailService") + public void givenJane_callSecuredLoadUserDetailWithJane_thenOK() { CustomUser user = userService.securedLoadUserDetail("jane"); - assertEquals("jane",user.getNickName()); - assertEquals("jane",user.getUsername()); + assertEquals("jane", user.getNickName()); + assertEquals("jane", user.getUsername()); } - - @Test(expected=AccessDeniedException.class) - @WithUserDetails(value="john",userDetailsServiceBeanName="userDetailService") - public void givenJohn_callSecuredLoadUserDetailWithJane_thenAccessDenied(){ + + @Test(expected = AccessDeniedException.class) + @WithUserDetails(value = "john", userDetailsServiceBeanName = "userDetailService") + public void givenJohn_callSecuredLoadUserDetailWithJane_thenAccessDenied() { userService.securedLoadUserDetail("jane"); } - - @Test(expected=AccessDeniedException.class) - @WithUserDetails(value="john",userDetailsServiceBeanName="userDetailService") - public void givenJohn_callSecuredLoadUserDetailWithJohn_thenAccessDenied(){ + + @Test(expected = AccessDeniedException.class) + @WithUserDetails(value = "john", userDetailsServiceBeanName = "userDetailService") + public void givenJohn_callSecuredLoadUserDetailWithJohn_thenAccessDenied() { userService.securedLoadUserDetail("john"); } } From b0d331f2ddea55aad2a6bb22095a02ba04e53d0c Mon Sep 17 00:00:00 2001 From: linhvovn Date: Mon, 8 Jan 2018 01:27:53 +0800 Subject: [PATCH 4/5] [BAEL-1411:tlinh2110] Add example for PostAuthorize --- .../methodsecurity/service/UserRoleService.java | 12 +++++++----- .../baeldung/methodsecurity/TestMethodSecurity.java | 13 +++++++++++++ 2 files changed, 20 insertions(+), 5 deletions(-) diff --git a/spring-security-core/src/main/java/org/baeldung/methodsecurity/service/UserRoleService.java b/spring-security-core/src/main/java/org/baeldung/methodsecurity/service/UserRoleService.java index c980334e82..30bbdbc10f 100644 --- a/spring-security-core/src/main/java/org/baeldung/methodsecurity/service/UserRoleService.java +++ b/spring-security-core/src/main/java/org/baeldung/methodsecurity/service/UserRoleService.java @@ -64,11 +64,13 @@ public class UserRoleService { @PreAuthorize("#username == authentication.principal.username") public String getMyRoles(String username) { SecurityContext securityContext = SecurityContextHolder.getContext(); - return securityContext - .getAuthentication() - .getAuthorities() - .stream() - .map(auth -> auth.getAuthority()).collect(Collectors.joining(",")); + return securityContext.getAuthentication().getAuthorities().stream().map(auth -> auth.getAuthority()).collect(Collectors.joining(",")); + } + + @PostAuthorize("#username == authentication.principal.username") + public String getMyRoles2(String username) { + SecurityContext securityContext = SecurityContextHolder.getContext(); + return securityContext.getAuthentication().getAuthorities().stream().map(auth -> auth.getAuthority()).collect(Collectors.joining(",")); } @PostAuthorize("returnObject.username == authentication.principal.nickName") diff --git a/spring-security-core/src/test/java/org/baeldung/methodsecurity/TestMethodSecurity.java b/spring-security-core/src/test/java/org/baeldung/methodsecurity/TestMethodSecurity.java index bc66c0b081..2f48bce1fd 100644 --- a/spring-security-core/src/test/java/org/baeldung/methodsecurity/TestMethodSecurity.java +++ b/spring-security-core/src/test/java/org/baeldung/methodsecurity/TestMethodSecurity.java @@ -97,6 +97,19 @@ public class TestMethodSecurity { public void givenUserJane_whenCallGetMyRolesWithJane_thenAccessDenied() { userRoleService.getMyRoles("jane"); } + + @Test + @WithMockUser(username = "john", roles = { "ADMIN", "USER", "VIEWER" }) + public void givenUserJohn_whenCallGetMyRoles2WithJohn_thenReturnRoles() { + String roles = userRoleService.getMyRoles2("john"); + assertEquals("ROLE_ADMIN,ROLE_USER,ROLE_VIEWER", roles); + } + + @Test(expected = AccessDeniedException.class) + @WithMockUser(username = "john", roles = { "ADMIN", "USER", "VIEWER" }) + public void givenUserJane_whenCallGetMyRoles2WithJane_thenAccessDenied() { + userRoleService.getMyRoles2("jane"); + } @Test(expected = AccessDeniedException.class) @WithAnonymousUser From 70638b90f140b30acd84e83507e3b62825faeb5a Mon Sep 17 00:00:00 2001 From: linhvovn Date: Thu, 11 Jan 2018 23:02:48 +0800 Subject: [PATCH 5/5] [tlinh2110] Change test name --- .../java/org/baeldung/methodsecurity/TestMethodSecurity.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/spring-security-core/src/test/java/org/baeldung/methodsecurity/TestMethodSecurity.java b/spring-security-core/src/test/java/org/baeldung/methodsecurity/TestMethodSecurity.java index 2f48bce1fd..309ee3076d 100644 --- a/spring-security-core/src/test/java/org/baeldung/methodsecurity/TestMethodSecurity.java +++ b/spring-security-core/src/test/java/org/baeldung/methodsecurity/TestMethodSecurity.java @@ -133,12 +133,11 @@ public class TestMethodSecurity { usernames.add("jack"); String containCurrentUser = userRoleService.joinUsernames(usernames); assertEquals("john;jack", containCurrentUser); - } @Test @WithMockUser(username = "john") - public void givenListNotContainCurrentUsername_whenCallContainCurrentUser_thenReturnAccessDenied() { + public void givenListContainCurrentUsername_whenCallJoinUsernamesAndRoles_thenReturnUsernameAndRoles() { List usernames = new ArrayList<>(); usernames.add("jane"); usernames.add("john");