@Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { final HttpServletRequest httpRequest = (HttpServletRequest) request; final HttpServletResponse httpResponse = (HttpServletResponse) response; // OPTIONS methods is used for CORS, no auth is required with this // method if (!"OPTIONS".equals(httpRequest.getMethod())) { final String authHeader = httpRequest.getHeader("authorization"); if (authHeader == null) { log.warn("Login failed : no auth header!"); httpResponse.setContentType("text/html"); httpResponse.sendError( HttpServletResponse.SC_FORBIDDEN, "Unauthorized access, no authorization header."); return; } final String encodedValue = authHeader.split(" ")[1]; final String[] decodedValue = Base64.base64Decode(encodedValue).split(":"); if (decodedValue.length != 2) { log.warn("Login failed : malformed auth header!"); httpResponse.setContentType("text/html"); httpResponse.sendError( HttpServletResponse.SC_FORBIDDEN, "Unauthorized access, malformed authorization header."); return; } final String login = decodedValue[0]; final String password = decodedValue[1]; if (!USR.equals(login)) { log.info("Login failed for " + login); httpResponse.setContentType("text/html"); httpResponse.sendError( HttpServletResponse.SC_FORBIDDEN, "Unauthorized access, unknown user."); return; } if (!PWD.equals(password)) { log.info("Login failed for " + login); httpResponse.setContentType("text/html"); httpResponse.sendError( HttpServletResponse.SC_FORBIDDEN, "Unauthorized access, wrong password."); return; } log.info("Login success for " + login); } chain.doFilter(request, response); }
/* This function performs the decoding of the authentication header */ public void decodeAuthorizationHeader() { // check if this request has basic authentication if (!authHeader.contains("Basic ")) { throw new WebApplicationException(Response.Status.BAD_REQUEST); } authHeader = authHeader.substring("Basic ".length()); String[] decodedHeader; decodedHeader = Base64.base64Decode(authHeader).split(":"); if (decodedHeader == null) { throw new WebApplicationException(Response.Status.BAD_REQUEST); } oAuthenticationAccount.setusername(decodedHeader[0]); oAuthenticationAccount.setpassword(decodedHeader[1]); }
protected boolean authenticate(HttpServletRequest request) { if (provider.isAuthenticated(request.getSession())) return true; String user = null, pass = null; String authorization = request.getHeader("Authorization"); if (authorization != null) { String userpass = Base64.base64Decode(authorization.substring(6)); user = userpass.substring(0, userpass.indexOf(":")); pass = userpass.substring(userpass.indexOf(":") + 1); } if (provider.authenticate(request.getSession(), user, pass)) { log.info("Web API authenticated " + request.getSession() + " for user " + user); if (user != null) { request.getSession().setAttribute(AUTHENTICATED_USER_SESSION_ATTRIBUTE, user); } return true; } return false; }
@Override public String decode(final String value) { return com.sun.jersey.core.util.Base64.base64Decode(value); }
@GET @Produces({MediaType.TEXT_XML, MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON}) // Browser XML response, XML application response and JSON application response all in the same // method automatically. public Device getDevice() { logger.debug("URL .../rest/devices/<device_name> called."); javax.naming.Context context = null; // JDBC DataSource dataSource = null; Connection connection = null; Device device = null; // Check access rights and filters // Get login credentials for HTTP basic authentication (over HTTPS): String header = headers.getRequestHeader("authorization").get(0); header = header.substring("Basic ".length()); String[] creds = new String(Base64.base64Decode(header)).split(":"); String username = creds[0]; String password = creds[1]; System.out.println( "[" + this.getClass() + "] Basic HTTP authentication ('username','password'): '" + username + "','" + password + "'."); // Debug print. DO NOT LEAVE HERE BECAUSE EXPOSES THE CREDENTIALS TO CONSOLE/LOGS. // Check authorization in the case this service is accidentally installed on a non-secure Tomcat // server: if (username == null || username.length() == 0) throw new javax.ws.rs.WebApplicationException( javax.ws.rs.core.Response.Status .UNAUTHORIZED); // Proper HTTP 401 response when invalid user. /* No need to have the method introduce RuntimeExceptions in its signature, see inheritance: java.lang.Object extended by java.lang.Throwable extended by java.lang.Exception extended by java.lang.RuntimeException extended by javax.ws.rs.WebApplicationException */ // Parse request parameters from a HttpServletRequest (not the Jersey way of doing things but // needed here because we lack context information): device_name = req.getParameter("device_name"); logger_application_name = req.getParameter("logger_application_name"); timestamp = req.getParameter("timestamp"); start_time = req.getParameter("start_time"); end_time = req.getParameter("end_time"); // Test print of request parameters in different ways: System.out.println( "[" + this.getClass() + "] Full request URL: " + uriInfo.getRequestUri().toString()); System.out.println("[" + this.getClass() + "] URL request parameters ('name','value'):"); System.out.println("'device_name','" + device_name + "'"); System.out.println("'logger_application_name','" + logger_application_name + "'"); System.out.println("'timestamp','" + timestamp + "'"); System.out.println("'start_time','" + start_time + "'"); System.out.println("'end_time','" + end_time + "'"); // Check access restrictions: NOT NEEDED HERE BECAUSE THE URL IDENTIFIES & VERIFIES THE USER. // if ( ( device_name == null || device_name.length() == 0 ) && // !ConditionalAccess.NAME_DB_ADMINISTRATOR.equals(username) ) // throw new javax.ws.rs.WebApplicationException(javax.ws.rs.core.Response.Status.FORBIDDEN); // A proper HTTP 403 response when an authenticated user has insufficient rights to the // resource. // Wikipedia (http://en.wikipedia.org/wiki/List_of_HTTP_status_codes): // "The request was a valid request, but the server is refusing to respond to it.[2] Unlike a // 401 Unauthorized response, authenticating will // make no difference.[2] On servers where authentication is required, this commonly means that // the provided credentials were successfully // authenticated but that the credentials still do not grant the client permission to access the // resource (e.g. a recognized user attempting // to access restricted content)." // Run a database request and create a REST response try { logger.debug("intializing JDBC connection."); context = new InitialContext(); dataSource = (DataSource) context.lookup("java:comp/env/jdbc/postgres"); connection = dataSource.getConnection(); logger.debug("Got connection.."); // Get named device from the database: device = Queries.findDevice( connection, deviceName); // Returns first match only or null if no device. logger.debug("Fetching device '" + deviceName + "' done."); } catch (Exception e) { e.printStackTrace(); logger.warn(e.getMessage()); } finally { if (context != null) { try { connection.close(); context.close(); } catch (Exception e) { System.out.print(e.toString()); } context = null; } } if (device == null) // throw new RuntimeException("GET: Device (user) with the name '" + deviceName + "' not // found!"); throw new javax.ws.rs.WebApplicationException( javax.ws.rs.core.Response.Status .NOT_FOUND); // Proper HTTP 404 response if resource was not found. /* No need to have the method introduce RuntimeExceptions in its signature, see inheritance: java.lang.Object extended by java.lang.Throwable extended by java.lang.Exception extended by java.lang.RuntimeException extended by javax.ws.rs.WebApplicationException */ return device; }