Search code examples
odatasapui5

SAPUI5 get username/userid from OData request


I am currently focussing a problem which I thought it would be easy to solve. but I didnt. There are controls which allow us to show the username or logged in user, such as the lovely shell-headitems:

var oShell = new sap.ui.ux3.Shell("myShell", {
    headerItems: [
                new sap.ui.commons.TextView({
                text: oController.getUserName() }),
                 ],
});

It looks like this:

Header Item top right (currently a string)

In here we define headerItems, which are in my opinion foreseen to show a username / or the currently logged in user. but how can I receive it? my idea is to get it from the odata request, which was made earlier. It requires me to enter username and password -> thus I want to read this username in my controller-method, but how?

getUserName : function() {
        // return navigator.userAgent;
        var model = sap.ui.getCore().getModel();
        return model.getProperty('sUser'); // doesnt work :(
},

I also tried to get it from navigator.userAgent() but this information does not belong to the user. Anybody knows how to receive it?

And yes: I searched in google and found some threads discussing about users/login but none of these threads solved my issue. Otherwise I thought about transferring sy-uname from SAP to the frontend, but how could you send a single Text? I don't want to build a complete service for this single transaction.

If you do not provide sUser and sPassword during oData-Model-Initialization it will be empty during runtime. You cannot access it from the model, though I realized an own service for this.


Solution

  • The username is in the sap.ui.model.odata.ODataMetadata of ODataModel.

    var getUserName = function() {
        var model = sap.ui.getCore().getModel();
        var sUser = model.oMetadata.sUser;
        // Display user logic here.
    };
    
    oModel.attachMetadataLoaded(null,getUserName);
    

    Update answer for comment question from zyrex:

    var user = new sap.ui.commons.TextView();
    
    var getUserNameCallBack = function(userName) {
        user.setText(userName);
    }
    
    oController.getUserName(getUserNameCallBack);
    

    Controller method:

    getUserName: function(callback) {
        var userName = '';
    
        $.getJSON(sServiceUrl).done(function(data) {
            userName = data.d.Name;
            callback(userName);
    
        });
    }