<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	
	xmlns:georss="http://www.georss.org/georss"
	xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#"
	>

<channel>
	<title>WS &#8211; Jiří Kratochvíl</title>
	<atom:link href="https://jiri.kratochvil.eu/tag/ws/feed/" rel="self" type="application/rss+xml" />
	<link>https://jiri.kratochvil.eu</link>
	<description>Kráťovo občasník</description>
	<lastBuildDate>Tue, 01 Mar 2011 19:22:26 +0000</lastBuildDate>
	<language>cs</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.7</generator>

<image>
	<url>https://jiri.kratochvil.eu/wp-content/uploads/2018/10/kratochvil-logo-100x100.png</url>
	<title>WS &#8211; Jiří Kratochvíl</title>
	<link>https://jiri.kratochvil.eu</link>
	<width>32</width>
	<height>32</height>
</image> 
<site xmlns="com-wordpress:feed-additions:1">10187198</site>	<item>
		<title>Autentizace webových služeb JAX-WS na Weblogicu</title>
		<link>https://jiri.kratochvil.eu/autentizace-webovych-sluzeb-jax-ws-na-weblogicu/</link>
					<comments>https://jiri.kratochvil.eu/autentizace-webovych-sluzeb-jax-ws-na-weblogicu/#respond</comments>
		
		<dc:creator><![CDATA[Jiří Kratochvíl]]></dc:creator>
		<pubDate>Tue, 01 Mar 2011 19:22:26 +0000</pubDate>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Návody]]></category>
		<category><![CDATA[Programování]]></category>
		<category><![CDATA[J2EE]]></category>
		<category><![CDATA[linkedin]]></category>
		<category><![CDATA[Oracle]]></category>
		<category><![CDATA[Security]]></category>
		<category><![CDATA[Weblogic]]></category>
		<category><![CDATA[WS]]></category>
		<guid isPermaLink="false">http://jiri.kratochvil.eu/?p=369</guid>

					<description><![CDATA[V dnešním návodu se zaměřím na to, jakým způsobem zajistit autentizaci webových služeb vystavených na Weblogicu ve verzi 10.3.3, i když tento návod bude fungovat [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>V dnešním návodu se zaměřím na to, jakým způsobem zajistit autentizaci webových služeb vystavených na Weblogicu ve verzi 10.3.3, i když tento návod bude fungovat i ve verzích vyšších (a i nižších). Cílem je použít pouze standardní prostředky aplikačního serveru. A jako drobný bonus bude ukázka, jak vystavit webovou službu.<br />
<span id="more-369"></span><br />
Nejprve si tedy vystavíme libovolnou webovou službu pomocí JAX-WS. Základem je do našeho mavenního projektu přidat potřebné knihovny: </p>
<pre lang="xml">
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
   ...
    <dependencies>
   ...
        <dependency>
            <groupId>javax.xml</groupId>
            <artifactId>jaxws-api</artifactId>
            <version>2.0EA3</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>com.sun.xml</groupId>
            <artifactId>jaxws-rt</artifactId>
            <version>2.0EA3</version>
            <scope>provided</scope>
        </dependency>
   ...
    </dependencies>
 </project>
</pre>
<p>Jako <em>scope</em> těchto knihoven uvedeme, že jsou provided, což v praxi znamená, že knihovny budou použity pro kompilaci, ale nezaintegrují se do výsledného balíku. To proto, že Weblogic má tyto knihovny vlastní a naším cílem je použít právě implementaci aplikačního serveru. </p>
<h2>Implementace webových služeb</h2>
<p>Nyní si vytvořime a vystavíme vlastní webové služby. Služby budou definovány svým rozhraním a implementací. Rozhraní webové služby pak může vypadat třeba takto:</p>
<pre lang="java">
package eu.kratochvil.clanky.ws;

import javax.jws.*;

@WebService(targetNamespace = "http://schema.kratochvil.eu", name = "TestService")
public interface TestService {

    @WebMethod
    String sayHello(@WebParam(name = "name") String name);

}
</pre>
<p>A ještě implementace vlastní &#8222;business logiky&#8220;:</p>
<pre lang="java">
package eu.kratochvil.clanky.ws;

import javax.jws.WebService;

@WebService(endpointInterface = "eu.kratochvil.clanky.ws.TestService")
public class TestServiceImpl implements TestService {

    @Override
    public String sayHello(String name) {
        return "Hello " + name + "!";
    }
}
</pre>
<p>Z implementace je zřejmé, co naše služba dělá a není potřeba nějak složitě popisovat. Důležité jsou anotace <em>WebService</em> a <em>WebMethod</em>, které nám popisují vlastní rozhraní webové služby. Další anotace, jako je například <em>WebParam</em> a podobně složí k přesnému popsání a definici kontraktu webové služby a v budoucnu o tom napíšu nějaký článek. Do té doby doporučuji použít <a href="http://jax-ws.java.net/">dokumentaci</a>.</p>
<p>Posledním krokem je konfigurace našeho webového archívu. K tomu slouží znamý <em>web.xml</em>, který je klasicky umístěn v adresáři WEB-INF naší aplikace a ještě <em>sun-jaxws.xml</em>.</p>
<p>Soubor _web.xml_ bude obsahovat následující:</p>
<pre lang="xml">
    <listener>
        <listener-class>
            com.sun.xml.ws.transport.http.servlet.WSServletContextListener
        </listener-class>
    </listener>
    <servlet>
        <servlet-name>jaxws</servlet-name>
        <servlet-class>com.sun.xml.ws.transport.http.servlet.WSServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>jaxws</servlet-name>
        <url-pattern>/testService</url-pattern>
    </servlet-mapping>
</pre>
<p>Tímto donutíme weblogic, aby vystavil servlet, který bude handlovat naše webové služby. Samozřejmě je možné použít v definici patternu znaky wildcard například takto:</p>
<pre lang="xml">
    <servlet-mapping>
        <servlet-name>jaxws</servlet-name>
        <url-pattern>/ws/*</url-pattern>
    </servlet-mapping>
</pre>
<p>Pak budou servletem pro webové služby zpracován jakýkoliv požadavek, podle zadané masky (například <em>/ws/users</em> nebo <em>/ws/loans</em>). </p>
<p>Poslední konfigurační soubor, který musíme vytvořit, aby nám začaly korektně fungovat webové služby je <em>sun-jaxws.xml</em>, který je také umístěn v adresáři WEB-INF naší aplikace. Jeho podoba je následující:</p>
<pre lang="xml">
<endpoints
        xmlns='http://java.sun.com/xml/ns/jax-ws/ri/runtime'
        version='2.0'>
    <endpoint
            name='myService'
            implementation='eu.kratochvil.clanky.ws.TestServiceImpl'
            url-pattern='/testService'/>
</endpoints>
</pre>
<h2>Zabezpečení webové služby</h2>
<p>Nyní se konečně dostáváme k tomu, jak zabezpečit webové služby pomocí standardních prostředků aplikačního serveru Weblogic. Nejprve se přihlásíme do konzole aplikačního serveru, kde se proklikáme na správu uživatelů přes menu pomocí položky <em>Security Realms</em>. Následně vybereme konkrétní realm (defaultně <em>myrealm</em>). Na záložce <em>Users and Groups</em> si založíme uživatele, kterým se chceme autentizovat pro využívání našich webových služeb. </p>
<p><a href="http://jiri.kratochvil.eu/wp-content/2011/03/Screen-shot-2011-03-01-at-19.57.10.png"><img fetchpriority="high" decoding="async" src="http://jiri.kratochvil.eu/wp-content/2011/03/Screen-shot-2011-03-01-at-19.57.10-300x267.png" alt="" title="Nový uživatel" width="300" height="267" class="aligncenter size-medium wp-image-377" /></a></p>
<p>V našem případě jsme si vytvořili uživatele test, kterého zařadíme do nějaké, námi vytvořené skupiny (například <em>TestGroup</em>). </p>
<p><a href="http://jiri.kratochvil.eu/wp-content/2011/03/Screen-shot-2011-03-01-at-19.58.10.png"><img decoding="async" src="http://jiri.kratochvil.eu/wp-content/2011/03/Screen-shot-2011-03-01-at-19.58.10-300x206.png" alt="" title="Zařazení uživatele do skupiny" width="300" height="206" class="aligncenter size-medium wp-image-380" /></a></p>
<p>Tímto máme základní konfiguraci aplikačního serveru hotovou a dalším krokem bude nastavení naší aplikace. Úplně nejjednodušší cestou je přidání následujících několika řádků do souboru <em>web.xml</em>:</p>
<pre lang="xml">
    <security-constraint>
        <display-name>Security for WS</display-name>
        <web-resource-collection>
            <web-resource-name>WSPOST</web-resource-name>
            <description>
            </description>
            <url-pattern>/testService</url-pattern>
            <http-method>POST</http-method>
        </web-resource-collection>
        <auth-constraint>
            <role-name>TestGroup</role-name>
        </auth-constraint>
    </security-constraint>
    <login-config>
        <auth-method>BASIC</auth-method>
        <realm-name>myrealm</realm-name>
    </login-config>
    <security-role>
        <role-name>TestGroup</role-name>
    </security-role>
</pre>
<p>Zde definujeme, co chceme zabezpečit, jaká skupina uživatelů je oprávněna používat naše služby apod. Pokud náš projekt nyní zkompilujeme a nasadíme na aplikační server, měli bychom být dotázání na heslo ve chvíli, kdy se pokusíme zavolat naši webovou službu, což si můžete vyzkoušet například pomocí skvělého nástroje <a href="http://www.soapui.org/">SoapUI</a>.</p>
<p>V článku jsem záměrně nepoužíval nic jiného než jen <em>JAX-WS</em>, tedy žádný Spring Security ani nic podobného. Výhodou je, že se vám tímto přístupem zjednoduší deployment a hlavně získáte skvělé možnosti, jak vaší aplikaci zaintegrovat do firemní infrastruktury, bez složitého nastavování. Weblogic vám totiž nastaví admin serveru, který Vám zároveň vytvoří i nějakou roli, kterou pak následně budete ve své aplikaci využívat. No a správa uživatelů a hesel pro aplikace, které vaše služby budou využívat je také věc administrátora. Navíc lze samozřejmě aplikační server klientské aplikace nastavit tak, aby autentizaci prováděl pro aplikaci transparentně, takže odpadá složitá správa hesel na obou stranách, ale o tom zase někdy příště.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://jiri.kratochvil.eu/autentizace-webovych-sluzeb-jax-ws-na-weblogicu/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">369</post-id>	</item>
		<item>
		<title>JAX-WS a SOAP Attachments</title>
		<link>https://jiri.kratochvil.eu/jax-ws-a-soap-attachments/</link>
					<comments>https://jiri.kratochvil.eu/jax-ws-a-soap-attachments/#respond</comments>
		
		<dc:creator><![CDATA[Jiří Kratochvíl]]></dc:creator>
		<pubDate>Sat, 06 Feb 2010 06:08:16 +0000</pubDate>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Návody]]></category>
		<category><![CDATA[J2EE]]></category>
		<category><![CDATA[JAX-WS]]></category>
		<category><![CDATA[linkedin]]></category>
		<category><![CDATA[MTOM]]></category>
		<category><![CDATA[Oracle]]></category>
		<category><![CDATA[SOAP-Attachment]]></category>
		<category><![CDATA[Tipy]]></category>
		<category><![CDATA[Weblogic]]></category>
		<category><![CDATA[WS]]></category>
		<guid isPermaLink="false">http://jiri.kratochvil.eu/?p=253</guid>

					<description><![CDATA[Pokud potřebujete poslat přes webovou službu trochu víc dat, než je pár detailů o klientovi, je dobré tyto data posílat jako SOAP attachment a ne [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Pokud potřebujete poslat přes webovou službu trochu víc dat, než je pár detailů o klientovi, je dobré tyto data posílat jako SOAP attachment a ne přímo v nějakém tagu samotné zprávy. A přesně to, jsem se snažil řešit na projektu. Používáme JAX-WS a aplikace běží to na Weblogicu Server. Weblogic je znamý tím, že si &#8222;sem-tam&#8220; některé knihovny upraví k obrazu svému a pak se výsledek může chovat trochu jinak, než by člověk mohl čekat. Nevím, zda se v mém případě jednalo o nějakou lahůdku Weblogicu, ale postup k cíli nebyl vůbec přímočarý.<br />
<span id="more-253"></span><br />
Typická služba vypadá takto:</p>
<pre lang="java">
import ...

@WebService(targetNamespace = "http://schemas/wsdl")
@SOAPBinding(style = SOAPBinding.Style.DOCUMENT, use = SOAPBinding.Use.LITERAL)
public interface Documentation {

    @WebMethod
    @WebResult(name = "receiveDocument")
    @XmlMimeType("application/octet-stream")
    DataHandler getDocument(
            @WebParam(name = "documentId",
                    targetNamespace = "http://schemas/wsdl",
                    mode = WebParam.Mode.IN) Integer documentId);
}
</pre>
<p>a následná implementace:</p>
<pre lang="java">
import ...

@WebService(serviceName = "Documentation", endpointInterface = "Documentation")
@SchemaValidation
public class DocumentationImpl  implements Documentation {

    @Override
    public DataHandler getDocument(Integer documentId) {
        return getService().getDocument(documentId);
    }
}
</pre>
<p>Pokud chceme používat SOAP attachmentů, můžeme využít implementace od SUNu (vlastně teď Oraclu). Souhrnně se této technice říká <a href="http://en.wikipedia.org/wiki/Message_Transmission_Optimization_Mechanism">Message Transmission Optimization Mechanism</a> (zkráceně MTOM) a právě SUN nabízí pro tyto účely implementaci pro JAX-WS (upozorňuji, že třeba v AXISu to funguje úplně jinak).</p>
<p>Vše se tváří naprosto triviálně &#8211; stačí jako jeden výstupní parametr použít s typem <code>javax.activation.DataHandler</code>, nastavit u tohoto parametru pomocí <code>javax.xml.bind.annotation.XmlMimeType</code> správný content type a celou třídu oanotovat pomocí <code>@MTOM</code>. Vše by mělo zázračně začít fungovat. Jenže ono to nefunguje.</p>
<p>Ač o tom není v dokumentaci ani zmínka záleží na tom, kde se anotace umístí. Tato anotace se totiž neumisťuje do interface, kde bych to očekával, ale přímo do třídy, která implementuje naše rozhraní této webové služby. Abychom nám začali fungovat attachmenty, upravíme příklad, který jsem uvedl na začátku tohoto článku:</p>
<pre lang="java">
import ...

@MTOM
@StreamingAttachment(parseEagerly = true, memoryThreshold = 40000L)
@WebService(serviceName = "Documentation", endpointInterface = "Documentation")
@SchemaValidation
public class DocumentationImpl  implements Documentation {

    @Override
    public DataHandler getDocument(Integer documentId) {
        return getService().getDocument(documentId);
    }
}
</pre>
<p>Přidal jsem dvě anotace: <code>@MTOM</code> a <code>@StreamingAttachment(...)</code>. Ta první aktivuje tuto funkčnost a od nyní se všechny atributy typu <code>DataHandler</code> budou přenášet jako SOAP attachment. Anotaci <code>@StreamingAttachment(...)</code> využijeme v případě, že budeme přenášet skutečně velké soubory a posílání souboru nám bere moc paměti. A ještě jedna chytrá věc-v anotaci <code>@MTOM</code> je parametr <code>threshold</code>, který říká, od jaké velikosti se daný element pošle jako SOAP attachment a kdy se pošle přímo v elementu samotné zprávy.</p>
<p>Na závěr ještě ukázku, jak pak vypadají data ze služby:</p>
<pre lang="XML">
HTTP/1.1 200 OK
Date: Sat, 06 Feb 2010 07:46:28 GMT
Transfer-Encoding: chunked
Content-Type: multipart/related;start="<rootpart*783e56c7-ff09-40d8-91cd-d0ec0ce9555e@example.jaxws.sun.com>";type="application/xop+xml";boundary="uuid:783e56c7-ff09-40d8-91cd-d0ec0ce9555e";start-info="text/xml"
X-Powered-By: Servlet/2.5 JSP/2.1

--uuid:783e56c7-ff09-40d8-91cd-d0ec0ce9555e
Content-Id: <rootpart*783e56c7-ff09-40d8-91cd-d0ec0ce9555e@example.jaxws.sun.com>
Content-Type: application/xop+xml;charset=utf-8;type="text/xml"
Content-Transfer-Encoding: binary

<?xml version='1.0' encoding='UTF-8'?>
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
  <S:Body>
    <ns2:getDocumentResponse xmlns:ns2="http://schemas/wsdl">
      <receiveDocument>
        <Include xmlns="http://www.w3.org/2004/08/xop/include" href="cid:383e4726-8e85-4a46-a917-23811ec4ef3e@example.jaxws.sun.com"/>
      </receiveDocument>
    </ns2:getDocumentResponse>
  </S:Body>
</S:Envelope>
--uuid:783e56c7-ff09-40d8-91cd-d0ec0ce9555e
Content-Id: <383e4726-8e85-4a46-a917-23811ec4ef3e@example.jaxws.sun.com>
Content-Type: application/pdf
Content-Transfer-Encoding: binary

%PDF-1.4
.
.
.
%%EOF

--uuid:783e56c7-ff09-40d8-91cd-d0ec0ce9555e-
</pre>
]]></content:encoded>
					
					<wfw:commentRss>https://jiri.kratochvil.eu/jax-ws-a-soap-attachments/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">253</post-id>	</item>
	</channel>
</rss>
