mirror of
https://github.com/gyurix1968/guacamole-client.git
synced 2025-09-06 13:17:41 +00:00
Ticket #362: Streamlined authentication.
This commit is contained in:
@@ -23,6 +23,7 @@ import org.glyptodon.guacamole.GuacamoleException;
|
|||||||
import org.glyptodon.guacamole.net.auth.AuthenticationProvider;
|
import org.glyptodon.guacamole.net.auth.AuthenticationProvider;
|
||||||
import org.glyptodon.guacamole.net.basic.properties.BasicGuacamoleProperties;
|
import org.glyptodon.guacamole.net.basic.properties.BasicGuacamoleProperties;
|
||||||
import org.glyptodon.guacamole.net.basic.rest.auth.AuthTokenGenerator;
|
import org.glyptodon.guacamole.net.basic.rest.auth.AuthTokenGenerator;
|
||||||
|
import org.glyptodon.guacamole.net.basic.rest.auth.AuthenticationService;
|
||||||
import org.glyptodon.guacamole.net.basic.rest.auth.BasicTokenUserContextMap;
|
import org.glyptodon.guacamole.net.basic.rest.auth.BasicTokenUserContextMap;
|
||||||
import org.glyptodon.guacamole.net.basic.rest.auth.SecureRandomAuthTokenGenerator;
|
import org.glyptodon.guacamole.net.basic.rest.auth.SecureRandomAuthTokenGenerator;
|
||||||
import org.glyptodon.guacamole.net.basic.rest.auth.TokenUserContextMap;
|
import org.glyptodon.guacamole.net.basic.rest.auth.TokenUserContextMap;
|
||||||
@@ -64,6 +65,7 @@ public class RESTModule extends AbstractModule {
|
|||||||
bind(AuthenticationProvider.class).toInstance(authProvider);
|
bind(AuthenticationProvider.class).toInstance(authProvider);
|
||||||
bind(TokenUserContextMap.class).toInstance(new BasicTokenUserContextMap());
|
bind(TokenUserContextMap.class).toInstance(new BasicTokenUserContextMap());
|
||||||
bind(ConnectionService.class);
|
bind(ConnectionService.class);
|
||||||
|
bind(AuthenticationService.class);
|
||||||
|
|
||||||
bind(AuthTokenGenerator.class).to(SecureRandomAuthTokenGenerator.class);
|
bind(AuthTokenGenerator.class).to(SecureRandomAuthTokenGenerator.class);
|
||||||
}
|
}
|
||||||
|
@@ -0,0 +1,64 @@
|
|||||||
|
package org.glyptodon.guacamole.net.basic.rest.auth;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Guacamole - Clientless Remote Desktop
|
||||||
|
* Copyright (C) 2010 Michael Jumper
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Affero General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Affero General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Affero General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
import com.google.inject.Inject;
|
||||||
|
import javax.ws.rs.WebApplicationException;
|
||||||
|
import javax.ws.rs.core.Response;
|
||||||
|
import org.glyptodon.guacamole.net.auth.UserContext;
|
||||||
|
import org.glyptodon.guacamole.net.basic.rest.APIError;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A service for performing authentication checks in REST endpoints.
|
||||||
|
*
|
||||||
|
* @author James Muehlner
|
||||||
|
*/
|
||||||
|
public class AuthenticationService {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The map of auth tokens to users for the REST endpoints.
|
||||||
|
*/
|
||||||
|
@Inject
|
||||||
|
private TokenUserContextMap tokenUserMap;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Finds the UserContext for a given auth token, if the auth token represents
|
||||||
|
* a currently logged in user. Throws an unauthorized error otherwise.
|
||||||
|
*
|
||||||
|
* @param authToken The auth token to check against the map of logged in users.
|
||||||
|
* @return The userContext that corresponds to the provided auth token.
|
||||||
|
* @throws WebApplicationException If the auth token does not correspond to
|
||||||
|
* any logged in user.
|
||||||
|
*/
|
||||||
|
public UserContext getUserContextFromAuthToken(String authToken)
|
||||||
|
throws WebApplicationException {
|
||||||
|
|
||||||
|
// Try to get the userContext from the map of logged in users.
|
||||||
|
UserContext userContext = tokenUserMap.get(authToken);
|
||||||
|
|
||||||
|
// Authentication failed.
|
||||||
|
if(userContext == null)
|
||||||
|
throw new WebApplicationException(
|
||||||
|
Response.status(Response.Status.UNAUTHORIZED)
|
||||||
|
.entity(new APIError("Permission Denied.")).build());
|
||||||
|
|
||||||
|
return userContext;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@@ -19,7 +19,6 @@ package org.glyptodon.guacamole.net.basic.rest.connection;
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
import com.google.inject.Inject;
|
import com.google.inject.Inject;
|
||||||
import com.google.inject.servlet.RequestScoped;
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import javax.ws.rs.GET;
|
import javax.ws.rs.GET;
|
||||||
@@ -35,7 +34,7 @@ import org.glyptodon.guacamole.net.auth.ConnectionGroup;
|
|||||||
import org.glyptodon.guacamole.net.auth.Directory;
|
import org.glyptodon.guacamole.net.auth.Directory;
|
||||||
import org.glyptodon.guacamole.net.auth.UserContext;
|
import org.glyptodon.guacamole.net.auth.UserContext;
|
||||||
import org.glyptodon.guacamole.net.basic.rest.APIError;
|
import org.glyptodon.guacamole.net.basic.rest.APIError;
|
||||||
import org.glyptodon.guacamole.net.basic.rest.auth.TokenUserContextMap;
|
import org.glyptodon.guacamole.net.basic.rest.auth.AuthenticationService;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A REST Service for handling connection CRUD operations.
|
* A REST Service for handling connection CRUD operations.
|
||||||
@@ -47,10 +46,10 @@ import org.glyptodon.guacamole.net.basic.rest.auth.TokenUserContextMap;
|
|||||||
public class ConnectionRESTService {
|
public class ConnectionRESTService {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The map of auth tokens to users for the REST endpoints.
|
* A service for authenticating users from auth tokens.
|
||||||
*/
|
*/
|
||||||
@Inject
|
@Inject
|
||||||
private TokenUserContextMap tokenUserMap;
|
private AuthenticationService authenticationService;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A service for managing the REST endpoint Connection objects.
|
* A service for managing the REST endpoint Connection objects.
|
||||||
@@ -60,13 +59,7 @@ public class ConnectionRESTService {
|
|||||||
|
|
||||||
@GET
|
@GET
|
||||||
public List<Connection> getConnections(@QueryParam("token") String authToken, @QueryParam("parentID") String parentID) {
|
public List<Connection> getConnections(@QueryParam("token") String authToken, @QueryParam("parentID") String parentID) {
|
||||||
UserContext userContext = tokenUserMap.get(authToken);
|
UserContext userContext = authenticationService.getUserContextFromAuthToken(authToken);
|
||||||
|
|
||||||
// authentication failed.
|
|
||||||
if(userContext == null)
|
|
||||||
throw new WebApplicationException(
|
|
||||||
Response.status(Response.Status.UNAUTHORIZED)
|
|
||||||
.entity(new APIError("Permission Denied.")).build());
|
|
||||||
|
|
||||||
try {
|
try {
|
||||||
// If the parent connection group is passed in, try to find it.
|
// If the parent connection group is passed in, try to find it.
|
||||||
@@ -107,6 +100,6 @@ public class ConnectionRESTService {
|
|||||||
Response.status(Response.Status.INTERNAL_SERVER_ERROR)
|
Response.status(Response.Status.INTERNAL_SERVER_ERROR)
|
||||||
.entity(e).build());
|
.entity(e).build());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user