如何保护Web服务?

时间:2011-03-03 13:09:52

标签: web-services oracle jersey webservice-client

我创建了一个产生此输出的Web服务(

[{"MANAGER_ID":0,"DEPARTMENT_ID":90,"SALARY":24000,"HIRE_DATE":"1987-06-17","FIRST_NAME":"Steven","COMMISSION_PCT":0,"EMAIL":"SKING","EMPLOYEE_ID":100,"JOB_ID":"AD_PRES","PHONE_NUMBER":"515.123.4567","LAST_NAME":"King"}]

下面是我的代码:

package resource;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import javax.naming.NamingException;
import javax.sql.DataSource;
import javax.ws.rs.Consumes;
import javax.ws.rs.GET;
import javax.ws.rs.PUT;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.UriInfo;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

@Path("hr")
public class HumanResources {
    @SuppressWarnings("unused")
    @Context
    private UriInfo context;

    /**
     * Default constructor. 
     */
    public HumanResources() {
    // TODO Auto-generated constructor stub
    }

    /**
     * Retrieves representation of an instance of HumanResources
     * @return an instance of String
     * @throws NamingException 
     * @throws SQLException 
     */
    @GET
    @Produces("application/json")
    public String getText() throws JSONException, NamingException, SQLException {
    // TODO return proper representation object
    Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe","hr","hr");
    Statement sel = conn.createStatement();
    ResultSet rs = sel.executeQuery("select * from employees where rownum <= 5");

    JSONObject employees = new JSONObject();
    JSONArray emp = new JSONArray();

    while (rs.next()) {
        JSONObject employee = new JSONObject();
        employee.put("EMPLOYEE_ID", rs.getInt("EMPLOYEE_ID"));
        employee.put("FIRST_NAME", rs.getString("FIRST_NAME"));
        employee.put("LAST_NAME", rs.getString("LAST_NAME"));
        employee.put("EMAIL", rs.getString("EMAIL"));
        employee.put("PHONE_NUMBER", rs.getString("PHONE_NUMBER"));
        employee.put("HIRE_DATE", rs.getDate("HIRE_DATE"));
        employee.put("JOB_ID", rs.getString("JOB_ID"));
        employee.put("SALARY", rs.getDouble("SALARY"));
        employee.put("COMMISSION_PCT", rs.getDouble("COMMISSION_PCT"));
        employee.put("MANAGER_ID", rs.getInt("MANAGER_ID"));
        employee.put("DEPARTMENT_ID", rs.getInt("DEPARTMENT_ID"));
        emp.put(employee);
    }

    employees.put("EMPLOYEES", emp);

    sel.close();
    return emp.toString();
    }

    /**
     * PUT method for updating or creating an instance of HumanResources
     * @param content representation for the resource
     * @return an HTTP response with content of the updated or created resource.
     */
    @PUT
    @Consumes("text/plain")
    public void putText(String content) {
    }

}

如果我想在访问数据之前添加身份验证方案,我可以通过哪些方式保护这一点?在我的其他系统中,我在数据库级别(oracle)创建了一个接受用户名和密码的函数,如果有效则返回true,否则返回false。我可以使用这个吗?还是我需要以另一种方式做到这一点?

感谢任何帮助。

感谢。

1 个答案:

答案 0 :(得分:3)

创建一个新的Web服务方法来处理用户身份验证,给定用户和密码返回一个唯一的会话令牌,必须将其传递给任何后续的Web服务调用,然后您可以检查收到的令牌的有效性。

一个例子:

  1. 调用Authentication(String userName, String userPassword)方法。
  2. 该方法执行其操作并检查用户是否已通过身份验证。
  3. 该方法返回一个唯一的会话字符串(该方法还将其保存到数据库中)。
  4. 致电SomeOtherMethod(String articleCode, Int articleQuantity, Single articlePrice, String autheticationToken)方法。
  5. 该方法检查是否可以在数据库中找到提供的authenticationToken且未过期。