Hello all,

I need to show different layers in my map depending on whether the user is 
public/anonymous or has login credentials.  I'm using geoserver.

I can log in and out using forms with j_spring_security_check.  The difficulty 
is in trying to sense whether the user is logged in or not.

I've come up with a way to do it by attempting to query one of the secure 
layers, and setting the login flag to yes if it succeeds and no if it fails.  
The problem is that javascript just blows right on past my protocol.read() 
command without setting the flag, unless I force it to wait with an alert, 
which is pretty ugly and not ideal.

Does OpenLayers have an event listener I can call for the script protocol so 
that the rest of the code won't fire until the login flag is set?  From 
googling around, it looks like there may once have been plans for this, but no 
one has been discussing it much recently...

Alternately, does anyone have a creative suggestion for nesting callback 
functions so this will work smoothly without recourse to alert()?  I've tried a 
few different ways but nothing really works.

Any suggestions greatly appreciated!

Code:

    Ext.onReady(function init() {

//Start with login = no
            login = "no";

            //function to parse and test the response - are there any features?
            var test = function(resp) {
                if (resp.features) {
                    login = "yes";  //change login to yes
                    } else {
                    login = "no";
                        //Do nothing.  It never actually gets here -
                        //if not logged in, it can't get a json response
                        //and errors out trying to parse the xml fail response
                        //But that's ok, that's why login defaults to no
                    }
                }

                var filter = new OpenLayers.Filter.Comparison({
                    type: OpenLayers.Filter.Comparison.EQUAL_TO,
                    property: 'ID',
                    value: 'TESTAREA'
                });

                protocol = new OpenLayers.Protocol.Script({
                    url:geoserver_url + '/wfs',
                    callbackKey: 'format_options',
                    callbackPrefix: 'callback:',
                    params: {
                        service: 'WFS',
                        version: '1.1.0',
                        srsName: 'EPSG:3857',
                        request: 'GetFeature',
                        typeName: 'Areas',
                        outputFormat: 'json',
                        cql_filter: filter
                    },
                    callback: test,
                });
                protocol.read();

                //have to do an alert here so login=yes has a chance to catch up
                alert ("Checking login credentials ...");

              //construct a logout button or a login form - reload the page 
after logging in or out, which will rerun the test protocol above and reset the 
login flag
                if (login == 'yes') {  //only gets here if we wait with the 
alert
                    document.getElementById('login').innerHTML='<center><font 
style="font-size:8pt; font-family:sans-serif;"><form name="logout" 
method="post" action="'+ geoserver_url+ '/j_spring_security_logout"     
target="_blank"><input type="submit" value="Logout" 
onclick="location.reload();"></form></font></center>';
                    } else { //always goes here without the alert, even if 
protocol succeeds
                        document.getElementById('login').innerHTML='<font 
style="font-size:8pt; font-family:sans-serif;"><form name="login" method="post" 
action="' + geoserver_url + '/j_spring_security_check" target="_blank"><label 
for="username">Username: </label><input id="username" type="text" 
name="username" value=""><br/><label for="password">Password: </label><input  
id="password" type="password" name="password"><input type="submit" 
value="Login" onclick="location.reload();"></form></font>';
                    }

//..... all the rest of the map code, do it slightly differently if login = yes 
or login = no

}); //end init



Kathryn Catlin
GIS Supervisor
Massachusetts Historical Commission
220 Morrissey Blvd
Boston, MA  02125
(617) 727-8470

_______________________________________________
Users mailing list
[email protected]
http://lists.osgeo.org/mailman/listinfo/openlayers-users

Reply via email to