安全检查后的IBM MFP8 Respnse

时间:2017-09-04 07:24:58

标签: ibm-mobilefirst

我在我的应用中使用MFP8。我正在使用安全检查框架来验证用户。要验证用户,我正在使用一些后端层来验证用户。一旦用户通过身份验证,我的后端服务将返回巨大的JSON。现在我需要将此响应发送给客户端。

PFB我在UserLogin适配器中尝试过的代码。来自我的后端层的响应是JSON格式的非常大的响应(75-80KB)。请帮助如何从安全检查

向客户发送此响应

P.S:

public class UserLoginResource extends UserAuthenticationSecurityCheck {
    private String userId, displayName,errorMsg, cdata, hdata, rid, urlParams, serviceName, queryParameters;   
    private boolean rememberMe = false;
    private boolean authFlag=true;  
    public static JSONObject queryResponse;
    private Map<String, Object> attributes = new HashMap<String, Object>();

    @Context
    AdapterSecurityContext adapterSecurityContext;

    @Override
    protected AuthenticatedUser createUser() {       
        System.out.println("User Authenticated Result "+ userId);        
        return new AuthenticatedUser(userId, displayName, this.getName(), attributes);
    }

    @Override
    protected boolean validateCredentials(Map<String, Object> credentials) {

        try{            
            String username=credentials.get("username").toString();     
            String password = credentials.get("password").toString();    ;

            if (username != null && password != null) {

                queryResponse = <my backend layer>(username, password);

                if(queryResponse.errorExist){                       
                    System.out.println("User Authentication Failed");
                    errorMsg="User Authentication Failed";
                    return false;
                }
                else{
                    System.out.println("User Authentication Sucessful");
                    userId=queryResponse.userid;
                    displayName=queryResponse.fullname;

                    attributes.put("queryParams", queryResponse.toString());                        
                    authFlag=false;
                    errorMsg = null;
                    return true;
                }
            }           
        }
        catch(Exception e){
            e.printStackTrace();
            authFlag =true;
            return false;
        }
        return false;

    }
}

1 个答案:

答案 0 :(得分:2)

我建议您重新设计身份验证流程。

SecurityCheck适配器的设计完全符合顾名思义 - 安全检查。理想情况下,validateCredentials方法应验证您的凭据(针对后端/ LDAP /服务或其他方式),并且安全检查的响应应该是您可能需要的经过身份验证的身份和自定义属性的信息。

请注意,安全检查是有状态的,并保留其交互状态。在每个授权或内省请求中,安全框架从外部存储检索相关安全检查的状态,并在请求处理结束时将安全检查状态存储回外部存储。根据您所要求的方法,响应也会成为州的一部分,并会因序列化和反序列化而导致性能损失。这不适合负载很重的系统。

请参阅Security-check state management

理想情况下,您应该将JSON请求和响应推迟到将请求它的资源适配器,使用您的安全检查进行身份验证。

如果您真的想保留现在的模型,则应将自定义JSON响应标记为transient以防止其序列化(并成为SecurityCheck状态的一部分)并将数据发送回自定义作为您已使用的AuthenticatedUser构造函数的一部分的地图:

  

AuthenticatedUser(String id,String displayName,String   securityCheckName,Map attributes);

return new AuthenticatedUser(userId, displayName, this.getName(), attributes);