Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feature: add enterprise id into token, remove wrong constraint #114

Merged
merged 3 commits into from
Feb 8, 2025
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
import java.util.Objects;
import java.util.Set;
import java.util.UUID;
import java.util.Optional;
import java.util.stream.Collectors;

public class JwtAuthenticationConverter
Expand Down Expand Up @@ -50,11 +51,17 @@ public JwtAuthenticationTokenDecorator convert(Jwt source) {
})
.toList();
}
UUID enterpriseUUID = Optional.ofNullable(source.getClaims().get("enterpriseId"))
.map(Object::toString)
.map(UUID::fromString)
.orElse(null);
// EnterpriseID could be null when new user just sign up and not linked to any enterprise

return new JwtAuthenticationTokenDecorator(
source,
new UserContextData(
email,
enterpriseUUID,
StringUtils.EMPTY,
List.copyOf(authorities),
List.copyOf(buildingPermissions)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,13 @@
import sep490.common.api.dto.auth.BuildingPermissionDTO;

import java.util.List;
import java.util.UUID;

@Getter
@RequiredArgsConstructor
public class UserContextData implements UserDetails {
private final String username;
private final UUID enterpriseId;
private final String password;
private final List<GrantedAuthority> authorities;
private final List<BuildingPermissionDTO> permissions;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
import java.util.Collections;
import java.util.List;
import java.util.Optional;
import java.util.UUID;

public final class SecurityUtils {

Expand All @@ -18,6 +19,10 @@ private SecurityUtils() {
public static Optional<String> getCurrentUserEmail() {
return getUserContextData().map(UserContextData::getUsername);
}

public static Optional<UUID> getCurrentUserEnterpriseId() {
return getUserContextData().map(UserContextData::getEnterpriseId);
}

public static List<BuildingPermissionDTO> getPermissions() {
Optional<UserContextData> currentUser = getUserContextData();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,13 @@ public abstract class EnterpriseUserMapperDecorator implements EnterpriseUserMap

@Autowired
private BuildingPermissionRepository buildingPermissionRepository;

@Override
public UserEntity createNewEnterpriseUser(EnterpriseUserDetailsDTO dto) {
UserEntity user = delegate.createNewEnterpriseUser(dto);
user.getEnterprise().setEnterprise(SecurityUtils.getCurrentUserEnterpriseId().orElseThrow());
return user;
}

@Override
public void updateEnterpriseUser(UserEntity user, EnterpriseUserDetailsDTO dto) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -48,10 +48,11 @@ WHERE u.id IN (:ids)
SELECT u.id
FROM UserEntity u
WHERE u.enterprise.role <> sep490.common.api.security.UserRole.ENTERPRISE_OWNER
AND u.enterprise.enterprise = :enterpriseId
AND (LOWER(u.firstName) LIKE LOWER(CONCAT('%', :name, '%')) OR LOWER(u.lastName) LIKE LOWER(CONCAT('%', :name, '%')))
"""
)
Page<UUID> findByName(String name, Pageable pageable);
Page<UUID> findByName(String name, UUID enterpriseId, Pageable pageable);

@Query("""
SELECT u
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package sep490.idp.security;


import commons.springfw.impl.securities.UserContextData;
import jakarta.validation.constraints.NotNull;
import lombok.Getter;
Expand All @@ -17,7 +16,8 @@ public class MvcUserContextData extends UserContextData {
public MvcUserContextData(@NotNull UserEntity userEntity,
List<GrantedAuthority> authorities,
List<BuildingPermissionDTO> permissions) {
super(userEntity.getEmail(), userEntity.getPassword(), List.copyOf(authorities), List.copyOf(permissions));
super(userEntity.getEmail(), userEntity.getEnterprise().getId(),
userEntity.getPassword(), List.copyOf(authorities), List.copyOf(permissions));
this.userEntity = userEntity;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,15 @@
import org.springframework.security.oauth2.core.oidc.OidcUserInfo;
import org.springframework.stereotype.Service;
import sep490.common.api.dto.auth.BuildingPermissionDTO;
import sep490.idp.entity.UserEnterpriseEntity;
import sep490.idp.entity.UserEntity;
import sep490.idp.repository.BuildingPermissionRepository;
import sep490.idp.repository.UserRepository;

import java.util.HashMap;
import java.util.Map;
import java.util.Optional;
import java.util.UUID;

@Service
@RequiredArgsConstructor
Expand Down Expand Up @@ -48,6 +51,10 @@ public Map<String, Object> getCustomClaimsForJwtAuthenticationToken(String email
buildingPermission.getRole()
))
.toList();
claims.put("enterpriseId", Optional.ofNullable(user.getEnterprise())
.map(UserEnterpriseEntity::getEnterprise)
.map(UUID::toString)
.orElse(null));
claims.put("permissions", buildingPermissions);
return claims;
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package sep490.idp.service.impl;

import commons.springfw.impl.mappers.CommonMapper;
import commons.springfw.impl.utils.SecurityUtils;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Qualifier;
Expand Down Expand Up @@ -29,10 +30,7 @@
import sep490.idp.validation.Validator;
import sep490.idp.validators.UserValidator;

import java.util.Collections;
import java.util.List;
import java.util.Set;
import java.util.UUID;
import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;

Expand Down Expand Up @@ -99,8 +97,10 @@ private UserEntity createEnterpriseOwner(SignupDTO signupDTO) {

@Override
public Page<UserEntity> search(SearchCriteriaDTO<UserCriteriaDTO> searchCriteria) {
UUID enterpriseId = SecurityUtils.getCurrentUserEnterpriseId().orElseThrow();
var userIDs = userRepo.findByName(
searchCriteria.criteria().criteria(),
enterpriseId,
CommonMapper.toPageable(searchCriteria.page(), searchCriteria.sort()));
var results = userRepo
.findByIDsWithPermissions(userIDs.toSet())
Expand Down Expand Up @@ -130,14 +130,19 @@ public void deleteUsers(Set<UUID> userIds) {
@Override
public void createOrUpdateEnterpriseUser(UserEntity user) {
userValidator.validateEnterpriseOwnerManageEmployees(user);

var password = CommonUtils.alphaNumericString(12);
user.setPassword(passwordEncoder.encode(password));

this.performCreateUserAction(user);
userRepo.save(user);

var message = sendPasswordToUserByEmail(user.getEmail(), password);
emailUtil.sendMail(message);
}

private void performCreateUserAction(UserEntity user) {
// Perform create action when create new
if (Objects.isNull(user.getId())) {
var password = CommonUtils.alphaNumericString(12);
user.setPassword(passwordEncoder.encode(password));

var message = sendPasswordToUserByEmail(user.getEmail(), password);
emailUtil.sendMail(message);
}
}

private SEPMailMessage sendPasswordToUserByEmail(String email, String password) {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
ALTER TABLE enterprise_users DROP CONSTRAINT enterprise_users_fk_user;