新聞中心
我們?cè)谑褂肳eb Service的過程中,很多情況是需要對(duì)web service請(qǐng)求做認(rèn)證的,對(duì)于運(yùn)行在web容器里的應(yīng)用程序來說,可能會(huì)比較簡(jiǎn)單一些,通常可以通過filter來做一些處理,但是其實(shí)CXF本身也提供了對(duì)web service認(rèn)證的方式。下面來看一下如何實(shí)現(xiàn)。

成都創(chuàng)新互聯(lián)成立與2013年,我們提供高端網(wǎng)站建設(shè)、成都小程序開發(fā)、電商視覺設(shè)計(jì)、重慶APP軟件開發(fā)及網(wǎng)絡(luò)營(yíng)銷搜索優(yōu)化服務(wù),在傳統(tǒng)互聯(lián)網(wǎng)與移動(dòng)互聯(lián)網(wǎng)發(fā)展的背景下,我們堅(jiān)守著用標(biāo)準(zhǔn)的設(shè)計(jì)方案與技術(shù)開發(fā)實(shí)力作基礎(chǔ),以企業(yè)及品牌的互聯(lián)網(wǎng)商業(yè)目標(biāo)為核心,為客戶打造具商業(yè)價(jià)值與用戶體驗(yàn)的互聯(lián)網(wǎng)+產(chǎn)品。
1. 首先是一個(gè)簡(jiǎn)單pojo
- package com.googlecode.garbagecan.cxfstudy.security;
- public class User {
- private String id;
- private String name;
- private String password;
- public String getId() {
- return id;
- }
- public void setId(String id) {
- this.id = id;
- }
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- public String getPassword() {
- return password;
- }
- public void setPassword(String password) {
- this.password = password;
- }
- }
2. Web Service接口
- package com.googlecode.garbagecan.cxfstudy.security;
- import java.util.List;
- import javax.jws.WebMethod;
- import javax.jws.WebResult;
- import javax.jws.WebService;
- @WebService
- public interface UserService {
- @WebMethod
- @WebResult List
list(); - }
3. Web Service實(shí)現(xiàn)類
- package com.googlecode.garbagecan.cxfstudy.security;
- import java.util.ArrayList;
- import java.util.List;
- public class UserServiceImpl implements UserService {
- public List
list() { - List
users = new ArrayList (); - for (int i = 0; i < 10; i++) {
- User user = new User();
- user.setId("" + i);
- user.setName("user_" + i);
- user.setPassword("password_" + i);
- users.add(user);
- }
- return users;
- }
- }
4. Server端Handler,其中使用了一個(gè)Map來存放用戶信息,真是應(yīng)用中可以使用數(shù)據(jù)庫或者其它方式獲取用戶和密碼
- package com.googlecode.garbagecan.cxfstudy.security;
- import java.io.IOException;
- import java.util.HashMap;
- import java.util.Map;
- import javax.security.auth.callback.Callback;
- import javax.security.auth.callback.CallbackHandler;
- import javax.security.auth.callback.UnsupportedCallbackException;
- import org.apache.ws.security.WSPasswordCallback;
- public class ServerUsernamePasswordHandler implements CallbackHandler {
- // key is username, value is password
- private Map
users; - public ServerUsernamePasswordHandler() {
- users = new HashMap
(); - users.put("admin", "admin");
- }
- public void handle(Callback[] callbacks) throws IOException, UnsupportedCallbackException {
- WSPasswordCallback callback = (WSPasswordCallback) callbacks[0];
- String id = callback.getIdentifier();
- if (users.containsKey(id)) {
- if (!callback.getPassword().equals(users.get(id))) {
- throw new SecurityException("Incorrect password.");
- }
- } else {
- throw new SecurityException("Invalid user.");
- }
- }
- }
5. Client端Handler,用來設(shè)置用戶密碼,在真實(shí)應(yīng)用中可以根據(jù)此類和下面的測(cè)試類來修改邏輯設(shè)置用戶名和密碼。
- package com.googlecode.garbagecan.cxfstudy.security;
- import java.io.IOException;
- import javax.security.auth.callback.Callback;
- import javax.security.auth.callback.CallbackHandler;
- import javax.security.auth.callback.UnsupportedCallbackException;
- import org.apache.ws.security.WSPasswordCallback;
- public class ClientUsernamePasswordHandler implements CallbackHandler {
- public void handle(Callback[] callbacks) throws IOException, UnsupportedCallbackException {
- WSPasswordCallback callback = (WSPasswordCallback) callbacks[0];
- int usage = callback.getUsage();
- System.out.println("identifier: " + callback.getIdentifier());
- System.out.println("usage: " + callback.getUsage());
- if (usage == WSPasswordCallback.USERNAME_TOKEN) {
- callback.setPassword("admin");
- }
- }
- }
6. 單元測(cè)試類,注意在Server端添加了WSS4JInInterceptor到Interceptor列表中,在Client添加了WSS4JOutInterceptor到Interceptor列表中。
- package com.googlecode.garbagecan.cxfstudy.security;
- import java.net.SocketTimeoutException;
- import java.util.HashMap;
- import java.util.List;
- import java.util.Map;
- import javax.xml.ws.WebServiceException;
- import junit.framework.Assert;
- import org.apache.cxf.endpoint.Client;
- import org.apache.cxf.endpoint.Endpoint;
- import org.apache.cxf.frontend.ClientProxy;
- import org.apache.cxf.interceptor.LoggingInInterceptor;
- import org.apache.cxf.interceptor.LoggingOutInterceptor;
- import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;
- import org.apache.cxf.jaxws.JaxWsServerFactoryBean;
- import org.apache.cxf.transport.http.HTTPConduit;
- import org.apache.cxf.transports.http.configuration.HTTPClientPolicy;
- import org.apache.cxf.ws.security.wss4j.WSS4JInInterceptor;
- import org.apache.cxf.ws.security.wss4j.WSS4JOutInterceptor;
- import org.apache.ws.security.WSConstants;
- import org.apache.ws.security.handler.WSHandlerConstants;
- import org.junit.BeforeClass;
- import org.junit.Test;
- public class UserServiceTest {
- private static final String address = "http://localhost:9000/ws/security/userService";
- @BeforeClass
- public static void setUpBeforeClass() throws Exception {
- JaxWsServerFactoryBean factoryBean = new JaxWsServerFactoryBean();
- factoryBean.getInInterceptors().add(new LoggingInInterceptor());
- factoryBean.getOutInterceptors().add(new LoggingOutInterceptor());
- Map
props = new HashMap (); - props.put("action", "UsernameToken");
- props.put("passwordType", "PasswordText");
- props.put("passwordCallbackClass", ServerUsernamePasswordHandler.class.getName());
- WSS4JInInterceptor wss4JInInterceptor = new WSS4JInInterceptor(props);
- factoryBean.getInInterceptors().add(wss4JInInterceptor);
- factoryBean.setServiceClass(UserServiceImpl.class);
- factoryBean.setAddress(address);
- factoryBean.create();
- }
- @Test
- public void testList() {
- JaxWsProxyFactoryBean factoryBean = new JaxWsProxyFactoryBean();
- factoryBean.setAddress(address);
- factoryBean.setServiceClass(UserService.class);
- Object obj = factoryBean.create();
- Client client = ClientProxy.getClient(obj);
- Endpoint endpoint = client.getEndpoint();
- Map
props = new HashMap (); - props.put(WSHandlerConstants.ACTION, WSHandlerConstants.USERNAME_TOKEN);
- props.put(WSHandlerConstants.USER, "admin");
- props.put(WSHandlerConstants.PASSWORD_TYPE, WSConstants.PW_TEXT);
- props.put(WSHandlerConstants.PW_CALLBACK_CLASS, ClientUsernamePasswordHandler.class.getName());
- WSS4JOutInterceptor wss4JOutInterceptor = new WSS4JOutInterceptor(props);
- endpoint.getOutInterceptors().add(wss4JOutInterceptor);
- HTTPConduit conduit = (HTTPConduit) client.getConduit();
- HTTPClientPolicy policy = new HTTPClientPolicy();
- policy.setConnectionTimeout(5 * 1000);
- policy.setReceiveTimeout(5 * 1000);
- conduit.setClient(policy);
- UserService service = (UserService) obj;
- try {
- List
users = service.list(); - Assert.assertNotNull(users);
- Assert.assertEquals(10, users.size());
- } catch(Exception e) {
- if (e instanceof WebServiceException
- && e.getCause() instanceof SocketTimeoutException) {
- System.err.println("This is timeout exception.");
- } else {
- e.printStackTrace();
- }
- }
- }
- }
***運(yùn)行上面的測(cè)試類來測(cè)試結(jié)果,也可以修改測(cè)試方法中的密碼,看看錯(cuò)誤結(jié)果,這里就不在寫錯(cuò)誤密碼的測(cè)試用例了,因?yàn)槲沂且粦腥恕?/p>
原文鏈接:http://blog.csdn.net/kongxx/article/details/7534035
【系列文章】
- Apache CXF實(shí)戰(zhàn)之六:創(chuàng)建安全的Web Service
- Apache CXF實(shí)戰(zhàn)之五:壓縮Web Service數(shù)據(jù)
- Apache CXF實(shí)戰(zhàn)之四:構(gòu)建RESTful Web Service
- Apache CXF實(shí)戰(zhàn)之三:傳輸Java對(duì)象
- Apache CXF實(shí)戰(zhàn)之二:集成Sping與Web容器
- Apache CXF實(shí)戰(zhàn)之一:Hello World Web Service
網(wǎng)站欄目:ApacheCXF實(shí)戰(zhàn)之六:創(chuàng)建安全的WebService
本文地址:http://fisionsoft.com.cn/article/cccjeoo.html


咨詢
建站咨詢
