All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.openfact.services.security.BasicSecurityContextProvider Maven / Gradle / Ivy

The newest version!
package org.openfact.services.security;

import org.openfact.models.AdminRoles;
import org.openfact.models.OpenfactSession;
import org.openfact.models.OrganizationModel;
import org.openfact.models.OrganizationProvider;
import org.openfact.provider.SingleProviderType;
import org.openfact.services.resource.security.ClientUser;
import org.openfact.services.resource.security.OrganizationAuth;
import org.openfact.services.resource.security.Resource;
import org.openfact.services.resource.security.SecurityContextProvider;

import javax.ejb.Stateless;
import javax.inject.Inject;
import javax.servlet.http.HttpServletRequest;
import javax.ws.rs.ForbiddenException;
import java.util.List;
import java.util.Optional;
import java.util.function.BiFunction;
import java.util.stream.Stream;

@Stateless
@SingleProviderType(provider = "restSecurity", value = "basic")
public class BasicSecurityContextProvider implements SecurityContextProvider {

    @Inject
    private OrganizationProvider organizationProvider;

    private static BiFunction checkHasRole = (httpServletRequest, roles) -> {
        Optional op = Stream.of(roles)
                .filter(role -> httpServletRequest.isUserInRole(role))
                .findAny();
        return op.isPresent() ? true : false;
    };

    private static BiFunction checkHasOneRole = (httpServletRequest, roles) -> Stream.of(roles)
            .anyMatch(role -> httpServletRequest.isUserInRole(role));

    @Override
    public List getPermittedOrganizations(OpenfactSession session) {
        return organizationProvider.getOrganizations();
    }

    @Override
    public ClientUser getClientUser(OpenfactSession session) {
        HttpServletRequest httpServletRequest = session.getContext().getContextObject(HttpServletRequest.class);

        return new ClientUser() {
            @Override
            public String getUsername() {
                return httpServletRequest.getUserPrincipal().getName();
            }

            @Override
            public boolean hasOrganizationRole(String role) {
                return checkHasRole.apply(httpServletRequest, role);
            }

            @Override
            public boolean hasOneOfOrganizationRole(String... roles) {
                return checkHasOneRole.apply(httpServletRequest, roles);
            }

            @Override
            public boolean hasAppRole(String role) {
                return checkHasRole.apply(httpServletRequest, role);
            }

            @Override
            public boolean hasOneOfAppRole(String... roles) {
                return checkHasOneRole.apply(httpServletRequest, roles);
            }

            @Override
            public OrganizationAuth organizationAuth(Resource resource) {
                return new DefaultOrganizationAuth(httpServletRequest, resource);
            }
        };
    }

    public class DefaultOrganizationAuth implements OrganizationAuth {

        private final HttpServletRequest httpServletRequest;
        private Resource resource;

        public DefaultOrganizationAuth(HttpServletRequest httpServletRequest, Resource resource) {
            this.httpServletRequest = httpServletRequest;
            this.resource = resource;
        }

        @Override
        public void init(Resource resource) {
            this.resource = resource;
        }

        @Override
        public void requireAny() {
            if (!checkHasOneRole.apply(httpServletRequest, AdminRoles.ALL_ORGANIZATION_ROLES)) {
                throw new ForbiddenException();
            }
        }

        @Override
        public boolean hasView() {
            return checkHasRole.apply(httpServletRequest, AdminRoles.getViewRole(resource));
        }

        @Override
        public boolean hasManage() {
            return checkHasRole.apply(httpServletRequest, AdminRoles.getManageRole(resource));
        }

        @Override
        public void requireView() {
            if (!hasView()) {
                throw new ForbiddenException();
            }
        }

        @Override
        public void requireManage() {
            if (!hasManage()) {
                throw new ForbiddenException();
            }
        }

    }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy