0

jax-ws Web サービスがあり、基本認証を使用しています。私の問題で最初に重要な 2 つのコード スニペットを示します。ウェブサービス方式

@WebMethod(operationName = "createBook")
public String createBook(@WebParam(name = "name") Book entity) 
{
    Logger LOG = Logger.getLogger(Bookservice.class.getName());
    LOG.log(Level.INFO, secure_ctx.getUserPrincipal().getName()); 

Web サービス クライアント

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
    // TODO add your handling code here:
    Soapservice ss = new Soapservice();
    Bookservice bs = ss.getBookservicePort();
    //com.sun.xml.ws.transport.http.client.HttpTransportPipe.dump=true;
    //client.addFilter(new LoggingFilter());
    try 
    {
        System.setProperty("javax.xml.bind.JAXBContext", "com.sun.xml.internal.bind.v2.ContextFactory");
        BindingProvider bind_provider = (BindingProvider) bs; 
        bind_provider .getRequestContext().put(BindingProvider.USERNAME_PROPERTY, "tom");
        bind_provider .getRequestContext().put(BindingProvider.PASSWORD_PROPERTY, "jones");
        this.jTextField1.setText(bs.createBook(null));
    } catch (Exception e) 
    {
        java.util.logging.Logger LOG = java.util.logging.Logger.getLogger(testframe.class.getName());
        LOG.log(Level.SEVERE, null, e);
    }

ログイン情報が正しいかどうかに関係なく、認証が機能しません。また、サーバー ログで正しいプリンシパル名が生成されることもありますが、そのときにユーザー名を変更すると、「admin」が表示されます。元のユーザー名に戻すと、サーバー ログは "admin" のままです。ジャージを使用したレストサービスでこの仕組みを使用しましたが、問題ありませんでした。

これが私のweb.xmlにサーブレットアダプターのマッピングがないことに関係しているかどうかは誰にもわかりませんか?

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee"    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
<session-config>
    <session-timeout>
        30
    </session-timeout>
</session-config>
<security-constraint>
    <display-name>Constraint1</display-name>
    <web-resource-collection>
        <web-resource-name>soapservice</web-resource-name>
        <description/>
        <url-pattern>/*</url-pattern>
    </web-resource-collection>
    <auth-constraint>
        <description>Access to book services</description>
        <role-name>administrator</role-name>
        <role-name>developer</role-name>
        <role-name>manager</role-name>
    </auth-constraint>
    <user-data-constraint>
        <description/>
        <transport-guarantee>CONFIDENTIAL</transport-guarantee>
    </user-data-constraint>
</security-constraint>
<login-config>
    <auth-method>BASIC</auth-method>
    <realm-name>jdbcr</realm-name>
</login-config>
<security-role>
    <description>Has complete priviligies on access to soap api</description>
    <role-name>administrator</role-name>
</security-role>
<security-role>
    <description>Develops applications using soap api, has certain priviligies</description>
    <role-name>developer</role-name>
</security-role>
<security-role>
    <description>Has access to users and their role priviligies</description>
    <role-name>manager</role-name>
</security-role>
</web-app>

私のログ出力は実行時に変化しますが、意味がありません。情報: デビッド 情報: デビッド 情報: 管理者 情報: 管理者 情報: 管理者

デビッドは正しいユーザーですが、管理者がどこから来たのかわかりません??

4

1 に答える 1

0

使用している Web サービス エンジンに基づいて、web.xml にサーブレット マッピングが必要です。たとえば、Tomcat で Metro スタックを使用しており、次の web.xml があります。

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
<listener>
    <listener-class>com.sun.xml.ws.transport.http.servlet.WSServletContextListener</listener-class>
</listener>
<servlet>
    <servlet-name>CallNotificationService</servlet-name>
    <servlet-class>com.sun.xml.ws.transport.http.servlet.WSServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>CallNotificationService</servlet-name>
    <url-pattern>/CallNotificationService</url-pattern>
</servlet-mapping>
<session-config>
    <session-timeout>
        30
    </session-timeout>
</session-config>
</web-app>

誰が着信リクエストを処理しているかをコンテナーに知らせる必要があります。ただし、これは認証の問題を解決しません。サーバーの構成の問題だけでなく、認証の問題であると確信していますか?

于 2013-08-31T15:53:58.580 に答える