WebService拦截器实现权限控制

本文介绍了一个用于SOAP消息的认证拦截器实现,该拦截器检查消息头部的认证信息,并验证用户凭据的有效性及操作权限。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

package com.sdsj.main.interceptor;

import java.lang.reflect.Method;
import java.util.List;

import org.apache.cxf.binding.soap.SoapMessage;
import org.apache.cxf.binding.soap.saaj.SAAJInInterceptor;
import org.apache.cxf.headers.Header;
import org.apache.cxf.interceptor.Fault;
import org.apache.cxf.message.Exchange;
import org.apache.cxf.message.MessageContentsList;
import org.apache.cxf.phase.AbstractPhaseInterceptor;
import org.apache.cxf.phase.Phase;
import org.apache.cxf.service.Service;
import org.apache.cxf.service.invoker.MethodDispatcher;
import org.apache.cxf.service.model.BindingOperationInfo;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;

/**
 * @version 1.0
 */
public class AuthInInterceptor extends AbstractPhaseInterceptor<SoapMessage> {

     private SAAJInInterceptor saa = new SAAJInInterceptor();  

    public AuthInInterceptor() {
        /** 指定拦截器在调用操作之前起作用 */
        super(Phase.PRE_INVOKE);
    }

    @Override
    public void handleMessage(SoapMessage soapMessage) throws Fault {
        /** 获取所有的Header头 */
        /** 
         * <header>
         *    <auth></auth>
         *    <id></id>
         * </header>
         */
        List<Header> headers = soapMessage.getHeaders();

         MessageContentsList contentsList = MessageContentsList.getContentsList(soapMessage);


            Exchange exchange = soapMessage.getExchange();
            BindingOperationInfo bop = exchange.get(BindingOperationInfo.class);  
            MethodDispatcher md = (MethodDispatcher) exchange.get(Service.class)  
                    .get(MethodDispatcher.class.getName());  
            Method method = md.getMethod(bop);
            String MName = method.getName();

           /* SimpleMethodDispatcher methodDispatcher = new SimpleMethodDispatcher();
            Method method = methodDispatcher.getMethod(bindingOperationInfo);


            WrappedMessageContext wmc = (WrappedMessageContext) messageContext;  
            Message m = wmc.getWrappedMessage();  
            Exchange exchange = m.getExchange();  
            BindingOperationInfo bop = exchange.get(BindingOperationInfo.class);  
            MethodDispatcher md = (MethodDispatcher) exchange.get(Service.class)  
                    .get(MethodDispatcher.class.getName());  
            Method method = md.getMethod(bop);  */
        /**
         * 约定好的
         * <header>
            <auth>
                 <auth_id>admin</aut_id>
                 <auth_pwd>888888</auth_pwd>
            </auth>
            </header>
         */
        if (headers == null || headers.size() != 1){
            throw new Fault(new IllegalArgumentException("您没有携带Header头,不能访问!"));
        }
        // 获取第一个Header头
        Header header = headers.get(0);
        // 获取heade头对应的xml元素
        Element element = (Element)header.getObject();
        // 获取auth_id
        NodeList idNode = element.getElementsByTagName("auth_id");
        // 获取auth_pwd
        NodeList pwdNode = element.getElementsByTagName("auth_pwd");

        if (idNode == null || idNode.getLength() == 0
                || pwdNode == null || pwdNode.getLength() == 0){
            throw new Fault(new IllegalArgumentException("您携带Header头格式不正确,不能访问!"));
        }
        // 获取内容
        String authId = idNode.item(0).getTextContent();
        String authPwd = pwdNode.item(0).getTextContent();

        if ("admin".equals(authId) ){
            if( !"000000".equals(authPwd)){
            throw new Fault(new IllegalArgumentException("用户名与密码不正确,不能访问!"));}
        }
        if("importerD".equals(authId)){
            if(!"111111".equals(authPwd)){throw new Fault(new IllegalArgumentException("密码不正确,不能访问!"));}
            if(!"innert".equals(MName)){throw new Fault(new IllegalArgumentException("权限不够,不能操作!"));}
            if(!"1".equals(contentsList.get(5)+"")){throw new Fault(new IllegalArgumentException("对其他项目操作的权限不够!"));}
        }
        if("importerS".equals(authId)){
            if(!"222222".equals(authPwd)){throw new Fault(new IllegalArgumentException("密码不正确,不能访问!"));}
            if(!"innert".equals(MName)){throw new Fault(new IllegalArgumentException("权限不够,不能操作!"));}
            if(!"2".equals(contentsList.get(5)+"")){throw new Fault(new IllegalArgumentException("对其他项目操作的权限不够!"));}
        }
        if("searcherD".equals(authId)){
            if(!"333333".equals(authPwd)){throw new Fault(new IllegalArgumentException("密码不正确,不能访问!"));}
            if(!"find".equals(MName)){throw new Fault(new IllegalArgumentException("权限不够,不能操作!"));}
            if(!"gjidcx".equals(contentsList.get(0)+"")){
            if(!"1".equals(contentsList.get(7)+"")){throw new Fault(new IllegalArgumentException("对其他项目操作的权限不够!"));}}
        }
        if("searcherS".equals(authId)){
            if(!"444444".equals(authPwd)){throw new Fault(new IllegalArgumentException("密码不正确,不能访问!"));}
            if(!"find".equals(MName)){throw new Fault(new IllegalArgumentException("权限不够,不能操作!"));}
            if(!"gjidcx".equals(contentsList.get(0)+"")){
            if(!"2".equals(contentsList.get(7)+"")){throw new Fault(new IllegalArgumentException("对其他项目操作的权限不够!"));}}
        }
        if("searcherBId".equals(authId)){
            if(!"555555".equals(authPwd)){throw new Fault(new IllegalArgumentException("密码不正确,不能访问!"));}
            if(!"find".equals(MName)){throw new Fault(new IllegalArgumentException("权限不够,不能操作!"));}
            if(!"gjidcx".equals(contentsList.get(0)+"")){throw new Fault(new IllegalArgumentException("该用户只能进行通过id查询的操作!"));}
        }


    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值