提交 c0024bd4 编写于 作者: sq3536's avatar sq3536

合并dev2开发分支

上级 7fe90329
...@@ -31,9 +31,11 @@ TARGET=PSSYSAPP ...@@ -31,9 +31,11 @@ TARGET=PSSYSAPP
</#if> </#if>
</dependencies> </dependencies>
<#if pub.getPSDeployCenter()?? && pub.getPSDeployCenter().getPSRegistryRepo()??>
<properties> <properties>
<docker.image.prefix>registry.cn-shanghai.aliyuncs.com/ibizsys</docker.image.prefix> <docker.image.prefix>${pub.getPSDeployCenter().getPSRegistryRepo().getConnStr()}</docker.image.prefix>
</properties> </properties>
</#if>
<profiles> <profiles>
...@@ -108,6 +110,7 @@ TARGET=PSSYSAPP ...@@ -108,6 +110,7 @@ TARGET=PSSYSAPP
</executions> </executions>
</plugin> </plugin>
<#if pub.getPSDeployCenter()?? && pub.getPSDeployCenter().getPSRegistryRepo()??>
<plugin> <plugin>
<groupId>com.spotify</groupId> <groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId> <artifactId>docker-maven-plugin</artifactId>
...@@ -125,6 +128,7 @@ TARGET=PSSYSAPP ...@@ -125,6 +128,7 @@ TARGET=PSSYSAPP
</resources> </resources>
</configuration> </configuration>
</plugin> </plugin>
</#if>
</plugins> </plugins>
</build> </build>
</profile> </profile>
......
...@@ -17,6 +17,10 @@ services: ...@@ -17,6 +17,10 @@ services:
- "${httpPort}:${httpPort}" - "${httpPort}:${httpPort}"
networks: networks:
- agent_network - agent_network
<#if sysrun?? && sysrun.getPSDevSlnMSDepApp()?? && sysrun.getPSDevSlnMSDepApp().getPSDCMSPlatformNode()?? && sysrun.getPSDevSlnMSDepApp().getPSDCMSPlatformNode().getSSHIPAddr()??>
environment:
SPRING_CLOUD_NACOS_DISCOVERY_IP: ${sysrun.getPSDevSlnMSDepApp().getPSDCMSPlatformNode().getSSHIPAddr()}
</#if>
deploy: deploy:
mode: replicated mode: replicated
replicas: 1 replicas: 1
......
...@@ -14,6 +14,9 @@ import org.springframework.context.annotation.Configuration; ...@@ -14,6 +14,9 @@ import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import; import org.springframework.context.annotation.Import;
import org.mybatis.spring.annotation.MapperScan; import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication; import org.springframework.boot.SpringApplication;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
import java.util.List;
@Slf4j @Slf4j
@Import({ @Import({
...@@ -28,9 +31,15 @@ import org.springframework.boot.SpringApplication; ...@@ -28,9 +31,15 @@ import org.springframework.boot.SpringApplication;
@SpringBootApplication(exclude = { @SpringBootApplication(exclude = {
org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration.class, org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration.class,
}) })
public class ${app.getPKGCodeName()}Application{ public class ${app.getPKGCodeName()}Application extends WebMvcConfigurerAdapter{
public static void main(String[] args) { public static void main(String[] args) {
SpringApplication.run(${app.getPKGCodeName()}Application.class,args); SpringApplication.run(${app.getPKGCodeName()}Application.class,args);
} }
@Override
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
super.addArgumentResolvers(argumentResolvers);
argumentResolvers.add(new ${pub.getPKGCodeName()}.util.web.SearchContextHandlerMethodArgumentResolver());
}
} }
...@@ -44,6 +44,15 @@ public class ${app.getPKGCodeName()}SecurityConfig extends WebSecurityConfigurer ...@@ -44,6 +44,15 @@ public class ${app.getPKGCodeName()}SecurityConfig extends WebSecurityConfigurer
@Value("${r'${ibiz.auth.path:v7/login}"'}) @Value("${r'${ibiz.auth.path:v7/login}"'})
private String loginPath; private String loginPath;
@Value("${r'${ibiz.file.uploadpath:ibizutil/upload}"'})
private String uploadpath;
@Value("${r'${ibiz.file.downloadpath:ibizutil/download}"'})
private String downloadpath;
@Value("${r'${ibiz.file.previewpath:ibizutil/preview}"'})
private String previewpath;
@Autowired @Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception { public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
auth auth
...@@ -100,6 +109,10 @@ public class ${app.getPKGCodeName()}SecurityConfig extends WebSecurityConfigurer ...@@ -100,6 +109,10 @@ public class ${app.getPKGCodeName()}SecurityConfig extends WebSecurityConfigurer
).permitAll() ).permitAll()
//放行登录请求 //放行登录请求
.antMatchers( HttpMethod.POST,"/"+loginPath).permitAll() .antMatchers( HttpMethod.POST,"/"+loginPath).permitAll()
// 文件操作
.antMatchers("/"+downloadpath+"/**").permitAll()
.antMatchers("/"+uploadpath).permitAll()
.antMatchers("/"+previewpath+"/**").permitAll()
// 所有请求都需要认证 // 所有请求都需要认证
.anyRequest().authenticated() .anyRequest().authenticated()
// 防止iframe 造成跨域 // 防止iframe 造成跨域
......
...@@ -16,12 +16,16 @@ server: ...@@ -16,12 +16,16 @@ server:
#zuul网关路由设置 #zuul网关路由设置
zuul: zuul:
routes: routes:
<#assign haswfentity=false>
<#list item.getAllPSAppDataEntities() as appDataEntity> <#list item.getAllPSAppDataEntities() as appDataEntity>
<#assign serviceId=""> <#assign serviceId="">
<#assign serviceUrl=srfpluralize(appDataEntity.codeName?lower_case)> <#assign serviceUrl=srfpluralize(appDataEntity.codeName?lower_case)>
<#assign appEntity=appDataEntity.name?lower_case> <#assign appEntity=appDataEntity.name?lower_case>
<#assign psDataEntity=appDataEntity.getPSDataEntity()> <#assign psDataEntity=appDataEntity.getPSDataEntity()>
<#assign systemName=sys.getCodeName()?lower_case> <#assign systemName=sys.getCodeName()?lower_case>
<#if psDataEntity.hasPSDEWF()??>
<#assign haswfentity=true>
</#if>
<#if psDataEntity.getStorageMode()==4> <#if psDataEntity.getStorageMode()==4>
<#comment>serviceApi模式</#comment> <#comment>serviceApi模式</#comment>
<#assign serviceId=(psDataEntity.getPSSubSysServiceAPI().getServiceCodeName())!''> <#assign serviceId=(psDataEntity.getPSSubSysServiceAPI().getServiceCodeName())!''>
...@@ -36,6 +40,12 @@ zuul: ...@@ -36,6 +40,12 @@ zuul:
serviceId: ${serviceId} serviceId: ${serviceId}
stripPrefix: false stripPrefix: false
</#list> </#list>
<#if haswfentity==true>
wfcore:
path: /wfcore/**
serviceId: ibzwf-api
stripPrefix: false
</#if>
<#comment>通过设置该参数,避免Zuul转发请求时丢失Authorization请求头信息</#comment> <#comment>通过设置该参数,避免Zuul转发请求时丢失Authorization请求头信息</#comment>
sensitive-headers: sensitive-headers:
- Cookie,Set-Cookie,Authorization - Cookie,Set-Cookie,Authorization
......
...@@ -10,6 +10,9 @@ import org.springframework.context.annotation.Configuration; ...@@ -10,6 +10,9 @@ import org.springframework.context.annotation.Configuration;
import org.springframework.transaction.annotation.EnableTransactionManagement; import org.springframework.transaction.annotation.EnableTransactionManagement;
import org.springframework.boot.SpringApplication; import org.springframework.boot.SpringApplication;
import org.springframework.cloud.openfeign.EnableFeignClients; import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
import java.util.List;
@Slf4j @Slf4j
@EnableDiscoveryClient @EnableDiscoveryClient
...@@ -17,9 +20,15 @@ import org.springframework.cloud.openfeign.EnableFeignClients; ...@@ -17,9 +20,15 @@ import org.springframework.cloud.openfeign.EnableFeignClients;
@EnableTransactionManagement @EnableTransactionManagement
@SpringBootApplication @SpringBootApplication
@EnableFeignClients(basePackages = {"${pub.getPKGCodeName()}" }) @EnableFeignClients(basePackages = {"${pub.getPKGCodeName()}" })
public class DevBootApplication{ public class DevBootApplication extends WebMvcConfigurerAdapter{
public static void main(String[] args) { public static void main(String[] args) {
SpringApplication.run(DevBootApplication.class,args); SpringApplication.run(DevBootApplication.class,args);
} }
@Override
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
super.addArgumentResolvers(argumentResolvers);
argumentResolvers.add(new ${pub.getPKGCodeName()}.util.web.SearchContextHandlerMethodArgumentResolver());
}
} }
...@@ -43,6 +43,15 @@ public class DevBootSecurityConfig extends WebSecurityConfigurerAdapter { ...@@ -43,6 +43,15 @@ public class DevBootSecurityConfig extends WebSecurityConfigurerAdapter {
@Value("${r'${ibiz.auth.path:v7/login}"'}) @Value("${r'${ibiz.auth.path:v7/login}"'})
private String loginPath; private String loginPath;
@Value("${r'${ibiz.file.uploadpath:ibizutil/upload}"'})
private String uploadpath;
@Value("${r'${ibiz.file.downloadpath:ibizutil/download}"'})
private String downloadpath;
@Value("${r'${ibiz.file.previewpath:ibizutil/preview}"'})
private String previewpath;
@Autowired @Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception { public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
auth auth
...@@ -95,6 +104,10 @@ public class DevBootSecurityConfig extends WebSecurityConfigurerAdapter { ...@@ -95,6 +104,10 @@ public class DevBootSecurityConfig extends WebSecurityConfigurerAdapter {
).permitAll() ).permitAll()
//放行登录请求 //放行登录请求
.antMatchers( HttpMethod.POST,"/"+loginPath).permitAll() .antMatchers( HttpMethod.POST,"/"+loginPath).permitAll()
// 文件操作
.antMatchers("/"+downloadpath+"/**").permitAll()
.antMatchers("/"+uploadpath).permitAll()
.antMatchers("/"+previewpath+"/**").permitAll()
.anyRequest().authenticated() .anyRequest().authenticated()
// 防止iframe 造成跨域 // 防止iframe 造成跨域
.and().headers().frameOptions().disable(); .and().headers().frameOptions().disable();
......
...@@ -11,3 +11,38 @@ TARGET=PSSYSTEM ...@@ -11,3 +11,38 @@ TARGET=PSSYSTEM
</#if> </#if>
server: server:
port: ${httpPort} port: ${httpPort}
<#if item.getAllPSAppDataEntities?? && app.getAllPSAppDataEntities()??>
#zuul网关路由设置
zuul:
routes:
<#assign haswfentity=false>
<#list item.getAllPSAppDataEntities() as appDataEntity>
<#assign serviceId="">
<#assign serviceUrl=srfpluralize(appDataEntity.codeName?lower_case)>
<#assign appEntity=appDataEntity.name?lower_case>
<#assign psDataEntity=appDataEntity.getPSDataEntity()>
<#assign systemName=sys.getCodeName()?lower_case>
<#if psDataEntity.hasPSDEWF()??>
<#assign haswfentity=true>
</#if>
<#if psDataEntity.getStorageMode()==4>
<#comment>serviceApi模式</#comment>
<#assign serviceId=(psDataEntity.getPSSubSysServiceAPI().getServiceCodeName())!''>
<#assign serviceUrl=srfpluralize(appDataEntity.name?lower_case)>
${appEntity}:
path: /${serviceUrl}/**
serviceId: ${serviceId}
stripPrefix: false
</#if>
</#list>
<#if haswfentity==true>
wfcore:
path: /wfcore/**
serviceId: ibzwf-api
stripPrefix: false
</#if>
<#comment>通过设置该参数,避免Zuul转发请求时丢失Authorization请求头信息</#comment>
sensitive-headers:
- Cookie,Set-Cookie,Authorization
</#if>
\ No newline at end of file
...@@ -50,7 +50,7 @@ import com.alibaba.fastjson.JSONObject; ...@@ -50,7 +50,7 @@ import com.alibaba.fastjson.JSONObject;
* 实体[${item.getLogicName()}] 服务对象接口实现 * 实体[${item.getLogicName()}] 服务对象接口实现
*/ */
@Slf4j @Slf4j
@Service @Service("${item.getCodeName()}ServiceImpl")
public class ${item.getCodeName()}ServiceImpl extends ServiceImpl<${de.getCodeName()}Mapper, ${de.getCodeName()}> implements I${de.getCodeName()}Service { public class ${item.getCodeName()}ServiceImpl extends ServiceImpl<${de.getCodeName()}Mapper, ${de.getCodeName()}> implements I${de.getCodeName()}Service {
<#assign keyfield=de.getKeyPSDEField()> <#assign keyfield=de.getKeyPSDEField()>
......
...@@ -2,8 +2,10 @@ ...@@ -2,8 +2,10 @@
TARGET=PSSYSTEM TARGET=PSSYSTEM
</#ibiztemplate> </#ibiztemplate>
<#if sys.getAllPSApps()??> <#if sys.getAllPSApps()??>
{
"predefineddatarange":[{"id":"ALL","name":"全部数据"},{"id":"CURORG","name":"当前单位"},{"id":"PORG","name":"上级单位"},{"id":"SORG","name":"下级单位"},{"id":"CURORGDEPT","name":"当前部门"},{"id":"PORGDEPT","name":"上级部门"},{"id":"SORGDEPT","name":"下级部门"}],
<#assign ct=0> <#assign ct=0>
[ "entities":[
<#list sys.getAllPSApps() as app> <#list sys.getAllPSApps() as app>
<#if app.getAllPSAppDataEntities?? && app.getAllPSAppDataEntities()??> <#if app.getAllPSAppDataEntities?? && app.getAllPSAppDataEntities()??>
<#list app.getAllPSAppDataEntities() as appde><#comment>由于平台暂未开放获取实体操作标识的方法,所以暂时写死</#comment> <#list app.getAllPSAppDataEntities() as appde><#comment>由于平台暂未开放获取实体操作标识的方法,所以暂时写死</#comment>
...@@ -11,18 +13,51 @@ TARGET=PSSYSTEM ...@@ -11,18 +13,51 @@ TARGET=PSSYSTEM
<#if !P.exists(de.getCodeName(),"")> <#if !P.exists(de.getCodeName(),"")>
<#if (ct>0)> <#if (ct>0)>
,</#if><#assign ct=ct+1> ,</#if><#assign ct=ct+1>
<#assign dataSetResult=getDataSet()>
<#assign deActionResult=getDEAction()>
{ {
"dename":"${de.codeName}", "dename":"${de.codeName}",
"delogicname":"${de.logicName}", "delogicname":"${de.logicName}",
"sysmoudle":{"id":"${de.getPSSystemModule().codeName?upper_case}","name":"${de.getPSSystemModule().name}"}, "sysmoudle":{"id":"${de.getPSSystemModule().codeName?upper_case}","name":"${de.getPSSystemModule().name}"},
"dedataset":[{"id":"Default","name":"默认数据集"}], "dedataset":${dataSetResult},
"dedatarange":[{"id":"ALL","name":"全部数据"},{"id":"CURORG","name":"当前单位"},{"id":"PORG","name":"上级单位"},{"id":"SORG","name":"下级单位"},{"id":"CURORGDEPT","name":"当前部门"},{"id":"PORGDEPT","name":"上级部门"},{"id":"SORGDEPT","name":"下级部门"}], "deaction":${deActionResult}
"deprivs":[{"id":"READ","name":"READ"},{"id":"CREATE","name":"CREATE"},{"id":"UPDATE","name":"UPDATE"},{"id":"DELETE","name":"DELETE"}]
} }
</#if> </#if>
</#list> </#list>
</#if> </#if>
</#list> </#list>
] ]
}
</#if>
<#comment>获取实体数据集</#comment>
<#function getDataSet>
<#assign result="[" >
<#if de.getAllPSDEDataSets()??>
<#list de.getAllPSDEDataSets() as dataSet>
<#if dataSet_index gt 0><#assign result=result+","></#if>
<#assign dataSetLogicName="">
<#if dataSet.getLogicName()?? && dataSet.getLogicName()!=''><#assign dataSetLogicName=dataSet.getLogicName()><#else><#assign dataSetLogicName=dataSet.codeName></#if>
<#assign result=result+"{\"id\":\""+dataSet.codeName+"\" , \"name\":\""+dataSetLogicName+"\"}">
</#list>
</#if>
<#assign result=result+"]" >
<#return result>
</#function>
<#comment>获取实体行为</#comment>
<#function getDEAction>
<#assign result="[" >
<#if de.getAllPSDEActions()??>
<#list de.getAllPSDEActions() as deAction>
<#if deAction_index gt 0><#assign result=result+","></#if>
<#assign deActionLogicName="">
<#if deAction.getLogicName()?? && deAction.getLogicName()!=''><#assign deActionLogicName=deAction.getLogicName()><#else><#assign deActionLogicName=deAction.codeName></#if>
<#assign result=result+"{\"id\":\""+deAction.codeName+"\" , \"name\":\""+deActionLogicName+"\" , \"type\":\""+deAction.getActionType()+"\" }">
</#list>
</#if> </#if>
<#assign result=result+"]" >
<#return result>
</#function>
...@@ -185,11 +185,13 @@ TARGET=PSDATAENTITY ...@@ -185,11 +185,13 @@ TARGET=PSDATAENTITY
</mapper> </mapper>
</#if> </#if>
<#comment>上下文参数转换</#comment> <#comment>上下文参数转换 原字符串:${srfdatacontext('field','{"defname":"PORGNAME","dename":"IBZORG"}')})</#comment>
<#comment>第一次替换:#{srf.datacontext.field','{"defname":"PORGNAME","dename":"IBZORG"}')})</#comment>
<#comment>第二次替换:#{srf.datacontext.field}</#comment>
<#function contextParamConvert contextParam> <#function contextParamConvert contextParam>
<#assign resultParam=""> <#assign resultParam="">
<#assign resultParam=contextParam?replace('$\{srfdatacontext(\'','#\{srf.datacontext.')?replace("','\\{[\\S]*","\\}","r")><#comment>数据上下文</#comment> <#assign resultParam=contextParam?replace('$\{srfdatacontext(\'','#\{srf.datacontext.')?replace("','\\{[\\S]*}'\\)}","\\}","r")><#comment>数据上下文</#comment>
<#assign resultParam=resultParam?replace('$\{srfsessioncontext(\'','#\{srf.sessioncontext.')?replace("','\\{[\\S]*","\\}","r")><#comment>用户上下文</#comment> <#assign resultParam=resultParam?replace('$\{srfsessioncontext(\'','#\{srf.sessioncontext.')?replace("','\\{[\\S]*}'\\)}","\\}","r")><#comment>用户上下文</#comment>
<#assign resultParam=resultParam?replace('$\{srfwebcontext(\'','#\{srf.webcontext.')?replace("','\\{[\\S]*","\\}","r")><#comment>网页请求上下文</#comment> <#assign resultParam=resultParam?replace('$\{srfwebcontext(\'','#\{srf.webcontext.')?replace("','\\{[\\S]*}'\\)}","\\}","r")><#comment>网页请求上下文</#comment>
<#return resultParam> <#return resultParam>
</#function> </#function>
...@@ -34,9 +34,11 @@ TARGET=PSSYSSERVICEAPI ...@@ -34,9 +34,11 @@ TARGET=PSSYSSERVICEAPI
</dependency> </dependency>
</dependencies> </dependencies>
<#if pub.getPSDeployCenter()?? && pub.getPSDeployCenter().getPSRegistryRepo()??>
<properties> <properties>
<docker.image.prefix>registry.cn-shanghai.aliyuncs.com/ibizsys</docker.image.prefix> <docker.image.prefix>${pub.getPSDeployCenter().getPSRegistryRepo().getConnStr()}</docker.image.prefix>
</properties> </properties>
</#if>
<profiles> <profiles>
<profile> <profile>
...@@ -69,6 +71,8 @@ TARGET=PSSYSSERVICEAPI ...@@ -69,6 +71,8 @@ TARGET=PSSYSSERVICEAPI
</execution> </execution>
</executions> </executions>
</plugin> </plugin>
<#if pub.getPSDeployCenter()?? && pub.getPSDeployCenter().getPSRegistryRepo()??>
<plugin> <plugin>
<groupId>com.spotify</groupId> <groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId> <artifactId>docker-maven-plugin</artifactId>
...@@ -86,6 +90,7 @@ TARGET=PSSYSSERVICEAPI ...@@ -86,6 +90,7 @@ TARGET=PSSYSSERVICEAPI
</resources> </resources>
</configuration> </configuration>
</plugin> </plugin>
</#if>
</plugins> </plugins>
</build> </build>
</profile> </profile>
......
...@@ -17,6 +17,10 @@ services: ...@@ -17,6 +17,10 @@ services:
- "${httpPort}:${httpPort}" - "${httpPort}:${httpPort}"
networks: networks:
- agent_network - agent_network
<#if sysrun?? && sysrun.getPSDevSlnMSDepAPI()?? && sysrun.getPSDevSlnMSDepAPI().getPSDCMSPlatformNode()?? && sysrun.getPSDevSlnMSDepAPI().getPSDCMSPlatformNode().getSSHIPAddr()??>
environment:
SPRING_CLOUD_NACOS_DISCOVERY_IP: ${sysrun.getPSDevSlnMSDepAPI().getPSDCMSPlatformNode().getSSHIPAddr()}
</#if>
deploy: deploy:
mode: replicated mode: replicated
replicas: 1 replicas: 1
......
...@@ -12,6 +12,9 @@ import org.springframework.context.annotation.Configuration; ...@@ -12,6 +12,9 @@ import org.springframework.context.annotation.Configuration;
import org.springframework.data.mongodb.repository.config.EnableMongoRepositories; import org.springframework.data.mongodb.repository.config.EnableMongoRepositories;
import org.springframework.transaction.annotation.EnableTransactionManagement; import org.springframework.transaction.annotation.EnableTransactionManagement;
import org.mybatis.spring.annotation.MapperScan; import org.mybatis.spring.annotation.MapperScan;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
import java.util.List;
@Slf4j @Slf4j
@EnableDiscoveryClient @EnableDiscoveryClient
...@@ -23,9 +26,15 @@ import org.mybatis.spring.annotation.MapperScan; ...@@ -23,9 +26,15 @@ import org.mybatis.spring.annotation.MapperScan;
@SpringBootApplication(exclude = { @SpringBootApplication(exclude = {
org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration.class, org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration.class,
}) })
public class ${sys.codeName}${item.codeName}Application{ public class ${sys.codeName}${item.codeName}Application extends WebMvcConfigurerAdapter{
public static void main(String[] args) { public static void main(String[] args) {
SpringApplication.run(${sys.codeName}${item.codeName}Application.class, args); SpringApplication.run(${sys.codeName}${item.codeName}Application.class, args);
} }
@Override
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
super.addArgumentResolvers(argumentResolvers);
argumentResolvers.add(new ${pub.getPKGCodeName()}.util.web.SearchContextHandlerMethodArgumentResolver());
}
} }
...@@ -17,6 +17,8 @@ TARGET=PSDESERVICEAPI ...@@ -17,6 +17,8 @@ TARGET=PSDESERVICEAPI
<#assign itemSysApiCodeName = item.getPSSysServiceAPI().getCodeName()> <#assign itemSysApiCodeName = item.getPSSysServiceAPI().getCodeName()>
<#assign itemSysApiCodeNameLC = item.getPSSysServiceAPI().getCodeName()?lower_case> <#assign itemSysApiCodeNameLC = item.getPSSysServiceAPI().getCodeName()?lower_case>
<#assign keyCNLC = "_id"> <#assign keyCNLC = "_id">
<#assign deStorageMode="None">
<#if de.getStorageMode()==1><#assign deStorageMode="Sql"><#elseif de.getStorageMode()==2><#assign deStorageMode="NoSQL"><#elseif de.getStorageMode()==4><#assign deStorageMode="ServiceApi"></#if>
package ${pubPkgCodeName}.${itemSysApiCodeNameLC}.rest; package ${pubPkgCodeName}.${itemSysApiCodeNameLC}.rest;
import java.sql.Timestamp; import java.sql.Timestamp;
...@@ -147,7 +149,7 @@ public class ${itemCodeName}Resource { ...@@ -147,7 +149,7 @@ public class ${itemCodeName}Resource {
<#if deaction.codeName?lower_case == 'create'> <#if deaction.codeName?lower_case == 'create'>
@PreAuthorize("hasPermission('','CREATE',this.getEntity())") @PreAuthorize("hasPermission('','Create',{this.getEntity(),'${deStorageMode}'})")
@ApiOperation(value = "${deaction.getLogicName()}", tags = {"${itemCodeName}" }, notes = "${deaction.getLogicName()}") @ApiOperation(value = "${deaction.getLogicName()}", tags = {"${itemCodeName}" }, notes = "${deaction.getLogicName()}")
@RequestMapping(method = RequestMethod.POST, value = "${fullPath}") @RequestMapping(method = RequestMethod.POST, value = "${fullPath}")
<#if de.getStorageMode()==4><#else> @Transactional</#if> <#if de.getStorageMode()==4><#else> @Transactional</#if>
...@@ -158,7 +160,7 @@ public class ${itemCodeName}Resource { ...@@ -158,7 +160,7 @@ public class ${itemCodeName}Resource {
return ResponseEntity.status(HttpStatus.OK).body(dto); return ResponseEntity.status(HttpStatus.OK).body(dto);
} }
@PreAuthorize("hasPermission('','CREATE',this.getEntity())") @PreAuthorize("hasPermission('','Create',{this.getEntity(),'${deStorageMode}'})")
@ApiOperation(value = "createBatch", tags = {"createBatch" }, notes = "createBatch") @ApiOperation(value = "createBatch", tags = {"createBatch" }, notes = "createBatch")
@RequestMapping(method = RequestMethod.POST, value = "${fullPath}/createbatch") @RequestMapping(method = RequestMethod.POST, value = "${fullPath}/createbatch")
public ResponseEntity<Boolean> createBatch(${etParamsList}) { public ResponseEntity<Boolean> createBatch(${etParamsList}) {
...@@ -167,7 +169,7 @@ public class ${itemCodeName}Resource { ...@@ -167,7 +169,7 @@ public class ${itemCodeName}Resource {
} }
<#elseif deaction.codeName?lower_case == 'update'> <#elseif deaction.codeName?lower_case == 'update'>
@PreAuthorize("hasPermission(#${itemCodeNameLC + keyCNLC},'UPDATE',this.getEntity())") @PreAuthorize("hasPermission(#${itemCodeNameLC + keyCNLC},'Update',{this.getEntity(),'${deStorageMode}'})")
@ApiOperation(value = "${deaction.getLogicName()}", tags = {"${itemCodeName}" }, notes = "${deaction.getLogicName()}") @ApiOperation(value = "${deaction.getLogicName()}", tags = {"${itemCodeName}" }, notes = "${deaction.getLogicName()}")
@RequestMapping(method = RequestMethod.PUT, value = "${fullPath}/{${itemCodeNameLC + keyCNLC}}") @RequestMapping(method = RequestMethod.PUT, value = "${fullPath}/{${itemCodeNameLC + keyCNLC}}")
<#if de.getStorageMode()==4><#else> @Transactional</#if> <#if de.getStorageMode()==4><#else> @Transactional</#if>
...@@ -179,7 +181,7 @@ public class ${itemCodeName}Resource { ...@@ -179,7 +181,7 @@ public class ${itemCodeName}Resource {
return ResponseEntity.status(HttpStatus.OK).body(dto); return ResponseEntity.status(HttpStatus.OK).body(dto);
} }
@PreAuthorize("hasPermission(#${itemCodeNameLC + keyCNLC},'UPDATE',this.getEntity())") @PreAuthorize("hasPermission(#${itemCodeNameLC + keyCNLC},'Update',{this.getEntity(),'${deStorageMode}'})")
@ApiOperation(value = "UpdateBatch", tags = {"UpdateBatch" }, notes = "UpdateBatch") @ApiOperation(value = "UpdateBatch", tags = {"UpdateBatch" }, notes = "UpdateBatch")
@RequestMapping(method = RequestMethod.POST, value = "${fullPath}/updatebatch") @RequestMapping(method = RequestMethod.POST, value = "${fullPath}/updatebatch")
public ResponseEntity<Boolean> updateBatch(${etParamsList}) { public ResponseEntity<Boolean> updateBatch(${etParamsList}) {
...@@ -202,7 +204,7 @@ public class ${itemCodeName}Resource { ...@@ -202,7 +204,7 @@ public class ${itemCodeName}Resource {
} }
<#elseif deaction.codeName?lower_case == 'remove'> <#elseif deaction.codeName?lower_case == 'remove'>
@PreAuthorize("hasPermission('DELETE',{#${itemCodeNameLC + keyCNLC},this.getEntity()})") @PreAuthorize("hasPermission('Remove',{#${itemCodeNameLC + keyCNLC},{this.getEntity(),'${deStorageMode}'}})")
@ApiOperation(value = "${deaction.getLogicName()}", tags = {"${itemCodeName}" }, notes = "${deaction.getLogicName()}") @ApiOperation(value = "${deaction.getLogicName()}", tags = {"${itemCodeName}" }, notes = "${deaction.getLogicName()}")
@RequestMapping(method = RequestMethod.DELETE, value = "${fullPath}/{${itemCodeNameLC + keyCNLC}}") @RequestMapping(method = RequestMethod.DELETE, value = "${fullPath}/{${itemCodeNameLC + keyCNLC}}")
<#if de.getStorageMode()==4><#else> @Transactional</#if> <#if de.getStorageMode()==4><#else> @Transactional</#if>
...@@ -218,7 +220,7 @@ public class ${itemCodeName}Resource { ...@@ -218,7 +220,7 @@ public class ${itemCodeName}Resource {
} }
<#elseif deaction.codeName?lower_case == 'get'> <#elseif deaction.codeName?lower_case == 'get'>
@PreAuthorize("hasPermission(#${itemCodeNameLC + keyCNLC},'READ',this.getEntity())") @PreAuthorize("hasPermission(#${itemCodeNameLC + keyCNLC},'Get',{this.getEntity(),'${deStorageMode}'})")
@ApiOperation(value = "${deaction.getLogicName()}", tags = {"${itemCodeName}" }, notes = "${deaction.getLogicName()}") @ApiOperation(value = "${deaction.getLogicName()}", tags = {"${itemCodeName}" }, notes = "${deaction.getLogicName()}")
@RequestMapping(method = RequestMethod.GET, value = "${fullPath}/{${itemCodeNameLC + keyCNLC}}") @RequestMapping(method = RequestMethod.GET, value = "${fullPath}/{${itemCodeNameLC + keyCNLC}}")
public ResponseEntity<${itemCodeName}DTO> get(${idParams}) { public ResponseEntity<${itemCodeName}DTO> get(${idParams}) {
...@@ -261,7 +263,7 @@ public class ${itemCodeName}Resource { ...@@ -261,7 +263,7 @@ public class ${itemCodeName}Resource {
</#if> </#if>
<#elseif apiMethod.getActionType()=='FETCH'> <#elseif apiMethod.getActionType()=='FETCH'>
<#assign deds = apiMethod.getPSDEDataSet()> <#assign deds = apiMethod.getPSDEDataSet()>
@PreAuthorize("hasPermission('READ',{#context,'${deds.getCodeName()}',this.getEntity()})") @PreAuthorize("hasPermission('Get',{#context,'${deds.getCodeName()}',this.getEntity(),'${deStorageMode}'})")
@ApiOperation(value = "fetch${deds.getLogicName()}", tags = {"${itemCodeName}" } ,notes = "fetch${deds.getLogicName()}") @ApiOperation(value = "fetch${deds.getLogicName()}", tags = {"${itemCodeName}" } ,notes = "fetch${deds.getLogicName()}")
@RequestMapping(method= RequestMethod.${reqMtd} , value="${fullPath}/fetch<#if (deds.getName()=='DEFAULT')>${deds.getCodeName()?lower_case}<#else>${deds.getCodeName()?lower_case}</#if>") @RequestMapping(method= RequestMethod.${reqMtd} , value="${fullPath}/fetch<#if (deds.getName()=='DEFAULT')>${deds.getCodeName()?lower_case}<#else>${deds.getCodeName()?lower_case}</#if>")
public ResponseEntity<List<${itemCodeName}DTO>> fetch<#if (deds.getName()=='DEFAULT')>${deds.getCodeName()}<#else>${deds.getCodeName()}</#if>(${deCodeName}SearchContext context) { public ResponseEntity<List<${itemCodeName}DTO>> fetch<#if (deds.getName()=='DEFAULT')>${deds.getCodeName()}<#else>${deds.getCodeName()}</#if>(${deCodeName}SearchContext context) {
...@@ -275,7 +277,7 @@ public class ${itemCodeName}Resource { ...@@ -275,7 +277,7 @@ public class ${itemCodeName}Resource {
.body(list); .body(list);
} }
@PreAuthorize("hasPermission('READ',{#context,'${deds.getCodeName()}',this.getEntity()})") @PreAuthorize("hasPermission('Get',{#context,'${deds.getCodeName()}',this.getEntity(),'${deStorageMode}'})")
@ApiOperation(value = "search${deds.getLogicName()}", tags = {"${itemCodeName}" } ,notes = "search${deds.getLogicName()}") @ApiOperation(value = "search${deds.getLogicName()}", tags = {"${itemCodeName}" } ,notes = "search${deds.getLogicName()}")
@RequestMapping(method= RequestMethod.${reqMtd} , value="${fullPath}/search<#if (deds.getName()=='DEFAULT')>${deds.getCodeName()?lower_case}<#else>${deds.getCodeName()?lower_case}</#if>") @RequestMapping(method= RequestMethod.${reqMtd} , value="${fullPath}/search<#if (deds.getName()=='DEFAULT')>${deds.getCodeName()?lower_case}<#else>${deds.getCodeName()?lower_case}</#if>")
public ResponseEntity<Page<${itemCodeName}DTO>> search<#if (deds.getName()=='DEFAULT')>${deds.getCodeName()}<#else>${deds.getCodeName()}</#if>(${deCodeName}SearchContext context) { public ResponseEntity<Page<${itemCodeName}DTO>> search<#if (deds.getName()=='DEFAULT')>${deds.getCodeName()}<#else>${deds.getCodeName()}</#if>(${deCodeName}SearchContext context) {
......
...@@ -17,6 +17,8 @@ public class FileItem ...@@ -17,6 +17,8 @@ public class FileItem
{ {
private String id; private String id;
private String name; private String name;
private String fileid;
private String filename;
private long size; private long size;
private String ext; private String ext;
} }
...@@ -3,6 +3,7 @@ TARGET=PSSYSTEM ...@@ -3,6 +3,7 @@ TARGET=PSSYSTEM
</#ibiztemplate> </#ibiztemplate>
package ${pub.getPKGCodeName()}.util.filter; package ${pub.getPKGCodeName()}.util.filter;
import ${pub.getPKGCodeName()}.util.security.AuthenticationUser;
import com.fasterxml.jackson.annotation.JsonAnyGetter; import com.fasterxml.jackson.annotation.JsonAnyGetter;
import com.fasterxml.jackson.annotation.JsonAnySetter; import com.fasterxml.jackson.annotation.JsonAnySetter;
import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonProperty;
...@@ -108,17 +109,12 @@ public class SearchContextBase implements ISearchContext{ ...@@ -108,17 +109,12 @@ public class SearchContextBase implements ISearchContext{
return params; return params;
} }
/**
* 用户上下文参数
*/
Map<String,Object> sessionparams = new HashMap<String,Object>() ;
/** /**
* 获取用户上下文 * 获取用户上下文
* @return * @return
*/ */
public Map<String,Object> getSessioncontext() { public Map<String,Object> getSessioncontext() {
return sessionparams; return AuthenticationUser.getAuthenticationUser().getSessionParams();
} }
@JsonAnyGetter @JsonAnyGetter
......
...@@ -44,14 +44,13 @@ public class PermissionSyncJob implements ApplicationRunner { ...@@ -44,14 +44,13 @@ public class PermissionSyncJob implements ApplicationRunner {
private String systemId; private String systemId;
@Override @Override
public void run(ApplicationArguments args) throws Exception { public void run(ApplicationArguments args) {
if(enablePermissionValid){ if(enablePermissionValid){
try { try {
InputStream permission= this.getClass().getResourceAsStream("/deprivs/DEPrivs.json"); //获取当前系统所有实体资源能力 InputStream permission= this.getClass().getResourceAsStream("/deprivs/DEPrivs.json"); //获取当前系统所有实体资源能力
String permissionResult = IOUtils.toString(permission,"UTF-8"); String permissionResult = IOUtils.toString(permission,"UTF-8");
JSONArray jsonNodePermission = JSONArray.parseArray(permissionResult); JSONObject jsonNodePermission = JSONObject.parseObject(permissionResult);
Map<String,Object> map=new HashMap<String,Object>(); Map<String,Object> map=new HashMap<>();
map.put("menu",new JSONArray());
map.put("permission",jsonNodePermission); map.put("permission",jsonNodePermission);
client.pushSystemPermissionData(map,systemId); client.pushSystemPermissionData(map,systemId);
} }
......
...@@ -17,21 +17,20 @@ import java.io.*; ...@@ -17,21 +17,20 @@ import java.io.*;
@Slf4j @Slf4j
@RestController
@RequestMapping("/")
public class FileController public class FileController
{ {
@Autowired @Autowired
private FileService fileService; private FileService fileService;
@PostMapping(value = "${r'${ibiz.uploadpath.path:ibizutil/upload}'}") @PostMapping(value = "${r'${ibiz.file.uploadpath:ibizutil/upload}'}")
public ResponseEntity<FileItem> upload(@RequestParam("file") MultipartFile multipartFile){ public ResponseEntity<FileItem> upload(@RequestParam("file") MultipartFile multipartFile){
return ResponseEntity.ok().body(fileService.saveFile(multipartFile)); return ResponseEntity.ok().body(fileService.saveFile(multipartFile));
} }
private final String defaultdownloadpath="ibizutil/download/{id}"; private final String defaultdownloadpath="ibizutil/download/{id}";
protected String getDefaultdownloadpath(){
return defaultdownloadpath;
}
@GetMapping(value = "${r'${ibiz.file.downloadpath:"+defaultdownloadpath+"}'}") @GetMapping(value = "${r'${ibiz.file.downloadpath:"+defaultdownloadpath+"}'}")
@ResponseStatus(HttpStatus.OK) @ResponseStatus(HttpStatus.OK)
......
...@@ -7,14 +7,30 @@ import com.alibaba.fastjson.JSONArray; ...@@ -7,14 +7,30 @@ import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.mongodb.BasicDBList;
import com.mongodb.BasicDBObject;
import com.mongodb.QueryBuilder;
import ${pub.getPKGCodeName()}.util.annotation.DEField;
import ${pub.getPKGCodeName()}.util.domain.EntityBase; import ${pub.getPKGCodeName()}.util.domain.EntityBase;
import ${pub.getPKGCodeName()}.util.enums.DEPredefinedFieldType;
import ${pub.getPKGCodeName()}.util.filter.QueryBuildContext;
import ${pub.getPKGCodeName()}.util.filter.QueryWrapperContext; import ${pub.getPKGCodeName()}.util.filter.QueryWrapperContext;
import ${pub.getPKGCodeName()}.util.helper.DEFieldCacheMap;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
import org.springframework.data.domain.PageImpl;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.BasicQuery;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.security.access.PermissionEvaluator; import org.springframework.security.access.PermissionEvaluator;
import org.springframework.security.core.Authentication; import org.springframework.security.core.Authentication;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import org.springframework.util.ObjectUtils;
import org.springframework.util.StringUtils; import org.springframework.util.StringUtils;
import javax.annotation.Resource;
import javax.swing.text.html.parser.Entity;
import java.io.Serializable; import java.io.Serializable;
import java.lang.reflect.Field;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
...@@ -29,273 +45,455 @@ public class AuthPermissionEvaluator implements PermissionEvaluator { ...@@ -29,273 +45,455 @@ public class AuthPermissionEvaluator implements PermissionEvaluator {
@Value("${r'${ibiz.enablePermissionValid:false}'}") @Value("${r'${ibiz.enablePermissionValid:false}'}")
boolean enablePermissionValid; //是否开启权限校验 boolean enablePermissionValid; //是否开启权限校验
/**
* 实体行为操作标识
*/
private String DEActionType="DEACTION";
/**
* 实体数据集操作标识
*/
private String DataSetTag="DATASET";
/**
*实体主键标识
*/
private String keyFieldTag="keyfield";
@Resource
private MongoTemplate mongoTemplate;
/** /**
* 表格权限检查 :用于检查当前用户是否拥有表格数据的读取、删除权限 * 表格权限检查 :用于检查当前用户是否拥有表格数据的读取、删除权限
* *
* @param authentication * @param authentication
* @param obj_action 表格行为,如:[READ,DELETE] * @param deAction 表格行为,如:[READ,DELETE]
* @param grid_param 表格参数,如:当前表格所处实体(EntityName)、表格删除的数据主键(srfkeys) * @param gridParam 表格参数,如:当前表格所处实体(EntityName)、表格删除的数据主键(srfkeys)
* @return true/false true则允许当前行为,false拒绝行为 * @return true/false true则允许当前行为,false拒绝行为
*/ */
@Override @Override
public boolean hasPermission(Authentication authentication, Object obj_action, Object grid_param) { public boolean hasPermission(Authentication authentication, Object deAction, Object gridParam) {
//未开启权限校验、超级管理员则不进行权限检查
if(AuthenticationUser.getAuthenticationUser().getSuperuser()==1 || !enablePermissionValid) if(AuthenticationUser.getAuthenticationUser().getSuperuser()==1 || !enablePermissionValid)
return true; //系统没开启权限、超级管理员 两种情况不进行权限检查 return true;
try{
String action = ""; String action = "";
String deStorageMode;
if (obj_action instanceof String) if (deAction instanceof String)
action = (String) obj_action; action = (String) deAction;
if (StringUtils.isEmpty(action)) if (StringUtils.isEmpty(action))
return false; return false;
JSONObject permissionList= AuthenticationUser.getAuthenticationUser().getPermisionList();//获取权限列表 //获取当前用户权限列表
JSONObject userPermission= AuthenticationUser.getAuthenticationUser().getPermisionList();
if(permissionList==null) if(userPermission==null)
return false; return false;
List param_list = (ArrayList) grid_param; List gridParamList = (ArrayList) gridParam;
if(action.equalsIgnoreCase("remove")){
if(obj_action.equals("DELETE")){ //表格删除权限校验 //准备参数
Object srfkey =param_list.get(0); Object srfKey =gridParamList.get(0);
EntityBase cur_entity = (EntityBase) param_list.get(1); EntityBase entity = (EntityBase) gridParamList.get(1);
String entityName = cur_entity.getClass().getSimpleName(); deStorageMode= (String) gridParamList.get(2);
ServiceImpl service= SpringContextHolder.getBean(String.format("%s%s",getBeanName(entityName),"ServiceImpl"));//获取当前实体service String entityName = entity.getClass().getSimpleName();
JSONObject formDataAbility=permissionList.getJSONObject("dataAbility-form");//由于表格删除是不跟着dataSet走,所以此处走form获取权限
Map<String,String> permissionField=getPermissionField(cur_entity);//获取系统预置属性列表 //获取实体行为权限信息
String selectCond=generatePermissionSQLForm(formDataAbility,entityName,action,srfkey,permissionField);//拼接权限条件 JSONObject permissionList=userPermission.getJSONObject("userPermissionList");
if(StringUtils.isEmpty(selectCond))
//检查是否有操作权限[create.update.delete.read]
if(!validDEActionHasPermission(permissionList,entityName,action)){
return false; return false;
QueryWrapper permissionCond=getPermissionCond(selectCond,permissionField);
return testDataAccess(service,permissionCond);//执行权限检查
} }
else{ //表格查询权限校验 //检查是否有数据权限
return deActionPermissionValidRouter(deStorageMode, entity , action , srfKey, permissionList);
}
else{
//准备参数
Object searchContext=gridParamList.get(0);
String dataSetName=String.valueOf(gridParamList.get(1));
EntityBase entity = (EntityBase) gridParamList.get(2);
deStorageMode= (String) gridParamList.get(3);
String entityName = entity.getClass().getSimpleName();
Object searchContext=param_list.get(0); //获取数据集权限信息
String dataSet=String.valueOf(param_list.get(1)); JSONObject permissionList=userPermission.getJSONObject("userPermissionList");
EntityBase cur_entity = (EntityBase) param_list.get(2);
String entityName = cur_entity.getClass().getSimpleName();
if(StringUtils.isEmpty(entityName)|| StringUtils.isEmpty(dataSet)|| StringUtils.isEmpty(action)) if(StringUtils.isEmpty(entityName)|| StringUtils.isEmpty(dataSetName))
return false; return false;
JSONObject gridDataAbility=permissionList.getJSONObject("dataAbility-grid");//获取表格的权限数据 //检查是否有访问数据集的权限
Map<String,String> permissionField=getPermissionField(cur_entity);//获取系统预置属性列表 if(!validDataSetHasPermission(permissionList,entityName,dataSetName)){
String selectCond=generatePermissionSQLGrid(gridDataAbility,entityName,action,dataSet,permissionField,null);//拼接权限条件
if(StringUtils.isEmpty(selectCond))
return false; return false;
filterDataAccess(searchContext,selectCond);//过滤出权限内的数据
} }
return true; //拼接权限条件
}catch (Exception e){ deDataSetFillPermissionSQLRouter(deStorageMode, searchContext, entity , dataSetName , permissionList);
throw new RuntimeException("系统在进行权限检查时出现异常,原因为:"+e);
} }
return true;
} }
/** /**
* 表单权限检查 :用于检查当前用户是否拥有表单的新建、编辑、删除权限 * 表单权限检查 :用于检查当前用户是否拥有表单的新建、编辑、删除权限
* *
* @param authentication * @param authentication
* @param srfkey 当前操作数据的主键 * @param srfKey 当前操作数据的主键
* @param action 当前操作行为:如:[READUPDATEDELETE] * @param action 当前操作行为:如:[READUPDATEDELETE]
* @param cur_entity 当前操作的实体对象 * @param formParam 表单参数对象
* @return true/false true则允许当前行为,false拒绝行为 * @return true/false true则允许当前行为,false拒绝行为
*/ */
@Override @Override
public boolean hasPermission(Authentication authentication, Serializable srfkey, String action, Object cur_entity) { public boolean hasPermission(Authentication authentication, Serializable srfKey, String action, Object formParam) {
//未开启权限校验、超级管理员则不进行权限检查
if(AuthenticationUser.getAuthenticationUser().getSuperuser()==1 || !enablePermissionValid) if(AuthenticationUser.getAuthenticationUser().getSuperuser()==1 || !enablePermissionValid)
return true; //系统没开启权限、超级管理员 两种情况不进行权限检查 return true;
boolean isPermission;
EntityBase entity = null;
if (cur_entity instanceof EntityBase) List formParamList = (ArrayList) formParam;
entity = (EntityBase) cur_entity; EntityBase entity = (EntityBase) formParamList.get(0);
String deStorageMode= (String) formParamList.get(1);
if (StringUtils.isEmpty(entity)) if (StringUtils.isEmpty(entity))
return false; return false;
try { JSONObject userPermission= AuthenticationUser.getAuthenticationUser().getPermisionList();
String entityName = entity.getClass().getSimpleName(); //实体名 JSONObject permissionList=userPermission.getJSONObject("userPermissionList");
if(action.equals("CREATE")){ //表单新建权限校验 String entityName = entity.getClass().getSimpleName();
JSONObject permissionList= AuthenticationUser.getAuthenticationUser().getPermisionList();//获取权限列表
JSONObject formDataAbility=permissionList.getJSONObject("dataAbility-form");//获取表单的权限数据 if(action.equalsIgnoreCase("create")){
return isFormCreatePermission(formDataAbility,entityName,action);//拼接权限条件 return validDEActionHasPermission(permissionList,entityName,action);
} }
else{ else{
//表单编辑、查询权限校验 //拥有全部数据访问权限时,则跳过权限检查
ServiceImpl service= SpringContextHolder.getBean(String.format("%s%s",getBeanName(entityName),"ServiceImpl"));//获取当前实体service if(isAllData(permissionList,entityName,action)){
JSONObject permissionList= AuthenticationUser.getAuthenticationUser().getPermisionList();//获取权限列表
JSONObject formDataAbility=permissionList.getJSONObject("dataAbility-form");//获取表单的权限数据
if(isAllData(formDataAbility,entityName,action)){//若为全部数据则直接返回,不再进行校验
return true; return true;
} }
Map<String,String> permissionField=getPermissionField(entity);//获取系统预置属性 //检查是否有操作权限[create.update.delete.read]
String selectCond=generatePermissionSQLForm(formDataAbility,entityName,action,srfkey,permissionField);//根据uaa中分配的权限拼接where条件 if(!validDEActionHasPermission(permissionList,entityName,action)){
if(StringUtils.isEmpty(selectCond))
return false; return false;
QueryWrapper permissionCond=getPermissionCond(selectCond,permissionField);
isPermission=testDataAccess(service,permissionCond);//执行权限检查
} }
}catch (Exception e){ //检查是否有数据权限
throw new RuntimeException("系统在进行权限检查时出现异常,原因为:"+e); return deActionPermissionValidRouter(deStorageMode, entity , action , srfKey, permissionList);
} }
return isPermission;
} }
/** /**
* 判断是否包含全部数据 * 是否为全部数据
* @param formDataAbility * @param permissionList
* @param entityName * @param entityName
* @param action * @param action
* @return * @return
*/ */
private boolean isAllData(JSONObject formDataAbility, String entityName, String action) { private boolean isAllData(JSONObject permissionList, String entityName, String action) {
if(formDataAbility==null) if(permissionList==null)
return false;
if(!formDataAbility.containsKey(entityName))
return false;
JSONObject entityObj=formDataAbility.getJSONObject(entityName);//获取实体
if(!entityObj.containsKey(action))
return false; return false;
JSONArray entityOperation=entityObj.getJSONArray(action);//行为:readinsert... if(!permissionList.containsKey(entityName))
if(entityOperation.size()==0)
return false; return false;
JSONObject entity=permissionList.getJSONObject(entityName);
if(entityOperation.contains("ALL")){ //全部数据 if(entity.containsKey(action) && entity.getJSONArray(action).contains("ALL"))
return true; return true;
}
return false; return false;
} }
/** /**
* 拼接表格查询条件 * 实体行为权限校验
* @param gridDataAbility * @param userPermission
* @param entityName * @param entityName
* @param action * @param action
* @param dataSet * userPermission:{"ENTITY":{"DEACTION":{"READ":["CURORG"]},"DATASET":{"Default":["CURORG"]}}}
* @param permissionField
* @param srfkey
* @return * @return
*/ */
private String generatePermissionSQLGrid(JSONObject gridDataAbility, String entityName, String action, String dataSet, Map<String,String> permissionField,Object srfkey){ private boolean validDEActionHasPermission(JSONObject userPermission,String entityName , String action ){
if(gridDataAbility==null)
return null;
if(!gridDataAbility.containsKey(entityName))
return null;
JSONObject entityObj=gridDataAbility.getJSONObject(entityName);//获取实体
if(!entityObj.containsKey(dataSet))
return null;
JSONObject dedatasetObject=entityObj.getJSONObject(dataSet);//获取实体数据集
if(!dedatasetObject.containsKey(action))
return null;
JSONArray entityOperation=dedatasetObject.getJSONArray(action);//行为:readinsert...
if(entityOperation.size()==0)
return null;
if(StringUtils.isEmpty(srfkey))
return getPermissionCond(entityOperation,permissionField); //拼接权限条件-查询
else
return String.format(" (%s) AND (%sid='%s')",getPermissionCond(entityOperation,permissionField),srfkey); //拼接权限条件-删除
}
boolean hasPermission=false;
if(userPermission==null)
return false;
if(!userPermission.containsKey(entityName))
return false;
JSONObject entity=userPermission.getJSONObject(entityName);//获取实体
if(!entity.containsKey(DEActionType))
return false;
JSONObject dataRange=entity.getJSONObject(DEActionType);//获取实体行为对应的数据范围
if(dataRange.containsKey(action)){
hasPermission=true;
}
return hasPermission;
}
/** /**
* 表格拼接权限条件,过滤出权限数据 * 数据集合权限校验
* @param targetDomainObject * @param userPermission
* @param permissionCond * @param entityName
* @throws Exception * @param dataSetName
* userPermission:{"ENTITY":{"DEACTION":{"READ":["CURORG"]},"DATASET":{"Default":["CURORG"]}}}
* @return
*/ */
private void filterDataAccess(Object targetDomainObject, String permissionCond) throws Exception{ private boolean validDataSetHasPermission(JSONObject userPermission,String entityName ,String dataSetName){
if(targetDomainObject instanceof QueryWrapperContext){
QueryWrapperContext queryWrapperContext = (QueryWrapperContext) targetDomainObject; boolean hasPermission=false;
QueryWrapper queryWrapper = queryWrapperContext.getSelectCond(); if(userPermission==null)
queryWrapper.apply(permissionCond); return false;
if(!userPermission.containsKey(entityName))
return false;
JSONObject entity=userPermission.getJSONObject(entityName);//获取实体
if(!entity.containsKey(DataSetTag))
return false;
JSONObject dataSetList=entity.getJSONObject(DataSetTag);//获取数据集
if(!dataSetList.containsKey(dataSetName))
return false;
JSONArray dataRange=dataSetList.getJSONArray(dataSetName);//获取数据范围
if(dataRange!=null && dataRange.size()>0){
hasPermission=true;
} }
return hasPermission;
} }
/** /**
* 拼接表单数据查询条件 * 根据实体存储模式,进行鉴权
* @param formDataAbility * @param deStorageMode
* @param entityName * @param entity
* @param action * @param action
* @param srfkey * @param srfKey
* @param permissionField * @param permissionList
* @return * @return
*/ */
private String generatePermissionSQLForm(JSONObject formDataAbility, String entityName, String action, Object srfkey, Map<String,String> permissionField){ private boolean deActionPermissionValidRouter(String deStorageMode, EntityBase entity , String action , Object srfKey , JSONObject permissionList){
if(formDataAbility==null)
return null;
if(!formDataAbility.containsKey(entityName))
return null;
JSONObject entityObj=formDataAbility.getJSONObject(entityName);//获取实体
if(!entityObj.containsKey(action))
return null;
JSONArray entityOperation=entityObj.getJSONArray(action);//行为:readinsert...
if(entityOperation.size()==0)
return null;
String resultCond=getPermissionCond(entityOperation,permissionField);
if(StringUtils.isEmpty(srfkey))
return String.format(" (%s)",resultCond,entityName.toLowerCase()); //拼接权限条件-新建
else
return String.format(" (%s) AND (%sid='%s')",resultCond,entityName.toLowerCase(),srfkey); //拼接权限条件-编辑
}
if(deStorageMode.equalsIgnoreCase("sql")){
return sqlPermissionValid(entity , action , srfKey, permissionList);
}
else if(deStorageMode.equalsIgnoreCase("nosql")){
return noSqlPermissionValid(entity , action , srfKey, permissionList);
}
else if(deStorageMode.equalsIgnoreCase("serviceapi")){
return true;
}
else {
throw new RuntimeException(String.format("未能识别[%s]实体对应存储模式[%s]",entity.getClass().getSimpleName(),deStorageMode));
}
}
/** /**
* 判断当前用户是否拥有建立表单数据权限 * sql存储模式实体行为鉴权
* @param formDataAbility * @param entity
* @param entityName * @param action
* @param targetType * @param srfKey
* @param permissionList
* @return * @return
*/ */
private boolean isFormCreatePermission(JSONObject formDataAbility, String entityName, String targetType){ private boolean sqlPermissionValid(EntityBase entity , String action , Object srfKey, JSONObject permissionList){
if(formDataAbility==null)
String entityName=entity.getClass().getSimpleName();
ServiceImpl service= SpringContextHolder.getBean(String.format("%s%s",entityName,"ServiceImpl"));//获取实体service对象
Map<String,String> permissionField=getPermissionField(entity);//获取组织、部门预置属性
String keyField=permissionField.get(keyFieldTag);
if(StringUtils.isEmpty(keyField)){
throw new RuntimeException("权限校验失败,请检查当前实体中是否已经配置主键属性!");
}
//获取权限表达式[全部数据、本单位、本部门等]
JSONObject entityObj=permissionList.getJSONObject(entity.getClass().getSimpleName());//获取实体
JSONObject permissionType= entityObj.getJSONObject(DEActionType);
JSONArray opprivList=permissionType.getJSONArray(action);//行为:readinsert...
if(opprivList.size()==0)
return false; return false;
if(!formDataAbility.containsKey(entityName))
//通过权限表达式来获取sql
String tempPermissionSQL=getPermissionSQL(entity,opprivList);
String permissionSQL= String.format(" (%s) AND (%s='%s')",tempPermissionSQL,keyField,srfKey); //拼接权限条件-编辑
//执行sql进行权限检查
QueryWrapper permissionWrapper=getPermissionWrapper(permissionSQL);//构造权限条件
List list=service.list(permissionWrapper);
if(list.size()>0){
return true;
}else{
return false; return false;
JSONObject entityObj=formDataAbility.getJSONObject(entityName);//获取实体 }
if(!entityObj.containsKey(targetType))
}
/**
* NoSQL实体行为鉴权
* @param entity
* @param action
* @param srfKey
* @param permissionList
* @return
*/
private boolean noSqlPermissionValid(EntityBase entity, String action, Object srfKey, JSONObject permissionList) {
Map<String,String> permissionField=getPermissionField(entity);//获取组织、部门预置属性
String keyField=permissionField.get(keyFieldTag);
if(StringUtils.isEmpty(keyField)){
throw new RuntimeException("权限校验失败,请检查当前实体中是否已经配置主键属性!");
}
//获取权限表达式[全部数据、本单位、本部门等]
JSONObject entityObj=permissionList.getJSONObject(entity.getClass().getSimpleName());//获取实体
JSONObject permissionType= entityObj.getJSONObject(DEActionType);
JSONArray dataRange=permissionType.getJSONArray(action);//行为:readinsert...
if(dataRange.size()==0)
return false; return false;
//根据权限表达式填充权限条件
QueryBuilder permissionCond=new QueryBuilder();
fillNoSqlPermissionCond(dataRange,entity,permissionCond);
//权限条件拼接主键
permissionCond.and(keyField).is(srfKey);
//执行权限检查
Query query = new BasicQuery(permissionCond.get().toString());
List list=mongoTemplate.find(query,entity.getClass());
if(list.size()>0){
return true; return true;
} }
else{
return false;
}
}
/** /**
* 表单权限检查 * 根据实体存储类型,拼接权限条件
* @param service * @param deStorageMode
* @param permissionCond * @param searchContext
* @return * @param entity
* @param dataSetName
* @param permissionList
*/
private void deDataSetFillPermissionSQLRouter(String deStorageMode , Object searchContext, EntityBase entity ,String dataSetName ,JSONObject permissionList){
//检查是否有数据权限[单行删除]
if(deStorageMode.equalsIgnoreCase("sql")){
sqlPermissionBuilder(searchContext, entity , dataSetName, permissionList);
}
else if(deStorageMode.equalsIgnoreCase("nosql")){
noSqlPermissionBuilder(searchContext, entity , dataSetName, permissionList);
}
else if(deStorageMode.equalsIgnoreCase("serviceapi")){
}
else {
throw new RuntimeException(String.format("未能识别[%s]实体对应存储模式[%s]",entity.getClass().getSimpleName(),deStorageMode));
}
}
/**
* NoSQL存储模式的表格查询填充权限条件
* @param searchContext
* @param entity
* @param dataSetName
* @param permissionList
*/ */
private boolean testDataAccess(ServiceImpl service, QueryWrapper permissionCond){ private void noSqlPermissionBuilder(Object searchContext, EntityBase entity, String dataSetName, JSONObject permissionList) {
boolean isPermission=false;
List list=service.list(permissionCond); if(searchContext instanceof QueryBuildContext){
if(list.size()>0) //获取权限表达式[全部数据、本单位、本部门等]
isPermission=true; String entityName=entity.getClass().getSimpleName();
return isPermission; JSONObject entityObj=permissionList.getJSONObject(entityName);
JSONObject permissionType=entityObj.getJSONObject(DataSetTag);
JSONArray dataRange=permissionType.getJSONArray(dataSetName);
if(dataRange.size()==0)
return ;
//根据权限表达式生成查询条件,并将查询条件设置到SearchContext
fillNoSqlPermissionCond(dataRange,entity,((QueryBuildContext) searchContext).getSelectCond());
}
}
/**
* SQL存储模式的表格查询填充权限条件
* @param searchContext
* @param entity
* @param dataSetName
* @param permissionList
*/
private void sqlPermissionBuilder(Object searchContext, EntityBase entity, String dataSetName, JSONObject permissionList){
//获取权限表达式[全部数据、本单位、本部门等]
String entityName=entity.getClass().getSimpleName();
JSONObject entityObj=permissionList.getJSONObject(entityName);//获取实体
JSONObject permissionType=entityObj.getJSONObject(DataSetTag);
JSONArray dataRange=permissionType.getJSONArray(dataSetName);//获取实体数据集
if(dataRange.size()==0)
return ;
//根据权限条件获取SQL
String permissionSQL=getPermissionSQL(entity,dataRange);
//SQL拼接到SearchContext
if(searchContext instanceof QueryWrapperContext){
QueryWrapperContext queryWrapperContext = (QueryWrapperContext) searchContext;
QueryWrapper queryWrapper = queryWrapperContext.getSelectCond();
queryWrapper.apply(permissionSQL);
}
} }
/**
* NoSQL存储模式的表格查询填充权限条件
* @param oppriList
* @param entity
* @param permissionSQL
*/
private void fillNoSqlPermissionCond(JSONArray oppriList, EntityBase entity, QueryBuilder permissionSQL){
Map<String,String> permissionField=getPermissionField(entity);//获取组织、部门预置属性
String orgField=permissionField.get("orgfield");
String orgDeptField=permissionField.get("orgsecfield");
String createManField=permissionField.get("createmanfield");
AuthenticationUser authenticationUser = AuthenticationUser.getAuthenticationUser();
JSONObject userInfo = authenticationUser.getOrgInfo();
JSONObject orgObject = userInfo.getJSONObject("org");
JSONArray orgParent = orgObject.getJSONArray("porg");
JSONArray orgChild = orgObject.getJSONArray("sorg");
JSONObject orgDeptObject = userInfo.getJSONObject("orgdept");
JSONArray orgDeptParent = orgDeptObject.getJSONArray("porgdept");
JSONArray orgDeptChild = orgDeptObject.getJSONArray("sorgdept");
for(int i=0;i<oppriList.size();i++){
String permissionCond=oppriList.getString(i);//权限配置条件
if(permissionCond.equals("CURORG")){ //本单位
permissionSQL.or(new QueryBuilder().and(orgField).is(AuthenticationUser.getAuthenticationUser().getOrgid()).get());
}
else if(permissionCond.equals("PORG")){//上级单位
permissionSQL.or(new QueryBuilder().and(orgField).in(formatStringArr(orgParent)).get());
}
else if(permissionCond.equals("SORG")){//下级单位
permissionSQL.or(new QueryBuilder().and(orgField).in(formatStringArr(orgChild)).get());
}
else if(permissionCond.equals("CREATEMAN")){//建立人
permissionSQL.or(new QueryBuilder().and(createManField).is(AuthenticationUser.getAuthenticationUser().getUserid()).get());
}
else if(permissionCond.equals("CURORGDEPT")){//本部门
permissionSQL.or(new QueryBuilder().and(orgDeptField).is(AuthenticationUser.getAuthenticationUser().getMdeptid()).get());
}
else if(permissionCond.equals("PORGDEPT")){//上级部门
permissionSQL.or(new QueryBuilder().and(orgDeptField).in(formatStringArr(orgDeptParent)).get());
}
else if(permissionCond.equals("SORGDEPT")){//下级部门
permissionSQL.or(new QueryBuilder().and(orgDeptField).in(formatStringArr(orgDeptChild)).get());
}
else if(permissionCond.equals("ALL")){
permissionSQL.or(new QueryBuilder().get());
}
}
}
/** /**
* 拼接权限条件(表单/表格)共用 * SQL获取权限条件
* @param entityOperation * @param entity
* @param permissionField * @param oppriList
* @return * @return
*/ */
private String getPermissionCond(JSONArray entityOperation, Map<String,String> permissionField){ private String getPermissionSQL(EntityBase entity, JSONArray oppriList){
Map<String,String> permissionField=getPermissionField(entity);//获取组织、部门预置属性
String nPermissionSQL = "1<>1";
String orgField=permissionField.get("orgfield"); String orgField=permissionField.get("orgfield");
String orgDeptField=permissionField.get("orgsecfield"); String orgDeptField=permissionField.get("orgsecfield");
String createManField=permissionField.get("createmanfield");
StringBuffer permissionSQL=new StringBuffer(); StringBuffer permissionSQL=new StringBuffer();
AuthenticationUser authenticationUser = AuthenticationUser.getAuthenticationUser(); AuthenticationUser authenticationUser = AuthenticationUser.getAuthenticationUser();
JSONObject userInfo = authenticationUser.getOrgInfo(); JSONObject userInfo = authenticationUser.getOrgInfo();
JSONObject orgObject = userInfo.getJSONObject("org"); JSONObject orgObject = userInfo.getJSONObject("org");
...@@ -305,61 +503,55 @@ public class AuthPermissionEvaluator implements PermissionEvaluator { ...@@ -305,61 +503,55 @@ public class AuthPermissionEvaluator implements PermissionEvaluator {
JSONArray orgDeptParent = orgDeptObject.getJSONArray("porgdept"); JSONArray orgDeptParent = orgDeptObject.getJSONArray("porgdept");
JSONArray orgDeptChild = orgDeptObject.getJSONArray("sorgdept"); JSONArray orgDeptChild = orgDeptObject.getJSONArray("sorgdept");
for(int i=0;i<entityOperation.size();i++){ for(int i=0;i<oppriList.size();i++){
if(i>0 && (!StringUtils.isEmpty(permissionSQL.toString())))
permissionSQL.append("OR"); permissionSQL.append("OR");
String permissionCond=entityOperation.getString(i);//权限配置条件 String permissionCond=oppriList.getString(i);//权限配置条件
if(permissionCond.equals("CURORG")){ //本单位 if(permissionCond.equals("CURORG")){ //本单位
permissionSQL.append(String.format("(%s='%s')",orgField,AuthenticationUser.getAuthenticationUser().getOrgid())); permissionSQL.append(String.format("(%s='%s')",orgField,AuthenticationUser.getAuthenticationUser().getOrgid()));
} }
if(permissionCond.equals("SORG")){//下级单位 else if(permissionCond.equals("PORG")){//上级单位
permissionSQL.append(String.format(" %s in(%s) ", orgField, formatStringArr(orgChild)));
}
if(permissionCond.equals("PORG")){//上级单位
permissionSQL.append(String.format(" %s in(%s) ", orgField, formatStringArr(orgParent))); permissionSQL.append(String.format(" %s in(%s) ", orgField, formatStringArr(orgParent)));
} }
if(permissionCond.equals("CREATEMAN")){//建立人 else if(permissionCond.equals("SORG")){//下级单位
permissionSQL.append(String.format("(createman='%s')",AuthenticationUser.getAuthenticationUser().getUserid())); permissionSQL.append(String.format(" %s in(%s) ", orgField, formatStringArr(orgChild)));
} }
if(permissionCond.equals("CURORGDEPT")){//本部门 else if(permissionCond.equals("CREATEMAN")){//建立人
permissionSQL.append(String.format("(orgsecid='%s')",AuthenticationUser.getAuthenticationUser().getMdeptid())); permissionSQL.append(String.format("(%s='%s')",createManField,AuthenticationUser.getAuthenticationUser().getUserid()));
} }
if(permissionCond.equals("SORGDEPT")){//下级部门 else if(permissionCond.equals("CURORGDEPT")){//部门
permissionSQL.append(String.format(" %s in (%s) ", orgDeptField, formatStringArr(orgDeptChild))); permissionSQL.append(String.format("(%s='%s')",orgDeptField,AuthenticationUser.getAuthenticationUser().getMdeptid()));
} }
if(permissionCond.equals("PORGDEPT")){//上级部门 else if(permissionCond.equals("PORGDEPT")){//上级部门
permissionSQL.append(String.format(" %s in (%s) ", orgDeptField, formatStringArr(orgDeptParent))); permissionSQL.append(String.format(" %s in (%s) ", orgDeptField, formatStringArr(orgDeptParent)));
} }
if(permissionCond.equals("ALL")){//全部数据 else if(permissionCond.equals("SORGDEPT")){//下级部门
permissionSQL.append(String.format(" %s in (%s) ", orgDeptField, formatStringArr(orgDeptChild)));
}
else if(permissionCond.equals("ALL")){//全部数据
permissionSQL.append("(1=1)"); permissionSQL.append("(1=1)");
} }
else{
permissionSQL.append(nPermissionSQL);
}
} }
if(StringUtils.isEmpty(permissionSQL.toString())) if(StringUtils.isEmpty(permissionSQL.toString()))
return ""; return "";
String resultCond=parseResult(permissionSQL, "OR");
String resultCond=permissionSQL.toString();
if(resultCond.endsWith("OR")){
resultCond=resultCond.substring(0,resultCond.lastIndexOf("OR"));
}
return resultCond; return resultCond;
} }
/** /**
* 拼接权限查询条件(表单/表格)共用 * 构造 wrapper
* @param whereCond * @param whereCond
* @param permissionField
* @return * @return
*/ */
private QueryWrapper getPermissionCond(String whereCond, Map<String,String> permissionField){ private QueryWrapper getPermissionWrapper(String whereCond){
QueryWrapper allPermissionCond=new QueryWrapper();
if(StringUtils.isEmpty(whereCond))
return allPermissionCond;
allPermissionCond.apply(whereCond); QueryWrapper permissionWrapper=new QueryWrapper();
if(!StringUtils.isEmpty(whereCond)){
return allPermissionCond; permissionWrapper.apply(whereCond);
}
return permissionWrapper;
} }
/** /**
...@@ -368,47 +560,76 @@ public class AuthPermissionEvaluator implements PermissionEvaluator { ...@@ -368,47 +560,76 @@ public class AuthPermissionEvaluator implements PermissionEvaluator {
* @return * @return
*/ */
private Map<String,String> getPermissionField(EntityBase entityBase){ private Map<String,String> getPermissionField(EntityBase entityBase){
Map<String,String> permissionFiled=new HashMap<>(); Map<String,String> permissionFiled=new HashMap<>();
String orgField="orgid"; //组织权限默认值 String orgField="orgid"; //组织属性
String orgsecField="orgsecid"; //部门权限默认值 String orgDeptField="orgsecid"; //部门属性
// Map<Field, PreField> preFields= entityBase.SearchPreField(); //从缓存中获取当前类预置属性 String createManField="createman"; //创建人属性
// //寻找实体权限属性 String keyField="";//主键属性
// for (Map.Entry<Field,PreField> entry : preFields.entrySet()){
// Field prefield=entry.getKey();//获取注解字段 DEFieldCacheMap.getFieldMap(entityBase.getClass().getName());
// PreField fieldAnnotation=entry.getValue();//获取注解值 Map <Field, DEField> preFields= SearchDEField(entityBase.getClass().getName()); //从缓存中获取当前类预置属性
// PredefinedType prefieldType=fieldAnnotation.preType();
// if(prefieldType==PredefinedType.ORGID)//用户配置系统预置属性-组织机构标识 for (Map.Entry<Field,DEField> entry : preFields.entrySet()){
// orgField=prefield.getName(); Field preField=entry.getKey();//获取注解字段
// if(prefieldType==PredefinedType.ORGSECTORID)//用户配置系统预置属性-部门标识 DEField fieldAnnotation=entry.getValue();//获取注解值
// orgsecField=prefield.getName(); DEPredefinedFieldType prefieldType=fieldAnnotation.preType();
// } if(prefieldType==prefieldType.ORGID)//用户配置系统预置属性-组织机构标识
orgField=preField.getName();
if(prefieldType==prefieldType.ORGSECTORID)//用户配置系统预置属性-部门标识
orgDeptField=preField.getName();
if(fieldAnnotation.isKeyField())//用户配置系统预置属性-部门标识
keyField=preField.getName();
}
permissionFiled.put("orgfield",orgField); permissionFiled.put("orgfield",orgField);
permissionFiled.put("orgsecfield",orgsecField); permissionFiled.put("orgsecfield",orgDeptField);
permissionFiled.put("createmanfield",createManField);
permissionFiled.put("keyfield",keyField);
return permissionFiled; return permissionFiled;
} }
/** /**
* 获取bean名称 *获取含有@DEField注解的实体属性
* @param className * @param className do对象类名
* @return * @return
*/ */
private String getBeanName(String className) { private Map <Field, DEField> SearchDEField(String className){
if (Character.isLowerCase(className.charAt(0))) {
return className; List<Field> fields = DEFieldCacheMap.getFields(className);
} else { Map <Field, DEField> deFieldMap =new HashMap<>();
return (new StringBuilder()).append(Character.toLowerCase(className.charAt(0))).append(className.substring(1)).toString(); for(Field field:fields){
DEField deField=field.getAnnotation(DEField.class);
if(!ObjectUtils.isEmpty(deField)) {
deFieldMap.put(field,deField);
} }
} }
return deFieldMap;
}
/** /**
* 转换[a,b]格式字符串到 'a','b'格式 * 转换[a,b]格式字符串到 'a','b'格式
*
* @return * @return
*/ */
private String formatStringArr(JSONArray array) { private String formatStringArr(JSONArray array) {
String[] arr = array.toArray(new String[array.size()]); String[] arr = array.toArray(new String[array.size()]);
return "'" + String.join("','", arr) + "'"; return "'" + String.join("','", arr) + "'";
} }
/**
* 格式转换
* @param cond
* @param operator
* @return
*/
private String parseResult(StringBuffer cond, String operator) {
String resultCond = cond.toString();
if (resultCond.startsWith(operator))
resultCond = resultCond.replaceFirst(operator, "");
if (resultCond.endsWith(operator))
resultCond = resultCond.substring(0, resultCond.lastIndexOf(operator));
return resultCond;
}
} }
\ No newline at end of file
...@@ -58,7 +58,7 @@ public class AuthenticationUser implements UserDetails ...@@ -58,7 +58,7 @@ public class AuthenticationUser implements UserDetails
private String fontsize; private String fontsize;
private String lang; private String lang;
private String memo; private String memo;
private Map <String,String> sessionParams; private Map <String,Object> sessionParams;
@JsonIgnore @JsonIgnore
private Collection<GrantedAuthority> authorities; private Collection<GrantedAuthority> authorities;
@JsonIgnore @JsonIgnore
...@@ -68,7 +68,7 @@ public class AuthenticationUser implements UserDetails ...@@ -68,7 +68,7 @@ public class AuthenticationUser implements UserDetails
private String orglevel;//单位级别 private String orglevel;//单位级别
private String deptlevel;//部门级别 private String deptlevel;//部门级别
@JsonIgnore @JsonIgnore
private Map<String,String> userSessionParam;//用户自定义session private Map<String,Object> userSessionParam;//用户自定义session
@JsonIgnore @JsonIgnore
private JSONObject orgInfo;//上下级组织信息 private JSONObject orgInfo;//上下级组织信息
...@@ -118,7 +118,7 @@ public class AuthenticationUser implements UserDetails ...@@ -118,7 +118,7 @@ public class AuthenticationUser implements UserDetails
return authuserdetail; return authuserdetail;
} }
public Map <String,String> getSessionParams() public Map <String,Object> getSessionParams()
{ {
if(this.sessionParams==null) if(this.sessionParams==null)
{ {
...@@ -142,7 +142,7 @@ public class AuthenticationUser implements UserDetails ...@@ -142,7 +142,7 @@ public class AuthenticationUser implements UserDetails
} }
return this.sessionParams; return this.sessionParams;
} }
private Map<String, String> getUserSessionParam() { private Map<String, Object> getUserSessionParam() {
if(userSessionParam!=null) if(userSessionParam!=null)
return userSessionParam; return userSessionParam;
else else
......
...@@ -4,8 +4,9 @@ TARGET=PSSYSTEM ...@@ -4,8 +4,9 @@ TARGET=PSSYSTEM
package ${pub.getPKGCodeName()}.util.service; package ${pub.getPKGCodeName()}.util.service;
import ${pub.getPKGCodeName()}.util.domain.FileItem; import ${pub.getPKGCodeName()}.util.domain.FileItem;
import com.cmbchina.util.errors.InternalServerErrorException; import ${pub.getPKGCodeName()}.util.errors.InternalServerErrorException;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.util.DigestUtils;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Primary; import org.springframework.context.annotation.Primary;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
...@@ -14,7 +15,6 @@ import org.springframework.web.multipart.MultipartFile; ...@@ -14,7 +15,6 @@ import org.springframework.web.multipart.MultipartFile;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.nio.file.Files; import java.nio.file.Files;
import java.util.UUID;
@Primary @Primary
@Slf4j @Slf4j
...@@ -24,26 +24,22 @@ public class SimpleFileService implements FileService { ...@@ -24,26 +24,22 @@ public class SimpleFileService implements FileService {
@Value("${r'${ibiz.filePath:/app/file/}'}") @Value("${r'${ibiz.filePath:/app/file/}'}")
private String fileRoot; private String fileRoot;
@Override @Override
public FileItem saveFile(MultipartFile multipartFile) { public FileItem saveFile(MultipartFile multipartFile) {
FileItem item=null; FileItem item=null;
// 获取文件名 // 获取文件名
String fileName = multipartFile.getOriginalFilename(); String fileName = multipartFile.getOriginalFilename();
// 获取文件后缀 // 获取文件后缀
String extname="."+getExtensionName(fileName); String extname="."+getExtensionName(fileName);
// uuid作为文件名,防止生成的临时文件重复 try {
String fileid= UUID.randomUUID().toString(); String fileid= DigestUtils.md5DigestAsHex(multipartFile.getInputStream());
String fileFullPath = this.fileRoot+"ibztuit"+File.separator+fileid+File.separator+fileName; String fileFullPath = this.fileRoot+"ibizutil"+File.separator+fileid+File.separator+fileName;
File file = new File(fileFullPath); File file = new File(fileFullPath);
File parent = new File(file.getParent()); File parent = new File(file.getParent());
if(!parent.exists()) if(!parent.exists())
parent.mkdirs(); parent.mkdirs();
try { FileCopyUtils.copy(multipartFile.getInputStream(),Files.newOutputStream(file.toPath()));
FileCopyUtils.copy(multipartFile.getInputStream() , Files.newOutputStream(file.toPath())); item=new FileItem(fileid,fileName,fileid,fileName,(int)multipartFile.getSize(),extname);
item=new FileItem(fileid,fileName, (int)multipartFile.getSize() ,extname);
} catch (IOException e) { } catch (IOException e) {
throw new InternalServerErrorException("文件上传失败"); throw new InternalServerErrorException("文件上传失败");
} }
...@@ -52,7 +48,7 @@ public class SimpleFileService implements FileService { ...@@ -52,7 +48,7 @@ public class SimpleFileService implements FileService {
@Override @Override
public File getFile(String fileid) { public File getFile(String fileid) {
String dirpath = this.fileRoot+"ibztuit"+File.separator+fileid; String dirpath = this.fileRoot+"ibizutil"+File.separator+fileid;
File parent = new File(dirpath); File parent = new File(dirpath);
if (parent.exists() && parent.isDirectory() && parent.listFiles().length > 0) { if (parent.exists() && parent.isDirectory() && parent.listFiles().length > 0) {
return parent.listFiles()[0]; return parent.listFiles()[0];
......
...@@ -112,7 +112,10 @@ public class SimpleUserService implements AuthenticationUserService{ ...@@ -112,7 +112,10 @@ public class SimpleUserService implements AuthenticationUserService{
JSONObject orgInfo=ouFeignClient.getOrgInfo(user.getLoginname()); JSONObject orgInfo=ouFeignClient.getOrgInfo(user.getLoginname());
if(orgInfo==null) if(orgInfo==null)
throw new RuntimeException("获取用户信息失败,请检查用户中心[IBZOU]中是否存在当前用户!"); throw new RuntimeException("获取用户信息失败,请检查用户中心[IBZOU]中是否存在当前用户!");
JSONObject curUser=orgInfo.getJSONObject("curuser");
user.setOrgInfo(orgInfo); user.setOrgInfo(orgInfo);
user.setMdeptid(curUser.getString("orgdept"));
user.setOrgid(curUser.getString("org"));
} }
} }
......
...@@ -78,3 +78,7 @@ logging: ...@@ -78,3 +78,7 @@ logging:
ribbon: ribbon:
ReadTimeout: 60000 ReadTimeout: 60000
ConnectTimeout: 60000 ConnectTimeout: 60000
#系统是否开启权限验证
ibiz:
enablePermissionValid: false
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
TARGET=PSSYSTEM TARGET=PSSYSTEM
</#ibiztemplate> </#ibiztemplate>
<#if pub.getPSDeployCenter()?? && sysrun.getRunMode()??> <#if pub.getPSDeployCenter()?? && sysrun.getRunMode()??>
<#if pub.getPSDeployCenter().getDeployCenterType()?? && (pub.getPSDeployCenter().getDeployCenterType()=="JENKINS") > <#if pub.getPSDeployCenter().getCIType()?? && (pub.getPSDeployCenter().getCIType()=="JENKINS") >
<#if sysrun.getRunMode() == "STARTMSAPI"> <#if sysrun.getRunMode() == "STARTMSAPI">
<#assign depapi = sysrun.getPSDevSlnMSDepAPI()> <#assign depapi = sysrun.getPSDevSlnMSDepAPI()>
<#assign configId = depapi.getId()> <#assign configId = depapi.getId()>
...@@ -53,6 +53,7 @@ TARGET=PSSYSTEM ...@@ -53,6 +53,7 @@ TARGET=PSSYSTEM
<hudson.tasks.Shell> <hudson.tasks.Shell>
<command> <command>
BUILD_ID=DONTKILLME BUILD_ID=DONTKILLME
echo "${pub.getPSDeployCenter().getPSRegistryRepo().getConnStr()}"
source /etc/profile source /etc/profile
rm -rf ${sys.codeName?lower_case} rm -rf ${sys.codeName?lower_case}
git clone -b ${branch} $para2 ${sys.codeName?lower_case}/ git clone -b ${branch} $para2 ${sys.codeName?lower_case}/
...@@ -60,10 +61,13 @@ TARGET=PSSYSTEM ...@@ -60,10 +61,13 @@ TARGET=PSSYSTEM
cd ${sys.codeName?lower_case}/ cd ${sys.codeName?lower_case}/
<#if sysrun.getRunMode() == "STARTMSAPP"> <#if sysrun.getRunMode() == "STARTMSAPP">
mvn clean package -P${pub.getPSApplication().getPKGCodeName()?lower_case} mvn clean package -P${pub.getPSApplication().getPKGCodeName()?lower_case}
<#if pub.getPSDeployCenter().getCDType()?? && (pub.getPSDeployCenter().getCDType()=="SWARM") >
cd ${pub.getCodeName()?lower_case}-app/${pub.getCodeName()?lower_case}-app-${pub.getPSApplication().getPKGCodeName()?lower_case} cd ${pub.getCodeName()?lower_case}-app/${pub.getCodeName()?lower_case}-app-${pub.getPSApplication().getPKGCodeName()?lower_case}
mvn -P${pub.getPSApplication().getPKGCodeName()?lower_case} docker:build mvn -P${pub.getPSApplication().getPKGCodeName()?lower_case} docker:build
mvn -P${pub.getPSApplication().getPKGCodeName()?lower_case} docker:push mvn -P${pub.getPSApplication().getPKGCodeName()?lower_case} docker:push
docker -H tcp://172.16.102.110:2375 stack deploy --compose-file=src/main/docker/${pub.getCodeName()?lower_case}-app-${pub.getPSApplication().getPKGCodeName()?lower_case}.yaml dev --with-registry-auth docker -H $para1 stack deploy --compose-file=src/main/docker/${pub.getCodeName()?lower_case}-app-${pub.getPSApplication().getPKGCodeName()?lower_case}.yaml dev --with-registry-auth
<#elseif pub.getPSDeployCenter().getCDType()?? && (pub.getPSDeployCenter().getCDType()=="K8S") >
<#else>
echo &apos;echo &quot;$para1&quot;&apos; &gt; apppasswd.sh echo &apos;echo &quot;$para1&quot;&apos; &gt; apppasswd.sh
chmod -R 777 * chmod -R 777 *
setsid env SSH_ASKPASS=&apos;./apppasswd.sh&apos; DISPLAY=&apos;none:0&apos; ssh ${depnode.getSSHUserName()}@${depnode.getSSHIPAddr()} &quot;mkdir -p ${depnode.getWorkshopPath()}/${configId}&quot; setsid env SSH_ASKPASS=&apos;./apppasswd.sh&apos; DISPLAY=&apos;none:0&apos; ssh ${depnode.getSSHUserName()}@${depnode.getSSHIPAddr()} &quot;mkdir -p ${depnode.getWorkshopPath()}/${configId}&quot;
...@@ -71,18 +75,23 @@ TARGET=PSSYSTEM ...@@ -71,18 +75,23 @@ TARGET=PSSYSTEM
setsid env SSH_ASKPASS=&apos;./apppasswd.sh&apos; DISPLAY=&apos;none:0&apos; ssh ${depnode.getSSHUserName()}@${depnode.getSSHIPAddr()} &quot;ps -ef | grep &apos;${depnode.getWorkshopPath()}/${configId}&apos;| tr -s &apos; &apos;|cut -d&apos; &apos; -f2,8,9 | grep -v grep | grep &apos;jar&apos; | cut -d&apos; &apos; -f1|xargs --no-run-if-empty kill -9&quot; setsid env SSH_ASKPASS=&apos;./apppasswd.sh&apos; DISPLAY=&apos;none:0&apos; ssh ${depnode.getSSHUserName()}@${depnode.getSSHIPAddr()} &quot;ps -ef | grep &apos;${depnode.getWorkshopPath()}/${configId}&apos;| tr -s &apos; &apos;|cut -d&apos; &apos; -f2,8,9 | grep -v grep | grep &apos;jar&apos; | cut -d&apos; &apos; -f1|xargs --no-run-if-empty kill -9&quot;
setsid env SSH_ASKPASS=&apos;./apppasswd.sh&apos; DISPLAY=&apos;none:0&apos; ssh ${depnode.getSSHUserName()}@${depnode.getSSHIPAddr()} &quot;source /etc/profile;source ~/.bash_profile; nohup java -jar -Xms512m -Xmx1024m -XX:PermSize=128M -XX:MaxPermSize=128m ${depnode.getWorkshopPath()}/${configId}/${pub.getCodeName()?lower_case}-app-${pub.getPSApplication().getPKGCodeName()?lower_case}.jar &gt;&gt;${depnode.getWorkshopPath()}/${configId}/${sys.codeName?lower_case}_${config?lower_case}-`date --date=&apos;0 days ago&apos; +%Y-%m-%d`.log 2&gt;&amp;1 &amp;&quot; setsid env SSH_ASKPASS=&apos;./apppasswd.sh&apos; DISPLAY=&apos;none:0&apos; ssh ${depnode.getSSHUserName()}@${depnode.getSSHIPAddr()} &quot;source /etc/profile;source ~/.bash_profile; nohup java -jar -Xms512m -Xmx1024m -XX:PermSize=128M -XX:MaxPermSize=128m ${depnode.getWorkshopPath()}/${configId}/${pub.getCodeName()?lower_case}-app-${pub.getPSApplication().getPKGCodeName()?lower_case}.jar &gt;&gt;${depnode.getWorkshopPath()}/${configId}/${sys.codeName?lower_case}_${config?lower_case}-`date --date=&apos;0 days ago&apos; +%Y-%m-%d`.log 2&gt;&amp;1 &amp;&quot;
</#if> </#if>
</#if>
<#if sysrun.getRunMode() == "STARTMSAPI"> <#if sysrun.getRunMode() == "STARTMSAPI">
mvn clean package -P${pub.getPSSysServiceAPI().getCodeName()?lower_case} mvn clean package -P${pub.getPSSysServiceAPI().getCodeName()?lower_case}
<#if pub.getPSDeployCenter().getCDType()?? && (pub.getPSDeployCenter().getCDType()=="SWARM") >
cd ${pub.getCodeName()?lower_case}-provider/${pub.getCodeName()?lower_case}-provider-${pub.getPSSysServiceAPI().getCodeName()?lower_case} cd ${pub.getCodeName()?lower_case}-provider/${pub.getCodeName()?lower_case}-provider-${pub.getPSSysServiceAPI().getCodeName()?lower_case}
mvn -P${pub.getPSSysServiceAPI().getCodeName()?lower_case} docker:build mvn -P${pub.getPSSysServiceAPI().getCodeName()?lower_case} docker:build
mvn -P${pub.getPSSysServiceAPI().getCodeName()?lower_case} docker:push mvn -P${pub.getPSSysServiceAPI().getCodeName()?lower_case} docker:push
docker -H tcp://172.16.102.110:2375 stack deploy --compose-file=src/main/docker/${pub.getCodeName()?lower_case}-provider-${pub.getPSSysServiceAPI().getCodeName()?lower_case}.yaml dev --with-registry-auth docker -H $para1 stack deploy --compose-file=src/main/docker/${pub.getCodeName()?lower_case}-provider-${pub.getPSSysServiceAPI().getCodeName()?lower_case}.yaml dev --with-registry-auth
<#elseif pub.getPSDeployCenter().getCDType()?? && (pub.getPSDeployCenter().getCDType()=="K8S") >
<#else>
echo &apos;echo &quot;$para1&quot;&apos; &gt; apppasswd.sh echo &apos;echo &quot;$para1&quot;&apos; &gt; apppasswd.sh
chmod -R 777 * chmod -R 777 *
setsid env SSH_ASKPASS=&apos;./apppasswd.sh&apos; DISPLAY=&apos;none:0&apos; ssh ${depnode.getSSHUserName()}@${depnode.getSSHIPAddr()} &quot;mkdir -p ${depnode.getWorkshopPath()}/${configId}&quot; setsid env SSH_ASKPASS=&apos;./apppasswd.sh&apos; DISPLAY=&apos;none:0&apos; ssh ${depnode.getSSHUserName()}@${depnode.getSSHIPAddr()} &quot;mkdir -p ${depnode.getWorkshopPath()}/${configId}&quot;
setsid env SSH_ASKPASS=&apos;./apppasswd.sh&apos; DISPLAY=&apos;none:0&apos; scp -r ${pub.getCodeName()?lower_case}-provider-${pub.getPSSysServiceAPI().getCodeName()?lower_case}.jar ${depnode.getSSHUserName()}@${depnode.getSSHIPAddr()}:${depnode.getWorkshopPath()}/${configId} setsid env SSH_ASKPASS=&apos;./apppasswd.sh&apos; DISPLAY=&apos;none:0&apos; scp -r ${pub.getCodeName()?lower_case}-provider-${pub.getPSSysServiceAPI().getCodeName()?lower_case}.jar ${depnode.getSSHUserName()}@${depnode.getSSHIPAddr()}:${depnode.getWorkshopPath()}/${configId}
setsid env SSH_ASKPASS=&apos;./apppasswd.sh&apos; DISPLAY=&apos;none:0&apos; ssh ${depnode.getSSHUserName()}@${depnode.getSSHIPAddr()} &quot;ps -ef | grep &apos;${depnode.getWorkshopPath()}/${configId}&apos;| tr -s &apos; &apos;|cut -d&apos; &apos; -f2,8,9 | grep -v grep | grep &apos;jar&apos; | cut -d&apos; &apos; -f1|xargs --no-run-if-empty kill -9&quot; setsid env SSH_ASKPASS=&apos;./apppasswd.sh&apos; DISPLAY=&apos;none:0&apos; ssh ${depnode.getSSHUserName()}@${depnode.getSSHIPAddr()} &quot;ps -ef | grep &apos;${depnode.getWorkshopPath()}/${configId}&apos;| tr -s &apos; &apos;|cut -d&apos; &apos; -f2,8,9 | grep -v grep | grep &apos;jar&apos; | cut -d&apos; &apos; -f1|xargs --no-run-if-empty kill -9&quot;
setsid env SSH_ASKPASS=&apos;./apppasswd.sh&apos; DISPLAY=&apos;none:0&apos; ssh ${depnode.getSSHUserName()}@${depnode.getSSHIPAddr()} &quot;source /etc/profile;source ~/.bash_profile; nohup java -jar -Xms512m -Xmx1024m -XX:PermSize=128M -XX:MaxPermSize=128m ${depnode.getWorkshopPath()}/${configId}/${pub.getCodeName()?lower_case}-provider-${pub.getPSSysServiceAPI().getCodeName()?lower_case}.jar &gt;&gt;${depnode.getWorkshopPath()}/${configId}/${sys.codeName?lower_case}_${config?lower_case}-`date --date=&apos;0 days ago&apos; +%Y-%m-%d`.log 2&gt;&amp;1 &amp;&quot; setsid env SSH_ASKPASS=&apos;./apppasswd.sh&apos; DISPLAY=&apos;none:0&apos; ssh ${depnode.getSSHUserName()}@${depnode.getSSHIPAddr()} &quot;source /etc/profile;source ~/.bash_profile; nohup java -jar -Xms512m -Xmx1024m -XX:PermSize=128M -XX:MaxPermSize=128m ${depnode.getWorkshopPath()}/${configId}/${pub.getCodeName()?lower_case}-provider-${pub.getPSSysServiceAPI().getCodeName()?lower_case}.jar &gt;&gt;${depnode.getWorkshopPath()}/${configId}/${sys.codeName?lower_case}_${config?lower_case}-`date --date=&apos;0 days ago&apos; +%Y-%m-%d`.log 2&gt;&amp;1 &amp;&quot;
</#if>
</#if> </#if>
</command> </command>
</hudson.tasks.Shell> </hudson.tasks.Shell>
......
Markdown 格式
0% or
您添加了 0 到此讨论。请谨慎行事。
先完成此消息的编辑!
想要评论请 注册