Skip to content
Snippets Groups Projects
Commit ac7b3dc1 authored by Sonia Zorba's avatar Sonia Zorba
Browse files

Groups persistence and logic

parent 844e9e5e
No related branches found
No related tags found
No related merge requests found
Showing
with 479 additions and 28 deletions
......@@ -4,17 +4,33 @@ import java.util.Collection;
import java.util.Map;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.oauth2.common.OAuth2AccessToken;
import org.springframework.security.oauth2.common.OAuth2RefreshToken;
public class CustomAuthenticationData extends UsernamePasswordAuthenticationToken {
private final Map<String, Object> attributes;
private final OAuth2AccessToken accessToken;
private final OAuth2RefreshToken refreshToken;
public CustomAuthenticationData(String username, Map<String, Object> attributes, Collection<? extends GrantedAuthority> authorities) {
public CustomAuthenticationData(String username, Map<String, Object> attributes,
Collection<? extends GrantedAuthority> authorities,
OAuth2AccessToken accessToken, OAuth2RefreshToken refreshToken) {
super(username, "N/A", authorities);
this.attributes = attributes;
this.accessToken = accessToken;
this.refreshToken = refreshToken;
}
public Map<String, Object> getAttributes() {
return attributes;
}
public OAuth2AccessToken getAccessToken() {
return accessToken;
}
public OAuth2RefreshToken getRefreshToken() {
return refreshToken;
}
}
......@@ -6,6 +6,7 @@ import org.springframework.security.core.Authentication;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.AuthorityUtils;
import org.springframework.security.oauth2.common.OAuth2AccessToken;
import org.springframework.security.oauth2.common.OAuth2RefreshToken;
import org.springframework.security.oauth2.provider.token.DefaultUserAuthenticationConverter;
import org.springframework.security.oauth2.provider.token.store.jwk.JwkTokenStore;
......@@ -25,12 +26,12 @@ public class CustomIdTokenConverter extends DefaultUserAuthenticationConverter {
OAuth2AccessToken token = jwkTokenStore.readAccessToken(idToken);
Map<String, Object> claims = token.getAdditionalInformation();
//OAuth2RefreshToken refreshToken = token.getRefreshToken();
OAuth2RefreshToken refreshToken = token.getRefreshToken();
String principal = (String) claims.get("sub");
List<GrantedAuthority> authorities = AuthorityUtils.createAuthorityList("ROLE_USER");
return new CustomAuthenticationData(principal, claims, authorities);
return new CustomAuthenticationData(principal, claims, authorities, token, refreshToken);
}
}
package it.inaf.ia2.gms.authn;
import java.security.Principal;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
......@@ -8,6 +9,9 @@ import org.springframework.web.bind.annotation.RestController;
@RestController
public class LoginController {
@Autowired
private SessionData sessionData;
@GetMapping("/login")
public Principal start(Principal principal) {
return principal;
......
package it.inaf.ia2.gms.authn;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.annotation.Order;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
@Configuration
@Order(1000)
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.csrf().disable();
}
}
package it.inaf.ia2.gms.authn;
import it.inaf.ia2.gms.persistence.UsersRepository;
import it.inaf.ia2.gms.persistence.model.User;
import javax.annotation.PostConstruct;
import javax.servlet.http.HttpServletRequest;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.oauth2.provider.OAuth2Authentication;
import org.springframework.stereotype.Component;
import org.springframework.web.context.annotation.SessionScope;
@Component
@SessionScope
public class SessionData {
@Autowired
private HttpServletRequest request;
@Autowired
private UsersRepository usersRepository;
private String userId;
@PostConstruct
public void init() {
CustomAuthenticationData authn = (CustomAuthenticationData) ((OAuth2Authentication) request.getUserPrincipal()).getUserAuthentication();
userId = (String) authn.getPrincipal();
//accessToken = (String) ((CustomAuthenticationData) request.getUserPrincipal()).getAttributes().get("access_token");
//System.out.println("SessionData initialized: " + accessToken);
if (!usersRepository.findById(userId).isPresent()) {
User user = new User();
user.setId(userId);
usersRepository.save(user);
}
}
public String getUserId() {
return userId;
}
}
package it.inaf.ia2.gms.controller;
import it.inaf.ia2.gms.authn.SessionData;
import it.inaf.ia2.gms.model.CreateGroupRequest;
import it.inaf.ia2.gms.model.GroupsModelRequest;
import it.inaf.ia2.gms.model.GroupsModelResponse;
import it.inaf.ia2.gms.persistence.model.Group;
import it.inaf.ia2.gms.persistence.model.User;
import it.inaf.ia2.gms.service.GroupsModelService;
import it.inaf.ia2.gms.service.GroupsService;
import it.inaf.ia2.gms.service.UsersService;
import javax.validation.Valid;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class GroupsController {
@Autowired
private SessionData session;
private UsersService usersService;
@Autowired
private GroupsModelService groupsModelService;
@Autowired
private GroupsService groupsService;
@GetMapping(value = "/groups", produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
public GroupsModelResponse getGroupsModelResponse(@Valid @RequestBody GroupsModelRequest groupsModelRequest) {
return groupsModelService.getGroupsModel(groupsModelRequest, session.getUserId());
}
@PostMapping(value = "/group", consumes = MediaType.APPLICATION_JSON_UTF8_VALUE, produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
public ResponseEntity<String> createGroup(@Valid @RequestBody CreateGroupRequest createGroupRequest) {
User user = usersService.getUserById(session.getUserId());
Group group = groupsService.addGroup(createGroupRequest.getParentGroupId(), createGroupRequest.getGroupName(), user);
return new ResponseEntity<>(group.getId(), HttpStatus.CREATED);
}
}
package it.inaf.ia2.gms.controller;
import it.inaf.ia2.gms.controller.model.GroupsModelRequest;
import it.inaf.ia2.gms.controller.model.GroupsModelResponse;
import javax.validation.Valid;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class GroupsModelController {
@GetMapping
public GroupsModelResponse getGroupsModelResponse(@Valid @RequestBody GroupsModelRequest groupsModelRequest) {
return null;
}
}
package it.inaf.ia2.gms.controller.model;
public class GroupsModelResponse extends BaseModelResponse {
}
package it.inaf.ia2.gms.exception;
public class UnauthorizedException extends RuntimeException {
public UnauthorizedException(String message) {
super(message);
}
}
package it.inaf.ia2.gms.controller.model;
package it.inaf.ia2.gms.model;
public abstract class BaseModelRequest {
......
package it.inaf.ia2.gms.controller.model;
package it.inaf.ia2.gms.model;
public abstract class BaseModelResponse {
......
package it.inaf.ia2.gms.model;
public class CreateGroupRequest {
private String parentGroupId;
private String groupName;
public String getParentGroupId() {
return parentGroupId;
}
public void setParentGroupId(String parentGroupId) {
this.parentGroupId = parentGroupId;
}
public String getGroupName() {
return groupName;
}
public void setGroupName(String groupName) {
this.groupName = groupName;
}
}
package it.inaf.ia2.gms.controller.model;
package it.inaf.ia2.gms.model;
public class GroupsModelRequest extends BaseModelRequest {
public class GroupBreadcrumb {
private String groupId;
private String groupName;
public String getGroupId() {
return groupId;
......@@ -11,4 +12,12 @@ public class GroupsModelRequest extends BaseModelRequest {
public void setGroupId(String groupId) {
this.groupId = groupId;
}
public String getGroupName() {
return groupName;
}
public void setGroupName(String groupName) {
this.groupName = groupName;
}
}
package it.inaf.ia2.gms.service.model;
package it.inaf.ia2.gms.model;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
public class GroupNode {
private String groupId;
private String groupName;
private List<Permission> permissions;
private Set<Permission> permissions;
private boolean hasChildren;
public GroupNode() {
permissions = new ArrayList<>();
permissions = new HashSet<>();
}
public String getGroupId() {
......@@ -31,13 +34,45 @@ public class GroupNode {
}
public List<Permission> getPermissions() {
return permissions;
return Collections.unmodifiableList(new ArrayList<>(permissions));
}
public void setPermissions(List<Permission> permissions) {
public void setPermissions(Set<Permission> permissions) {
this.permissions = permissions;
}
public void addPermission(Permission permission) {
// remove implied permissions
switch (permission) {
case ADMIN:
permissions.add(permission);
permissions.remove(Permission.MANAGE_MEMBERS);
permissions.remove(Permission.VIEW_MEMBERS);
permissions.remove(Permission.TRAVERSE);
break;
case MANAGE_MEMBERS:
if (!permissions.contains(Permission.ADMIN)) {
permissions.add(permission);
permissions.remove(Permission.VIEW_MEMBERS);
permissions.remove(Permission.TRAVERSE);
}
break;
case VIEW_MEMBERS:
if (!permissions.contains(Permission.ADMIN)
&& !permissions.contains(Permission.MANAGE_MEMBERS)) {
permissions.add(permission);
permissions.remove(Permission.TRAVERSE);
}
break;
case TRAVERSE:
if (permissions.isEmpty()) {
permissions.add(permission);
}
break;
}
}
public boolean isHasChildren() {
return hasChildren;
}
......
package it.inaf.ia2.gms.model;
public class GroupsModelRequest extends BaseModelRequest {
private String groupId;
private int paginatorPage;
private int paginatorPageSize;
public String getGroupId() {
return groupId;
}
public void setGroupId(String groupId) {
this.groupId = groupId;
}
public int getPaginatorPage() {
return paginatorPage;
}
public void setPaginatorPage(int paginatorPage) {
this.paginatorPage = paginatorPage;
}
public int getPaginatorPageSize() {
return paginatorPageSize;
}
public void setPaginatorPageSize(int paginatorPageSize) {
this.paginatorPageSize = paginatorPageSize;
}
}
package it.inaf.ia2.gms.model;
import java.util.List;
public class GroupsModelResponse extends BaseModelResponse {
private List<GroupBreadcrumb> breadcrumbs;
private PaginatedData<GroupNode> groupsPanel;
private PaginatedData<RapUser> membersPanel;
private PaginatedData<UserPermission> permissionsPanel;
// current group permissions
private List<Permission> permissions;
public List<GroupBreadcrumb> getBreadcrumbs() {
return breadcrumbs;
}
public void setBreadcrumbs(List<GroupBreadcrumb> breadcrumbs) {
this.breadcrumbs = breadcrumbs;
}
public PaginatedData<GroupNode> getGroupsPanel() {
return groupsPanel;
}
public void setGroupsPanel(PaginatedData<GroupNode> groupsPanel) {
this.groupsPanel = groupsPanel;
}
public PaginatedData<RapUser> getMembersPanel() {
return membersPanel;
}
public void setMembersPanel(PaginatedData<RapUser> membersPanel) {
this.membersPanel = membersPanel;
}
public PaginatedData<UserPermission> getPermissionsPanel() {
return permissionsPanel;
}
public void setPermissionsPanel(PaginatedData<UserPermission> permissionsPanel) {
this.permissionsPanel = permissionsPanel;
}
public List<Permission> getPermissions() {
return permissions;
}
public void setPermissions(List<Permission> permissions) {
this.permissions = permissions;
}
}
package it.inaf.ia2.gms.model;
public class Identity {
private IdentityType type;
private String email;
public IdentityType getType() {
return type;
}
public void setType(IdentityType type) {
this.type = type;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}
package it.inaf.ia2.gms.model;
public enum IdentityType {
EDU_GAIN,
X509,
ORCID,
GOOGLE,
LINKEDIN,
FACEBOOK,
LOCAL_IDP
}
package it.inaf.ia2.gms.model;
import java.util.ArrayList;
import java.util.List;
public class PaginatedData<T> {
// how many page index links have to be shown
private static final int LINKS_SIZE = 5;
private final List<T> items;
private final int currentPage;
private final List<Integer> links;
private final int totalItems;
private final int pageSize;
private final int totalPages;
private final boolean hasPreviousPages;
private final boolean hasFollowingPages;
public PaginatedData(List<T> allItems, int page, int pageSize) {
totalItems = allItems.size();
this.currentPage = page;
this.pageSize = pageSize;
totalPages = (int) Math.ceil((double) totalItems / pageSize);
if (allItems.isEmpty()) {
items = allItems;
} else {
int firstElementIndex = (currentPage - 1) * pageSize;
int lastElementIndex = Math.min(currentPage * pageSize - 1, totalItems - 1);
items = new ArrayList<>(allItems.subList(firstElementIndex, lastElementIndex));
}
links = new ArrayList<>();
int start = currentPage - LINKS_SIZE / 2;
if (start > 1 && start + LINKS_SIZE > totalPages) {
start = totalPages - LINKS_SIZE + 1;
}
if (start < 1) {
start = 1;
}
int i = start;
hasPreviousPages = start > 1;
while (i < start + LINKS_SIZE && i <= totalPages) {
links.add(i++);
}
hasFollowingPages = totalPages > i;
}
public List<T> getItems() {
return items;
}
public int getCurrentPage() {
return currentPage;
}
public List<Integer> getLinks() {
return links;
}
public int getTotalItems() {
return totalItems;
}
public int getPageSize() {
return pageSize;
}
public int getTotalPages() {
return totalPages;
}
public boolean isHasPreviousPages() {
return hasPreviousPages;
}
public boolean isHasFollowingPages() {
return hasFollowingPages;
}
}
package it.inaf.ia2.gms.service.model;
package it.inaf.ia2.gms.model;
public enum Permission {
ADMIN,
MANAGE_MEMBERS,
READ
VIEW_MEMBERS,
TRAVERSE
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment