EDIT:メッセージがクリアされ、コードが追加されました
基本的な Java クライアントを使用して jax-ws ベースの Web サービスを開発しています。
SOAP ハンドラーを使用してユーザーを認証します。1 つはクライアント側で userId とトークンを SOAP ヘッダーに追加し、もう 1 つはサーバー側でこれらの情報を取得してデータベースでユーザーを認証します。
クライアント側 (簡略化) :
import static modules.auth.AuthClient.userID;
import static modules.auth.AuthClient.token;
public boolean handleMessage(SOAPMessageContext context) {
//Getting SOAP headers
SOAPMessage soapMsg = context.getMessage();
SOAPEnvelope soapEnv = soapMsg.getSOAPPart().getEnvelope();
SOAPHeader soapHeader = soapEnv.getHeader();
QName qname;
SOAPHeaderElement soapHeaderElement;
//Add userID in SOAP header
qname = new QName("****","UserID");
soapHeaderElement = soapHeader.addHeaderElement(qname);
soapHeaderElement.setActor(SOAPConstants.URI_SOAP_ACTOR_NEXT);
soapHeaderElement.addTextNode(userID);
//Add token in SOAP header
qname = new QName("****","Token");
soapHeaderElement = soapHeader.addHeaderElement(qname);
soapHeaderElement.setActor(SOAPConstants.URI_SOAP_ACTOR_NEXT);
soapHeaderElement.addTextNode(token);
soapMsg.saveChanges();
return true;
}
サーバー側 (簡略化) :
public boolean handleMessage(SOAPMessageContext context) {
Boolean isRequest = (Boolean) context.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY);
if (!isRequest) {
//Getting SOAP headers
SOAPMessage soapMsg = context.getMessage();
SOAPEnvelope soapEnv = soapMsg.getSOAPPart().getEnvelope();
SOAPHeader soapHeader = soapEnv.getHeader();
Iterator it = soapHeader.extractHeaderElements(SOAPConstants.URI_SOAP_ACTOR_NEXT);
Node userIDNode = (Node) it.next();
String userID = (userIDNode == null) ? null : userIDNode.getValue();
Node tokenNode = (Node) it.next();
String token = (tokenNode == null) ? null : tokenNode.getValue();
//Return if the user is connected
User u = AuthWS.validToken(userID, token);
//Here I have my user but I don't know how to get it in my requested method
}
return true;
}
ユーザーの権利を管理するために、要求された方法でユーザーに直接アクセスしたいと考えています。
リクエストできる方法の例:
public Project getProject(@WebParam(name = "name") String name) throws WebServiceFailure, EntityNotFoundException {
//Here I would like to verify the user's rights
try {
PreparedStatement ps = DBConnect.getStatement("SELECT name FROM projects WHERE name = '" + name + "'");
ResultSet res = ps.executeQuery();
if(res.next()){
Project p = new Project(res.getString("name"));
ps.close();
return p;
} else {
ps.close();
throw new EntityNotFoundException("Can't find the project '"+name+"'");
}
} catch (SQLException ex) {
throw new WebServiceFailure(ex.getMessage());
}
}
どうもありがとう