用mybatis 拦截器实现数据权限

发布一个k8s部署视频:https://edu.csdn.net/course/detail/26967

课程内容:各种k8s部署方式。包括minikube部署,kubeadm部署,kubeasz部署,rancher部署,k3s部署。包括开发测试环境部署k8s,和生产环境部署k8s。

腾讯课堂连接地址https://ke.qq.com/course/478827?taid=4373109931462251&tuin=ba64518

第二个视频发布  https://edu.csdn.net/course/detail/27109

腾讯课堂连接地址https://ke.qq.com/course/484107?tuin=ba64518

介绍主要的k8s资源的使用配置和命令。包括configmap,pod,service,replicaset,namespace,deployment,daemonset,ingress,pv,pvc,sc,role,rolebinding,clusterrole,clusterrolebinding,secret,serviceaccount,statefulset,job,cronjob,podDisruptionbudget,podSecurityPolicy,networkPolicy,resourceQuota,limitrange,endpoint,event,conponentstatus,node,apiservice,controllerRevision等。

第三个视频发布:https://edu.csdn.net/course/detail/27574

详细介绍helm命令,学习helm chart语法,编写helm chart。深入分析各项目源码,学习编写helm插件
————————————————------------------------------------------------------------------------------------------------------------------

 

@Intercepts( { @Signature(type = Executor.class, method = "query", args = {
		MappedStatement.class, Object.class, RowBounds.class,
		ResultHandler.class }) })
public class DataAuthorityInterceptor implements Interceptor{

	@Override
	public Object intercept(Invocation invocation) throws Throwable {
		MappedStatement mappedStatement = (MappedStatement) invocation.getArgs()[0];
		Object parameter = invocation.getArgs()[1];
		BoundSql boundSql = mappedStatement.getBoundSql(parameter);
		String originalSql = boundSql.getSql().trim();
		Object parameterObject = boundSql.getParameterObject();
		String check_user=null;
		
		if(parameterObject instanceof HashMap){
			try{
				check_user=(String)((HashMap)parameterObject).get("check_user");
			}catch(Exception e){}
		}
		if(check_user!=null){
			//获取角色
			String getRoleSql="select a.grpcname from TBLGROUPINFO a,tblusergroup b where a.grpid=b.grpid and b.workid=?";
			Connection connection=mappedStatement.getConfiguration().getEnvironment().getDataSource().getConnection()  ;          
		    PreparedStatement countStmt = connection.prepareStatement(getRoleSql);  
		    countStmt.setString(1, check_user);
		    ResultSet rs = countStmt.executeQuery();
		    String role=null;
		    if (rs.next()) {  
		    	 role=rs.getString(1);
		     }
		     rs.close();  
		     countStmt.close();  
		     connection.close();
		     
		     if(role!=null){
		    	 if(role.equals("新沂管理员")||role.equals("系统管理员")){
		    		 //查看全部
		    	 }else if(role.equals("风险员")){
		    		 if(originalSql.toLowerCase().indexOf("checker_userid")!=-1){
			    		 String usersSql="select a.userid from tbldepartment_user a where a.departmentcode=(select b.departmentcode from tbldepartment_user b where b.userid='"+check_user+"')";
			    		 String riskSql="select a.* from ("+originalSql+")a  where a.checker_userid in ("+usersSql+")";
			    		 
			    		 BoundSql newBoundSql = copyFromBoundSql(mappedStatement,boundSql, riskSql);
			    		 ParameterMap map=mappedStatement.getParameterMap();
			    		 //ParameterMapping mapping=new ParameterMapping.Builder(mappedStatement.getConfiguration(), check_user, String.class).build();
			    		 //map.getParameterMappings().add(mapping);
						 MappedStatement newMs = copyFromMappedStatement(mappedStatement, new BoundSqlSqlSource(newBoundSql),map);
						 invocation.getArgs()[0] = newMs;
		    		 }
		    	 }else if(role.equals("支行副行长")||role.equals("客户经理")){
		    		 if(originalSql.toLowerCase().indexOf("checker_userid")!=-1){
			    		 String selfSql="select a.* from ("+originalSql+")a  where a.checker_userid='"+check_user+"'";
			    		 BoundSql newBoundSql = copyFromBoundSql(mappedStatement,boundSql, selfSql);
			    		 ParameterMap map=mappedStatement.getParameterMap();
						 MappedStatement newMs = copyFromMappedStatement(mappedStatement, new BoundSqlSqlSource(newBoundSql),map);
						 invocation.getArgs()[0] = newMs;
		    		 }
		    	 }else{
		    		 throw new RuntimeException("角色错误");
		    	 }
		     }
		}
		Object obj = invocation.proceed();
		return obj;
	}
	public class BoundSqlSqlSource implements SqlSource {
		BoundSql boundSql;

		public BoundSqlSqlSource(BoundSql boundSql) {
			this.boundSql = boundSql;
		}

		public BoundSql getBoundSql(Object parameterObject) {
			return boundSql;
		}
	}
	/**
	 * 复制MappedStatement对象
	 */
	private MappedStatement copyFromMappedStatement(MappedStatement ms,
			SqlSource newSqlSource,ParameterMap parameterMap) {
		Builder builder = new Builder(ms.getConfiguration(), ms.getId(),
				newSqlSource, ms.getSqlCommandType());

		builder.resource(ms.getResource());
		builder.fetchSize(ms.getFetchSize());
		builder.statementType(ms.getStatementType());
		builder.keyGenerator(ms.getKeyGenerator());
		// builder.keyProperty(ms.getKeyProperty());
		builder.timeout(ms.getTimeout());
		builder.parameterMap(parameterMap);
		builder.resultMaps(ms.getResultMaps());
		builder.resultSetType(ms.getResultSetType());
		builder.cache(ms.getCache());
		builder.flushCacheRequired(ms.isFlushCacheRequired());
		builder.useCache(ms.isUseCache());

		return builder.build();
	}
	
	/**
	 * 复制BoundSql对象
	 */
	private BoundSql copyFromBoundSql(MappedStatement ms, BoundSql boundSql,
			String sql) {
		BoundSql newBoundSql = new BoundSql(ms.getConfiguration(), sql,
				boundSql.getParameterMappings(), boundSql.getParameterObject());
		for (ParameterMapping mapping : boundSql.getParameterMappings()) {
			String prop = mapping.getProperty();
			if (boundSql.hasAdditionalParameter(prop)) {
				newBoundSql.setAdditionalParameter(prop, boundSql
						.getAdditionalParameter(prop));
			}
		}
		return newBoundSql;
	}

	@Override
	public Object plugin(Object arg0) {
		return Plugin.wrap(arg0, this);
	}

	@Override
	public void setProperties(Properties arg0) {
		
	}

}

上面是拦截器代码,思路很简单,就是根据业务特性,按不同的角色拼装sql语句。

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hxpjava1

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值