8.3.为Webservice添加Security认证

2023-07-03 17:26 更新
前面我们介绍过,要为在BDF2-SERVICE模块当中发布的Webservice添加WS-Secrutiy认证,可以覆盖bdf2.webservice.useSecurity属性值,将这个属性值设置为true即可,这样所以的发布的Webservice就全部需要WS-Security认证了。但实际应用当中,我们发布的Webservice当中可能有些需要进行认证,但还有一些我们是希望用户不用任何认证就可以直接访问的,这样就要求我们发布的Webservice可以独立控制自己是否需要进行WS-Security认证。

在BDF2-SERVICE模块当中,要想让发布的Webservice自已决定是否添加WS-Security认证,我们只需要我们的Endpoint类实现IWebservice接口即可,这个接口源码如下:
IWebService接口源码
package com.bstek.bdf2.webservice.jaxb;
/**
 * @author Jacky.gao
 * @since 2013-3-6
 */
public interface IWebservice {
 Class<?>[] bindClasses();
 boolean useSecurity();
}
可以看到,这个接口非常简单,只有两个方法需要我们实现,第一个bindClasses用于将需要进行XML与JavaBean之间进行相互转换的类返回(unmarshaller与marshaller);第二个方法useSecurity就用来标明当前Webservice是否需要WS-Security认证,返回true表示需要,false表示不需要。

修改我们的UserServiceEndpoint类,让其实现IWebservice接口,修改后的代码如下:
修改后的UserServiceEndpoint类源码
package ws;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import org.springframework.ws.server.endpoint.annotation.Endpoint;
import org.springframework.ws.server.endpoint.annotation.PayloadRoot;
import org.springframework.ws.server.endpoint.annotation.RequestPayload;
import org.springframework.ws.server.endpoint.annotation.ResponsePayload;
import org.springframework.ws.soap.addressing.server.annotation.Action;
import com.bstek.bdf2.webservice.jaxb.IWebservice;
@Endpoint
public class UserServiceEndpoint implements IWebservice{
 @PayloadRoot(localPart="UserRequest",namespace="http://www.bstek.com/ws")
 public @ResponsePayload UserResponse getUsers(@RequestPayload UserRequest request){
 int userCount=request.getUserCount();
 String targetCompanyId=request.getTargetCompany();
 UserResponse response=new UserResponse();
 List<User> users=new ArrayList<User>();
 for(int i=0;i<userCount;i++){
 User user=new User();
 user.setBirthday(new Date());
 user.setCompanyId(targetCompanyId);
 user.setGender(true);
 user.setUsername("user"+i);
 users.add(user);
 }
 response.setUsers(users);
 return response;
 }
 public Class<?>[] bindClasses() {
 return new Class[]{UserResponse.class,UserRequest.class,User.class};
 }
 public boolean useSecurity() {
 return true;
 }
}
重启我们的工程,再次通过SoapUI调用我们的Webservice,可以在右边响应窗口当中看到如下图所示信息:

提示我们需要在调用目标Webservice时添加WS-Security的header,否则目标Webservice不允许调用。对于SoapUI来说,它支持标准的WS-Security认证,我们需要做就是双击左边树形导航的DemoUserRequestSoap11节点,在弹出的窗口当中定义相应的用户名及密码,同时需要将WSS-Type属性值改为PasswordDigest,表示Soap消息的header当中采用加密方式传递用户名及密码信息,如下图所示:

再点用SoapUI请求服务,可以看到已经能正确得到响应结果了。

这里需要特别指出的是,这里定义的username及password一定要与bdf2.webservice.userServiceBean属性定义的UserDetailsService实现类访问的用户信息对应,同时其中的password也必须是用户的实际存储的密码,比如,如果用户的密码是以密文形式存放的,这里也要输入具体的密文,而不能是加密之前的密码。

以上内容是否对您有帮助:
在线笔记
App下载
App下载

扫描二维码

下载编程狮App

公众号
微信公众号

编程狮公众号