/ambari-server/src/test/java/org/apache/ambari/server/security/authorization/UsersTest.java

https://github.com/sonia-garudi/ambari · Java · 211 lines · 145 code · 42 blank · 24 comment · 0 complexity · 8b4b9744054694832e61972ed93c6f6e MD5 · raw file

  1. /*
  2. * Licensed to the Apache Software Foundation (ASF) under one
  3. * or more contributor license agreements. See the NOTICE file
  4. * distributed with this work for additional information
  5. * regarding copyright ownership. The ASF licenses this file
  6. * to you under the Apache License, Version 2.0 (the
  7. * "License"); you may not use this file except in compliance
  8. * with the License. You may obtain a copy of the License at
  9. *
  10. * http://www.apache.org/licenses/LICENSE-2.0
  11. *
  12. * Unless required by applicable law or agreed to in writing, software
  13. * distributed under the License is distributed on an "AS IS" BASIS,
  14. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  15. * See the License for the specific language governing permissions and
  16. * limitations under the License.
  17. */
  18. package org.apache.ambari.server.security.authorization;
  19. import static org.easymock.EasyMock.anyObject;
  20. import static org.easymock.EasyMock.anyString;
  21. import static org.easymock.EasyMock.capture;
  22. import static org.easymock.EasyMock.eq;
  23. import static org.easymock.EasyMock.expect;
  24. import static org.easymock.EasyMock.expectLastCall;
  25. import static org.easymock.EasyMock.newCapture;
  26. import java.util.ArrayList;
  27. import java.util.Collection;
  28. import java.util.Collections;
  29. import java.util.List;
  30. import javax.annotation.Nullable;
  31. import javax.persistence.EntityManager;
  32. import org.apache.ambari.server.AmbariException;
  33. import org.apache.ambari.server.configuration.Configuration;
  34. import org.apache.ambari.server.hooks.HookContextFactory;
  35. import org.apache.ambari.server.hooks.HookService;
  36. import org.apache.ambari.server.orm.DBAccessor;
  37. import org.apache.ambari.server.orm.dao.MemberDAO;
  38. import org.apache.ambari.server.orm.dao.PrincipalDAO;
  39. import org.apache.ambari.server.orm.dao.PrivilegeDAO;
  40. import org.apache.ambari.server.orm.dao.UserDAO;
  41. import org.apache.ambari.server.orm.entities.GroupEntity;
  42. import org.apache.ambari.server.orm.entities.MemberEntity;
  43. import org.apache.ambari.server.orm.entities.PermissionEntity;
  44. import org.apache.ambari.server.orm.entities.PrincipalEntity;
  45. import org.apache.ambari.server.orm.entities.PrivilegeEntity;
  46. import org.apache.ambari.server.orm.entities.UserEntity;
  47. import org.apache.ambari.server.state.stack.OsFamily;
  48. import org.easymock.Capture;
  49. import org.easymock.EasyMock;
  50. import org.easymock.EasyMockSupport;
  51. import org.junit.Test;
  52. import org.springframework.security.crypto.password.PasswordEncoder;
  53. import com.google.inject.AbstractModule;
  54. import com.google.inject.Guice;
  55. import com.google.inject.Injector;
  56. import junit.framework.Assert;
  57. public class UsersTest extends EasyMockSupport {
  58. public static final String SERVICEOP_USER_NAME = "serviceopuser";
  59. private Injector injector;
  60. @Test
  61. public void testGetUserAuthorities() throws Exception {
  62. createInjector();
  63. PrincipalEntity userPrincipalEntity = createMock(PrincipalEntity.class);
  64. UserEntity userEntity = createMock(UserEntity.class);
  65. expect(userEntity.getPrincipal()).andReturn(userPrincipalEntity).times(1);
  66. UserDAO userDAO = injector.getInstance(UserDAO.class);
  67. expect(userDAO.findUserByNameAndType("user1", UserType.LOCAL)).andReturn(userEntity).times(1);
  68. PrincipalEntity groupPrincipalEntity = createMock(PrincipalEntity.class);
  69. GroupEntity groupEntity = createMock(GroupEntity.class);
  70. expect(groupEntity.getPrincipal()).andReturn(groupPrincipalEntity).times(1);
  71. MemberEntity memberEntity = createMock(MemberEntity.class);
  72. expect(memberEntity.getGroup()).andReturn(groupEntity).times(1);
  73. MemberDAO memberDAO = injector.getInstance(MemberDAO.class);
  74. expect(memberDAO.findAllMembersByUser(userEntity)).andReturn(Collections.singletonList(memberEntity)).times(1);
  75. PrincipalEntity clusterUserPrivilegePermissionPrincipalEntity = createMock(PrincipalEntity.class);
  76. PermissionEntity clusterUserPrivilegePermissionEntity = createMock(PermissionEntity.class);
  77. expect(clusterUserPrivilegePermissionEntity.getPrincipal()).andReturn(clusterUserPrivilegePermissionPrincipalEntity).times(1);
  78. PrivilegeEntity clusterUserPrivilegeEntity = createMock(PrivilegeEntity.class);
  79. expect(clusterUserPrivilegeEntity.getPermission()).andReturn(clusterUserPrivilegePermissionEntity).times(1);
  80. PrincipalEntity clusterOperatorPrivilegePermissionPrincipalEntity = createMock(PrincipalEntity.class);
  81. PermissionEntity clusterOperatorPrivilegePermissionEntity = createMock(PermissionEntity.class);
  82. expect(clusterOperatorPrivilegePermissionEntity.getPrincipal()).andReturn(clusterOperatorPrivilegePermissionPrincipalEntity).times(1);
  83. PrivilegeEntity clusterOperatorPrivilegeEntity = createMock(PrivilegeEntity.class);
  84. expect(clusterOperatorPrivilegeEntity.getPermission()).andReturn(clusterOperatorPrivilegePermissionEntity).times(1);
  85. List<PrivilegeEntity> privilegeEntities = new ArrayList<>();
  86. privilegeEntities.add(clusterUserPrivilegeEntity);
  87. privilegeEntities.add(clusterOperatorPrivilegeEntity);
  88. PrivilegeEntity clusterUserViewUserPrivilegeEntity = createMock(PrivilegeEntity.class);
  89. List<PrivilegeEntity> rolePrivilegeEntities = new ArrayList<>();
  90. rolePrivilegeEntities.add(clusterUserViewUserPrivilegeEntity);
  91. Capture<? extends List<PrincipalEntity>> principalEntitiesCapture = newCapture();
  92. Capture<? extends List<PrincipalEntity>> rolePrincipalEntitiesCapture = newCapture();
  93. PrivilegeDAO privilegeDAO = injector.getInstance(PrivilegeDAO.class);
  94. expect(privilegeDAO.findAllByPrincipal(capture(principalEntitiesCapture))).andReturn(privilegeEntities).times(1);
  95. expect(privilegeDAO.findAllByPrincipal(capture(rolePrincipalEntitiesCapture))).andReturn(rolePrivilegeEntities).times(1);
  96. replayAll();
  97. Users user = injector.getInstance(Users.class);
  98. Collection<AmbariGrantedAuthority> authorities = user.getUserAuthorities("user1", UserType.LOCAL);
  99. verifyAll();
  100. Assert.assertEquals(2, principalEntitiesCapture.getValue().size());
  101. Assert.assertTrue(principalEntitiesCapture.getValue().contains(userPrincipalEntity));
  102. Assert.assertTrue(principalEntitiesCapture.getValue().contains(groupPrincipalEntity));
  103. Assert.assertEquals(2, rolePrincipalEntitiesCapture.getValue().size());
  104. Assert.assertTrue(rolePrincipalEntitiesCapture.getValue().contains(clusterUserPrivilegePermissionPrincipalEntity));
  105. Assert.assertTrue(rolePrincipalEntitiesCapture.getValue().contains(clusterOperatorPrivilegePermissionPrincipalEntity));
  106. Assert.assertEquals(3, authorities.size());
  107. Assert.assertTrue(authorities.contains(new AmbariGrantedAuthority(clusterUserPrivilegeEntity)));
  108. Assert.assertTrue(authorities.contains(new AmbariGrantedAuthority(clusterOperatorPrivilegeEntity)));
  109. Assert.assertTrue(authorities.contains(new AmbariGrantedAuthority(clusterUserViewUserPrivilegeEntity)));
  110. }
  111. /**
  112. * User creation should complete without exception in case of unique user name
  113. */
  114. @Test
  115. public void testCreateUser_NoDuplicates() throws Exception {
  116. initForCreateUser(null);
  117. Users users = injector.getInstance(Users.class);
  118. users.createUser(SERVICEOP_USER_NAME, "qwert");
  119. }
  120. /**
  121. * User creation should throw {@link AmbariException} in case another user exists with the same name but
  122. * different user type.
  123. */
  124. @Test(expected = AmbariException.class)
  125. public void testCreateUser_Duplicate() throws Exception {
  126. UserEntity existing = new UserEntity();
  127. existing.setUserName(UserName.fromString(SERVICEOP_USER_NAME));
  128. existing.setUserType(UserType.LDAP);
  129. existing.setUserId(1);
  130. existing.setMemberEntities(Collections.emptySet());
  131. PrincipalEntity principal = new PrincipalEntity();
  132. principal.setPrivileges(Collections.emptySet());
  133. existing.setPrincipal(principal);
  134. initForCreateUser(existing);
  135. Users users = injector.getInstance(Users.class);
  136. users.createUser(SERVICEOP_USER_NAME, "qwert");
  137. }
  138. private void initForCreateUser(@Nullable UserEntity existingUser) {
  139. UserDAO userDao = createStrictMock(UserDAO.class);
  140. expect(userDao.findSingleUserByName(anyString())).andReturn(existingUser);
  141. userDao.create(anyObject(UserEntity.class));
  142. expectLastCall();
  143. EntityManager entityManager = createNiceMock(EntityManager.class);
  144. expect(entityManager.find(eq(PrincipalEntity.class), EasyMock.anyObject())).andReturn(null);
  145. replayAll();
  146. createInjector(userDao, entityManager);
  147. }
  148. private void createInjector() {
  149. createInjector(createMock(UserDAO.class), createMock(EntityManager.class));
  150. }
  151. private void createInjector(final UserDAO mockUserDao, final EntityManager mockEntityManager) {
  152. injector = Guice.createInjector(new AbstractModule() {
  153. @Override
  154. protected void configure() {
  155. bind(EntityManager.class).toInstance(mockEntityManager);
  156. bind(DBAccessor.class).toInstance(createMock(DBAccessor.class));
  157. bind(OsFamily.class).toInstance(createNiceMock(OsFamily.class));
  158. bind(UserDAO.class).toInstance(mockUserDao);
  159. bind(MemberDAO.class).toInstance(createMock(MemberDAO.class));
  160. bind(PrivilegeDAO.class).toInstance(createMock(PrivilegeDAO.class));
  161. bind(PasswordEncoder.class).toInstance(createMock(PasswordEncoder.class));
  162. bind(HookService.class).toInstance(createMock(HookService.class));
  163. bind(HookContextFactory.class).toInstance(createMock(HookContextFactory.class));
  164. bind(PrincipalDAO.class).toInstance(createMock(PrincipalDAO.class));
  165. bind(Configuration.class).toInstance(createNiceMock(Configuration.class));
  166. }
  167. });
  168. }
  169. }