Search code examples
javasapui5

SAPUI5 to Java HttpServletRequest.getUserPrincipal() returns null


I'm trying to authenticate users in my java backend. I'm trying to connect to my backend with SAPUI5. I added two roles in the SCP Portal and I want to access them in Java. I'm using HttpServletRequest.getUserPrincipal() to get the user, but it keeps returning null. Any ideas on how to solve this? Did I forget something in SAPUI5?

package be.amista.filters;

import java.io.IOException;
import java.security.Principal;
import java.util.Set;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.sap.security.um.service.UserManagementAccessor;
import com.sap.security.um.user.User;
import com.sap.security.um.user.UserProvider;

@WebFilter("/*")
public class UserFilter implements Filter {
 private static final Logger logger = LoggerFactory.getLogger(UserFilter.class);
 private static Set<String> userRoles;

 public void destroy() {
 }

 public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
   HttpServletRequest httpServletRequest = (HttpServletRequest) request;

  if (httpServletRequest.getUserPrincipal() != null) {
   try {
       // UserProvider provides access to the user storage
       UserProvider users = UserManagementAccessor.getUserProvider();

       // Read the currently logged in user from the user storage
       User user = users.getUser(httpServletRequest.getUserPrincipal().getName());
       userRoles = user.getRoles();
     } catch (Exception e) {
       // Handle errors
      logger.error(e.getMessage());
     }
  }
  // pass the request along the filter chain
  chain.doFilter(request, response);
 }

 public void init(FilterConfig fConfig) throws ServletException {
 }

 public static Set<String> getUserRoles() {
  return userRoles;
 }
}

Solution

  • I found a solution myself. I added this piece of code to the web.xml and it worked.

    <resource-ref>
        <res-ref-name>user/Provider</res-ref-name>
        <res-type>com.sap.security.um.user.UserProvider</res-type>
    </resource-ref>
    <resource-ref>
        <res-ref-name>connectivityConfiguration</res-ref-name>
        <res-type>com.sap.core.connectivity.api.configuration.ConnectivityConfiguration</res-type>
    </resource-ref>
    <login-config>
        <auth-method>FORM</auth-method>
    </login-config>
    <security-constraint>
        <web-resource-collection>
            <web-resource-name>Protected Area</web-resource-name>
            <url-pattern>/*</url-pattern>
        </web-resource-collection>
        <auth-constraint>
            <role-name>Everyone</role-name>
        </auth-constraint>
    </security-constraint>
    <security-role>
        <description>All SAP Cloud Platform users</description>
        <role-name>Everyone</role-name>
    </security-role>