onlyxx
4 years ago
commit
65480b16a0
37 changed files with 1718 additions and 0 deletions
@ -0,0 +1,132 @@
|
||||
apply plugin: 'java' |
||||
|
||||
|
||||
ext { |
||||
/** |
||||
* 项目中依赖的jar的路径 |
||||
* 1.如果依赖的jar需要打包到zip中,放置在lib根目录下 |
||||
* 2.如果依赖的jar仅仅是编译时需要,防止在lib下子目录下即可 |
||||
*/ |
||||
libPath = "$projectDir/../webroot/WEB-INF/lib" |
||||
|
||||
/** |
||||
* 是否对插件的class进行加密保护,防止反编译 |
||||
*/ |
||||
guard = true |
||||
|
||||
def pluginInfo = getPluginInfo() |
||||
pluginPre = "fine-plugin" |
||||
pluginName = pluginInfo.id |
||||
pluginVersion = pluginInfo.version |
||||
|
||||
outputPath = "$projectDir/../webroot/WEB-INF/plugins/plugin-" + pluginName + "-1.0/classes" |
||||
} |
||||
|
||||
group = 'com.fr.plugin' |
||||
version = '10.0' |
||||
sourceCompatibility = '8' |
||||
|
||||
sourceSets { |
||||
main { |
||||
java.outputDir = file(outputPath) |
||||
output.resourcesDir = file(outputPath) |
||||
} |
||||
} |
||||
|
||||
ant.importBuild("encrypt.xml") |
||||
//定义ant变量 |
||||
ant.projectDir = projectDir |
||||
ant.references["compile.classpath"] = ant.path { |
||||
fileset(dir: libPath, includes: '**/*.jar') |
||||
fileset(dir: ".", includes: "**/*.jar") |
||||
} |
||||
|
||||
tasks.withType(JavaCompile) { |
||||
options.encoding = "UTF-8" |
||||
} |
||||
|
||||
classes.dependsOn('clean') |
||||
|
||||
task copyFiles(type: Copy, dependsOn: 'classes') { |
||||
from outputPath |
||||
into "$projectDir/classes" |
||||
} |
||||
|
||||
task preJar(type: Copy, dependsOn: guard ? 'compile_encrypt_javas' : 'compile_plain_javas') { |
||||
from "$projectDir/classes" |
||||
into "$projectDir/transform-classes" |
||||
include "**/*.*" |
||||
} |
||||
jar.dependsOn("preJar") |
||||
classes.dependsOn("copyPluginXML") |
||||
|
||||
task copyPluginXML(type: Copy) { |
||||
print "copyed plugin.xml file" |
||||
from "$projectDir/plugin.xml" |
||||
into file("$projectDir/../webroot/WEB-INF/plugins/plugin-" + pluginName + "-1.0/") |
||||
} |
||||
task makeJar(type: Jar, dependsOn: preJar) { |
||||
from fileTree(dir: "$projectDir/transform-classes") |
||||
baseName pluginPre |
||||
appendix pluginName |
||||
version pluginVersion |
||||
destinationDir = file("$buildDir/libs") |
||||
|
||||
doLast() { |
||||
delete file("$projectDir/classes") |
||||
delete file("$projectDir/transform-classes") |
||||
} |
||||
} |
||||
|
||||
task copyFile(type: Copy, dependsOn: ["makeJar"]) { |
||||
from "$buildDir/libs" |
||||
from("$projectDir/lib") { |
||||
include "*.jar" |
||||
} |
||||
from "$projectDir/plugin.xml" |
||||
into file("$buildDir/temp/plugin") |
||||
} |
||||
|
||||
task zip(type: Zip, dependsOn: ["copyFile"]) { |
||||
from "$buildDir/temp/plugin" |
||||
destinationDir file("$buildDir/install") |
||||
baseName pluginPre |
||||
appendix pluginName |
||||
version pluginVersion |
||||
} |
||||
|
||||
//控制build时包含哪些文件,排除哪些文件 |
||||
processResources { |
||||
// exclude everything |
||||
// 用*.css没效果 |
||||
// exclude '**/*.css' |
||||
// except this file |
||||
// include 'xx.xml' |
||||
} |
||||
|
||||
/*读取plugin.xml中的version*/ |
||||
|
||||
def getPluginInfo() { |
||||
def xmlFile = file("plugin.xml") |
||||
if (!xmlFile.exists()) { |
||||
return ["id": "none", "version": "1.0.0"] |
||||
} |
||||
def plugin = new XmlParser().parse(xmlFile) |
||||
def version = plugin.version[0].text() |
||||
def id = plugin.id[0].text() |
||||
return ["id": id, "version": version] |
||||
} |
||||
|
||||
repositories { |
||||
mavenLocal() |
||||
maven { |
||||
url = uri('http://mvn.finedevelop.com/repository/maven-public/') |
||||
} |
||||
} |
||||
|
||||
dependencies { |
||||
//使用本地jar |
||||
implementation fileTree(dir: 'lib', include: ['**/*.jar']) |
||||
implementation fileTree(dir: libPath, include: ['**/*.jar']) |
||||
} |
||||
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -0,0 +1,13 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?> |
||||
<project> |
||||
<target name="compile_encrypt_javas" depends="copyFiles"> |
||||
<echo message="加密文件"/> |
||||
<echo message="${projectDir}"/> |
||||
<taskdef name="pretreatment" classname="com.fr.plugin.pack.PluginPretreatmentTask"> |
||||
<classpath refid="compile.classpath"/> |
||||
</taskdef> |
||||
<pretreatment baseDir="${projectDir}"/> |
||||
</target> |
||||
<target name="compile_plain_javas" depends="copyFiles"> |
||||
</target> |
||||
</project> |
Binary file not shown.
@ -0,0 +1,35 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?> |
||||
<plugin> |
||||
<id>com.fr.plugin.7.mix.project</id> |
||||
<name><![CDATA[综合登录项目]]></name> |
||||
<active>yes</active> |
||||
<version>1.0</version> |
||||
<env-version>10.0</env-version> |
||||
<jartime>2018-07-31</jartime> |
||||
<vendor>author</vendor> |
||||
<description><![CDATA[综合登录项目]]></description> |
||||
<change-notes><![CDATA[ |
||||
]]></change-notes> |
||||
<!-- 插件生命周期声明--> |
||||
<lifecycle-monitor class="com.fr.plugin.IpTokenLife"/> |
||||
<!---决策平台的数据库访问--> |
||||
<extra-decision> |
||||
<DecisionDBAccessProvider class="com.fr.plugin.IPTokenPluginDecisionDBAccessProvider"/> |
||||
</extra-decision> |
||||
<!--后台菜单--> |
||||
<extra-decision> |
||||
<SystemOptionProvider class="com.fr.plugin.IpTokenOptionProvider"/> |
||||
<!-- <WebResourceProvider class="com.fr.plugin.IpTokenJSCSSBridge"/>--> |
||||
</extra-decision> |
||||
<!--拦截器--> |
||||
<extra-decision> |
||||
<GlobalRequestFilterProvider class="com.fr.plugin.filter.TokenGlobalRequestFilter"/> |
||||
<GlobalRequestFilterProvider class="com.fr.plugin.filter.IpGlobalRequestFilter"/> |
||||
</extra-decision> |
||||
<!--提供接口--> |
||||
<extra-decision> |
||||
<HttpHandlerProvider class="com.fr.plugin.IpTokenHttpProvider"/> |
||||
<!-- <URLAliasProvider class="com.fr.plugin.IpTokenURLAlias2Provider"/>--> |
||||
</extra-decision> |
||||
<function-recorder class="com.fr.plugin.IPTokenPluginDecisionDBAccessProvider"/> |
||||
</plugin> |
@ -0,0 +1,63 @@
|
||||
package com.fr.plugin; |
||||
|
||||
|
||||
import com.fr.decision.plugin.db.AbstractDecisionDBAccessProvider; |
||||
import com.fr.plugin.dao.UserIpRelationDao; |
||||
import com.fr.plugin.dao.UserTokenRelationDao; |
||||
import com.fr.plugin.entity.UserIpEntity; |
||||
import com.fr.plugin.entity.UserTokenEntity; |
||||
import com.fr.plugin.transform.ExecuteFunctionRecord; |
||||
import com.fr.plugin.transform.FunctionRecorder; |
||||
import com.fr.stable.db.accessor.DBAccessor; |
||||
import com.fr.stable.db.dao.BaseDAO; |
||||
import com.fr.stable.db.dao.DAOProvider; |
||||
|
||||
//第一步类 继承AbstractDecisionDBAccessProvider
|
||||
@FunctionRecorder |
||||
public class IPTokenPluginDecisionDBAccessProvider extends AbstractDecisionDBAccessProvider { |
||||
|
||||
//第二步 注册数据库访问类
|
||||
@Override |
||||
@ExecuteFunctionRecord |
||||
public DAOProvider[] registerDAO() { |
||||
return new DAOProvider[]{ |
||||
//注意这里是匿名类
|
||||
new DAOProvider() { |
||||
@Override |
||||
public Class getEntityClass() { |
||||
return UserIpEntity.class; |
||||
} |
||||
|
||||
@Override |
||||
public Class<? extends BaseDAO> getDAOClass() { |
||||
return UserIpRelationDao.class; |
||||
} |
||||
}, |
||||
new DAOProvider() { |
||||
@Override |
||||
public Class getEntityClass() { |
||||
return UserTokenEntity.class; |
||||
} |
||||
|
||||
@Override |
||||
public Class<? extends BaseDAO> getDAOClass() { |
||||
return UserTokenRelationDao.class; |
||||
} |
||||
} |
||||
}; |
||||
} |
||||
|
||||
//第三步新建一个DBAccessor 静态变量
|
||||
private static DBAccessor dbAccessor = null; |
||||
|
||||
//第四步写一个公开的静态方法去获取DBAccessor
|
||||
public static DBAccessor getDbAccessor() { |
||||
return dbAccessor; |
||||
} |
||||
|
||||
//第五步 重写数据库访问器注入函数(当数据库访问器准备好之后由fr注入到这里)
|
||||
@Override |
||||
public void onDBAvailable(DBAccessor dbAccessor) { |
||||
IPTokenPluginDecisionDBAccessProvider.dbAccessor = dbAccessor; |
||||
} |
||||
} |
@ -0,0 +1,22 @@
|
||||
package com.fr.plugin; |
||||
|
||||
import com.fr.decision.fun.HttpHandler; |
||||
import com.fr.decision.fun.impl.AbstractHttpHandlerProvider; |
||||
import com.fr.plugin.http.ip.*; |
||||
import com.fr.plugin.http.token.*; |
||||
|
||||
public class IpTokenHttpProvider extends AbstractHttpHandlerProvider { |
||||
@Override |
||||
public HttpHandler[] registerHandlers() { |
||||
return new HttpHandler[]{ |
||||
new TokenListApi(), |
||||
new TokenAddApi(), |
||||
new TokenModApi(), |
||||
new TokenDelApi(), |
||||
new ListApi(), |
||||
new AddApi(), |
||||
new ModApi(), |
||||
new DelApi() |
||||
}; |
||||
} |
||||
} |
@ -0,0 +1,21 @@
|
||||
package com.fr.plugin; |
||||
|
||||
|
||||
import com.fr.decision.fun.impl.AbstractWebResourceProvider; |
||||
import com.fr.decision.web.MainComponent; |
||||
import com.fr.plugin.components.IPTokenComponent; |
||||
import com.fr.web.struct.Atom; |
||||
|
||||
public class IpTokenJSCSSBridge extends AbstractWebResourceProvider { |
||||
@Override |
||||
public Atom attach() { |
||||
//在平台主组件加载时添加我们自己的组件
|
||||
return MainComponent.KEY; |
||||
} |
||||
|
||||
@Override |
||||
public Atom client() { |
||||
//我们自己要引入的组件
|
||||
return IPTokenComponent.KEY; |
||||
} |
||||
} |
@ -0,0 +1,17 @@
|
||||
package com.fr.plugin; |
||||
|
||||
import com.fr.plugin.config.MySimpleConfig; |
||||
import com.fr.plugin.context.PluginContext; |
||||
import com.fr.plugin.observer.inner.AbstractPluginLifecycleMonitor; |
||||
|
||||
public class IpTokenLife extends AbstractPluginLifecycleMonitor { |
||||
@Override |
||||
public void afterRun(PluginContext pluginContext) { |
||||
MySimpleConfig.getInstance(); |
||||
} |
||||
|
||||
@Override |
||||
public void beforeStop(PluginContext pluginContext) { |
||||
|
||||
} |
||||
} |
@ -0,0 +1,45 @@
|
||||
package com.fr.plugin; |
||||
|
||||
import com.fr.decision.fun.impl.AbstractSystemOptionProvider; |
||||
import com.fr.decision.web.MainComponent; |
||||
import com.fr.plugin.components.IPTokenComponent; |
||||
import com.fr.web.struct.Atom; |
||||
|
||||
public class IpTokenOptionProvider extends AbstractSystemOptionProvider { |
||||
/** |
||||
* 这个id很重要 |
||||
* @return |
||||
*/ |
||||
@Override |
||||
public String id() { |
||||
return "ipToken-1"; |
||||
} |
||||
|
||||
@Override |
||||
public String displayName() { |
||||
return "ipToken配置"; |
||||
} |
||||
|
||||
@Override |
||||
public int sortIndex() { |
||||
return 0; |
||||
} |
||||
|
||||
/** |
||||
* 附加在主页后面 |
||||
* @return |
||||
*/ |
||||
@Override |
||||
public Atom attach() { |
||||
return MainComponent.KEY; |
||||
} |
||||
|
||||
/** |
||||
* 我们自己的组件申明 |
||||
* @return |
||||
*/ |
||||
@Override |
||||
public Atom client() { |
||||
return IPTokenComponent.KEY; |
||||
} |
||||
} |
@ -0,0 +1,18 @@
|
||||
package com.fr.plugin; |
||||
|
||||
import com.fr.decision.fun.impl.AbstractURLAliasProvider; |
||||
import com.fr.decision.webservice.url.alias.URLAlias; |
||||
import com.fr.decision.webservice.url.alias.URLAliasFactory; |
||||
import com.fr.plugin.transform.ExecuteFunctionRecord; |
||||
import com.fr.plugin.transform.FunctionRecorder; |
||||
|
||||
@FunctionRecorder |
||||
public class IpTokenURLAlias2Provider extends AbstractURLAliasProvider { |
||||
@Override |
||||
@ExecuteFunctionRecord |
||||
public URLAlias[] registerAlias() { |
||||
return new URLAlias[]{ |
||||
URLAliasFactory.createPluginAlias("/pcindex","/index",true), |
||||
}; |
||||
} |
||||
} |
@ -0,0 +1,55 @@
|
||||
package com.fr.plugin.components; |
||||
|
||||
|
||||
import com.fr.web.struct.AssembleComponent; |
||||
import com.fr.web.struct.Atom; |
||||
import com.fr.web.struct.Component; |
||||
import com.fr.web.struct.browser.RequestClient; |
||||
import com.fr.web.struct.category.ScriptPath; |
||||
import com.fr.web.struct.category.StylePath; |
||||
|
||||
//这里修改为继承AssembleComponent 支持依赖多个Atom从而注入多个js和css
|
||||
public class IPTokenComponent extends AssembleComponent { |
||||
public static IPTokenComponent KEY = new IPTokenComponent(); |
||||
|
||||
//这里用私有构造函数避免外部实例化这个类,只能通过KEY这个单例引用
|
||||
private IPTokenComponent() { |
||||
} |
||||
|
||||
@Override |
||||
public Atom[] refer() { |
||||
return new Atom[]{ |
||||
//生成一个匿名Component 只实现script 返回我们依赖的script
|
||||
new Component() { |
||||
@Override |
||||
public ScriptPath script(RequestClient requestClient) { |
||||
return ScriptPath.build("com/fr/plugin/web/table.js"); |
||||
} |
||||
}, |
||||
//生成一个匿名Component 只实现script 返回我们依赖的script
|
||||
new Component() { |
||||
@Override |
||||
public ScriptPath script(RequestClient requestClient) { |
||||
return ScriptPath.build("com/fr/plugin/web/userIpadd.js"); |
||||
} |
||||
}, |
||||
//生成一个匿名Component 只实现script 返回我们依赖的script
|
||||
new Component() { |
||||
@Override |
||||
public ScriptPath script(RequestClient requestClient) { |
||||
return ScriptPath.build("com/fr/plugin/web/tokenConfig.js"); |
||||
} |
||||
} |
||||
}; |
||||
} |
||||
|
||||
@Override |
||||
public ScriptPath script(RequestClient requestClient) { |
||||
return ScriptPath.build("com/fr/plugin/web/ipConfig.js"); |
||||
} |
||||
|
||||
@Override |
||||
public StylePath style(RequestClient requestClient) { |
||||
return StylePath.build("com/fr/plugin/web/iptoken.css"); |
||||
} |
||||
} |
@ -0,0 +1,28 @@
|
||||
package com.fr.plugin.config; |
||||
|
||||
import com.fr.config.*; |
||||
import com.fr.config.holder.Conf; |
||||
import com.fr.config.holder.factory.Holders; |
||||
|
||||
@Visualization(category = "ipToken配置") |
||||
public class MySimpleConfig extends DefaultConfiguration { |
||||
private static volatile MySimpleConfig config = null; |
||||
|
||||
public static MySimpleConfig getInstance() { |
||||
if (config == null) { |
||||
config = ConfigContext.getConfigInstance(MySimpleConfig.class); |
||||
} |
||||
return config; |
||||
} |
||||
|
||||
|
||||
@Identifier(value = "openFilter", name = "是否启用拦截器", description = "", status = Status.SHOW) |
||||
private Conf<Boolean> openFilter = Holders.simple(true); |
||||
|
||||
@Override |
||||
public Object clone() throws CloneNotSupportedException { |
||||
MySimpleConfig cloned = (MySimpleConfig) super.clone(); |
||||
cloned.openFilter = (Conf<Boolean>) openFilter.clone(); |
||||
return cloned; |
||||
} |
||||
} |
@ -0,0 +1,18 @@
|
||||
package com.fr.plugin.dao; |
||||
|
||||
import com.fr.plugin.entity.UserIpEntity; |
||||
import com.fr.stable.db.dao.BaseDAO; |
||||
import com.fr.stable.db.session.DAOSession; |
||||
|
||||
|
||||
public class UserIpRelationDao extends BaseDAO<UserIpEntity> { |
||||
|
||||
public UserIpRelationDao(DAOSession daoSession) { |
||||
super(daoSession); |
||||
} |
||||
|
||||
@Override |
||||
protected Class<UserIpEntity> getEntityClass() { |
||||
return UserIpEntity.class; |
||||
} |
||||
} |
@ -0,0 +1,18 @@
|
||||
package com.fr.plugin.dao; |
||||
|
||||
import com.fr.plugin.entity.UserTokenEntity; |
||||
import com.fr.plugin.entity.UserTokenEntity; |
||||
import com.fr.stable.db.dao.BaseDAO; |
||||
import com.fr.stable.db.session.DAOSession; |
||||
|
||||
|
||||
public class UserTokenRelationDao extends BaseDAO<UserTokenEntity> { |
||||
public UserTokenRelationDao(DAOSession daoSession) { |
||||
super(daoSession); |
||||
} |
||||
|
||||
@Override |
||||
protected Class<UserTokenEntity> getEntityClass() { |
||||
return UserTokenEntity.class; |
||||
} |
||||
} |
@ -0,0 +1,45 @@
|
||||
package com.fr.plugin.entity; |
||||
|
||||
import com.fr.stable.db.entity.BaseEntity; |
||||
import com.fr.third.javax.persistence.Column; |
||||
import com.fr.third.javax.persistence.Entity; |
||||
import com.fr.third.javax.persistence.Table; |
||||
|
||||
import java.util.Date; |
||||
|
||||
//第一步添加这两个注解,特别是table的name属性要唯一,并将类继承到BaseEntity,会自动生产id字段
|
||||
@Entity |
||||
@Table( |
||||
name = "plugin_user_ip_relationship" |
||||
) |
||||
public class UserIpEntity extends BaseEntity { |
||||
|
||||
//第二步注册要使用的字段加上@Column注解
|
||||
@Column( |
||||
name = "userName" |
||||
) |
||||
private String userName; |
||||
|
||||
@Column( |
||||
name = "ip" |
||||
) |
||||
private String ip; |
||||
|
||||
|
||||
//第三步生成对应的get和set
|
||||
public String getUserName() { |
||||
return userName; |
||||
} |
||||
|
||||
public void setUserName(String userName) { |
||||
this.userName = userName; |
||||
} |
||||
|
||||
public String getIp() { |
||||
return ip; |
||||
} |
||||
|
||||
public void setIp(String ip) { |
||||
this.ip = ip; |
||||
} |
||||
} |
@ -0,0 +1,43 @@
|
||||
package com.fr.plugin.entity; |
||||
|
||||
import com.fr.stable.db.entity.BaseEntity; |
||||
import com.fr.third.javax.persistence.Column; |
||||
import com.fr.third.javax.persistence.Entity; |
||||
import com.fr.third.javax.persistence.Table; |
||||
|
||||
import java.util.Date; |
||||
|
||||
//第一步添加这两个注解,特别是table的name属性要唯一,并将类继承到BaseEntity,会自动生产id字段
|
||||
@Entity |
||||
@Table( |
||||
name = "plugin_user_token_relationship" |
||||
) |
||||
public class UserTokenEntity extends BaseEntity { |
||||
|
||||
//第二步注册要使用的字段加上@Column注解
|
||||
@Column( |
||||
name = "userName" |
||||
) |
||||
private String userName; |
||||
|
||||
@Column( |
||||
name = "token" |
||||
) |
||||
private String token; |
||||
|
||||
public String getUserName() { |
||||
return userName; |
||||
} |
||||
|
||||
public void setUserName(String userName) { |
||||
this.userName = userName; |
||||
} |
||||
|
||||
public String getToken() { |
||||
return token; |
||||
} |
||||
|
||||
public void setToken(String token) { |
||||
this.token = token; |
||||
} |
||||
} |
@ -0,0 +1,99 @@
|
||||
package com.fr.plugin.filter; |
||||
|
||||
import com.fr.decision.authority.data.User; |
||||
import com.fr.decision.fun.impl.AbstractGlobalRequestFilterProvider; |
||||
import com.fr.decision.webservice.utils.DecisionServiceConstants; |
||||
import com.fr.decision.webservice.v10.login.LoginService; |
||||
import com.fr.decision.webservice.v10.user.UserService; |
||||
import com.fr.plugin.IPTokenPluginDecisionDBAccessProvider; |
||||
import com.fr.plugin.dao.UserIpRelationDao; |
||||
import com.fr.plugin.dao.UserTokenRelationDao; |
||||
import com.fr.plugin.entity.UserIpEntity; |
||||
import com.fr.plugin.entity.UserTokenEntity; |
||||
import com.fr.stable.StringUtils; |
||||
import com.fr.stable.db.accessor.DBAccessor; |
||||
import com.fr.stable.query.QueryFactory; |
||||
import com.fr.stable.query.restriction.RestrictionFactory; |
||||
import com.fr.web.utils.WebUtils; |
||||
|
||||
import javax.servlet.FilterChain; |
||||
import javax.servlet.ServletException; |
||||
import javax.servlet.http.HttpServletRequest; |
||||
import javax.servlet.http.HttpServletResponse; |
||||
import java.io.IOException; |
||||
import java.util.List; |
||||
|
||||
public class IpGlobalRequestFilter extends AbstractGlobalRequestFilterProvider { |
||||
|
||||
@Override |
||||
public String filterName() { |
||||
return "iptoken"; |
||||
} |
||||
|
||||
@Override |
||||
public String[] urlPatterns() { |
||||
return new String[]{ |
||||
"/decision/*" |
||||
}; |
||||
} |
||||
|
||||
/** |
||||
* @param req |
||||
* @param res |
||||
* @param filterChain |
||||
*/ |
||||
@Override |
||||
public void doFilter(HttpServletRequest req, HttpServletResponse res, FilterChain filterChain) { |
||||
try { |
||||
//未登录才获取token,这里登录成功或失败都交给下一步去处理
|
||||
if (isLogin(req)) { |
||||
//使用loginService 获取当前登录的用户名
|
||||
String currentUserName = LoginService.getInstance().getCurrentUserNameFromRequestCookie(req); |
||||
String currentUserId = UserService.getInstance().getCurrentUserId(currentUserName); |
||||
if(!UserService.getInstance().isAdmin(currentUserId)){ |
||||
String ip = getIp(req); |
||||
if (!checkUserCanLoginOnIp(currentUserName,ip) ) { |
||||
WebUtils.printAsString(res,"对不起,您不能在:"+ip+" 登录"); |
||||
return; |
||||
} |
||||
} |
||||
} |
||||
filterChain.doFilter(req, res); |
||||
} catch (IOException | ServletException ignored) { |
||||
} catch (Exception e) { |
||||
e.printStackTrace(); |
||||
} |
||||
} |
||||
|
||||
private String getIp(HttpServletRequest req) { |
||||
//这里忽略有前置代理服务器的情况,默认就是直接访问的
|
||||
return req.getRemoteAddr(); |
||||
} |
||||
|
||||
/** |
||||
* 检查用户是否有权力在这个ip上登录 |
||||
* |
||||
* @param userName |
||||
* @param ip |
||||
* @return |
||||
* @throws Exception |
||||
*/ |
||||
private boolean checkUserCanLoginOnIp(String userName, String ip) throws Exception { |
||||
//获取访问器
|
||||
DBAccessor dbAccessor = IPTokenPluginDecisionDBAccessProvider.getDbAccessor(); |
||||
//通过dao查询数据库返回的时一个list
|
||||
List<UserIpEntity> entities = dbAccessor.runQueryAction(daoContext -> |
||||
daoContext.getDAO(UserIpRelationDao.class) |
||||
.find( |
||||
QueryFactory.create() |
||||
.addRestriction(RestrictionFactory.eq("ip", ip)) |
||||
.addRestriction(RestrictionFactory.eq("userName", userName)) |
||||
)); |
||||
//如果查询到有对应权限就直接返回允许登录
|
||||
return !entities.isEmpty(); |
||||
} |
||||
|
||||
private boolean isLogin(HttpServletRequest request) { |
||||
return LoginService.getInstance().isLogged(request); |
||||
} |
||||
} |
@ -0,0 +1,91 @@
|
||||
package com.fr.plugin.filter; |
||||
|
||||
import com.fr.decision.authority.data.User; |
||||
import com.fr.decision.fun.impl.AbstractGlobalRequestFilterProvider; |
||||
import com.fr.decision.webservice.utils.DecisionServiceConstants; |
||||
import com.fr.decision.webservice.v10.login.LoginService; |
||||
import com.fr.decision.webservice.v10.user.UserService; |
||||
import com.fr.plugin.IPTokenPluginDecisionDBAccessProvider; |
||||
import com.fr.plugin.dao.UserTokenRelationDao; |
||||
import com.fr.plugin.entity.UserTokenEntity; |
||||
import com.fr.stable.StringUtils; |
||||
import com.fr.stable.db.accessor.DBAccessor; |
||||
import com.fr.stable.query.QueryFactory; |
||||
import com.fr.stable.query.restriction.RestrictionFactory; |
||||
|
||||
import javax.servlet.FilterChain; |
||||
import javax.servlet.ServletException; |
||||
import javax.servlet.http.HttpServletRequest; |
||||
import javax.servlet.http.HttpServletResponse; |
||||
import java.io.IOException; |
||||
import java.util.List; |
||||
|
||||
public class TokenGlobalRequestFilter extends AbstractGlobalRequestFilterProvider { |
||||
|
||||
@Override |
||||
public String filterName() { |
||||
return "TokenFilter"; |
||||
} |
||||
|
||||
@Override |
||||
public String[] urlPatterns() { |
||||
return new String[]{ |
||||
"/decision/*" |
||||
}; |
||||
} |
||||
|
||||
/** |
||||
* 本章目前只实现了token登录,在下一章我们实现ip拦截 |
||||
* |
||||
* @param req |
||||
* @param res |
||||
* @param filterChain |
||||
*/ |
||||
@Override |
||||
public void doFilter(HttpServletRequest req, HttpServletResponse res, FilterChain filterChain) { |
||||
try { |
||||
//未登录才获取token,这里登录成功或失败都交给下一步去处理
|
||||
if (!isLogin(req)) { |
||||
login(req, res); |
||||
} |
||||
filterChain.doFilter(req, res); |
||||
} catch (IOException | ServletException ignored) { |
||||
} catch (Exception e) { |
||||
e.printStackTrace(); |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* 具体登录的逻辑 |
||||
* @param req |
||||
* @param res |
||||
* @throws Exception |
||||
*/ |
||||
private void login(HttpServletRequest req, HttpServletResponse res) throws Exception { |
||||
String my_token = req.getParameter("token"); |
||||
if (StringUtils.isNotBlank(my_token)) { |
||||
String userName = getUserNameByToken(my_token); |
||||
User user = UserService.getInstance().getUserByUserName(userName); |
||||
if (user != null) { |
||||
String loginToken = LoginService.getInstance().login(req, res, userName); |
||||
req.setAttribute(DecisionServiceConstants.FINE_AUTH_TOKEN_NAME, loginToken); |
||||
} |
||||
} |
||||
} |
||||
|
||||
private String getUserNameByToken(String token) throws Exception { |
||||
//获取访问器
|
||||
DBAccessor dbAccessor = IPTokenPluginDecisionDBAccessProvider.getDbAccessor(); |
||||
//通过dao查询数据库返回的时一个list
|
||||
List<UserTokenEntity> entities = dbAccessor.runQueryAction(daoContext -> daoContext.getDAO(UserTokenRelationDao.class).find(QueryFactory.create().addRestriction(RestrictionFactory.eq("token", token)))); |
||||
//如果查询到有结果就返回第一个关联的用户
|
||||
if (!entities.isEmpty()) { |
||||
return entities.get(0).getUserName(); |
||||
} |
||||
return ""; |
||||
} |
||||
|
||||
private boolean isLogin(HttpServletRequest request) { |
||||
return LoginService.getInstance().isLogged(request); |
||||
} |
||||
} |
@ -0,0 +1,52 @@
|
||||
package com.fr.plugin.http; |
||||
|
||||
import com.fr.json.JSONObject; |
||||
|
||||
import javax.servlet.http.HttpServletRequest; |
||||
import java.io.BufferedReader; |
||||
import java.io.IOException; |
||||
|
||||
public class HttpUtils { |
||||
public static JSONObject getJSONBody(HttpServletRequest request) throws IOException { |
||||
BufferedReader br = request.getReader(); |
||||
String str; |
||||
StringBuilder wholeStr = new StringBuilder(); |
||||
while ((str = br.readLine()) != null) { |
||||
wholeStr.append(str); |
||||
} |
||||
return new JSONObject(wholeStr.toString()); |
||||
} |
||||
|
||||
public final static String getIpAddress(HttpServletRequest request) throws IOException { |
||||
// 获取请求主机IP地址,如果通过代理进来,则透过防火墙获取真实IP地址
|
||||
String ip = request.getHeader("X-Forwarded-For"); |
||||
|
||||
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { |
||||
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { |
||||
ip = request.getHeader("Proxy-Client-IP"); |
||||
} |
||||
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { |
||||
ip = request.getHeader("WL-Proxy-Client-IP"); |
||||
} |
||||
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { |
||||
ip = request.getHeader("HTTP_CLIENT_IP"); |
||||
} |
||||
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { |
||||
ip = request.getHeader("HTTP_X_FORWARDED_FOR"); |
||||
} |
||||
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { |
||||
ip = request.getRemoteAddr(); |
||||
} |
||||
} else if (ip.length() > 15) { |
||||
String[] ips = ip.split(","); |
||||
for (int index = 0; index < ips.length; index++) { |
||||
String strIp = (String) ips[index]; |
||||
if (! ("unknown".equalsIgnoreCase(strIp))) { |
||||
ip = strIp; |
||||
break; |
||||
} |
||||
} |
||||
} |
||||
return ip; |
||||
} |
||||
} |
@ -0,0 +1,77 @@
|
||||
package com.fr.plugin.http.ip; |
||||
|
||||
import com.fr.decision.fun.impl.BaseHttpHandler; |
||||
import com.fr.json.JSONObject; |
||||
import com.fr.plugin.IPTokenPluginDecisionDBAccessProvider; |
||||
import com.fr.plugin.dao.UserIpRelationDao; |
||||
import com.fr.plugin.entity.UserIpEntity; |
||||
import com.fr.stable.StringUtils; |
||||
import com.fr.stable.db.accessor.DBAccessor; |
||||
import com.fr.third.springframework.web.bind.annotation.RequestMethod; |
||||
import com.fr.web.utils.WebUtils; |
||||
|
||||
import javax.servlet.http.HttpServletRequest; |
||||
import javax.servlet.http.HttpServletResponse; |
||||
import java.io.BufferedReader; |
||||
import java.io.IOException; |
||||
import java.util.UUID; |
||||
|
||||
public class AddApi extends BaseHttpHandler { |
||||
@Override |
||||
public RequestMethod getMethod() { |
||||
return RequestMethod.POST; |
||||
} |
||||
|
||||
@Override |
||||
public String getPath() { |
||||
return "/ip/add"; |
||||
} |
||||
|
||||
@Override |
||||
public boolean isPublic() { |
||||
return false; |
||||
} |
||||
|
||||
@Override |
||||
public void handle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception { |
||||
DBAccessor dbAccessor = IPTokenPluginDecisionDBAccessProvider.getDbAccessor(); |
||||
//通过这两个函数获取的参数可以避免中文乱码和空指针
|
||||
// String parameter = httpServletRequest.getParameter("");
|
||||
// String userName = WebUtils.getHTTPRequestParameter(httpServletRequest, "userName");
|
||||
// String ip = WebUtils.getHTTPRequestParameter(httpServletRequest, "ip");
|
||||
String body = getBody(httpServletRequest);//{"userName":"admin","ip":"123345566"}
|
||||
JSONObject entries = new JSONObject(body); |
||||
|
||||
String userName =entries.getString("userName"); |
||||
String ip =entries.getString("ip"); |
||||
if (StringUtils.isBlank(userName)||StringUtils.isBlank(ip)) { |
||||
JSONObject jsonObject = new JSONObject(); |
||||
jsonObject.put("msg", "user name or ip is black"); |
||||
jsonObject.put("code", -1); |
||||
WebUtils.printAsJSON(httpServletResponse, jsonObject); |
||||
} |
||||
UserIpEntity ipEntity = new UserIpEntity(); |
||||
ipEntity.setUserName(userName); |
||||
ipEntity.setIp(ip); |
||||
ipEntity.setId(UUID.randomUUID().toString()); |
||||
//执行新增操作
|
||||
dbAccessor.runDMLAction(daoContext -> { |
||||
daoContext.getDAO(UserIpRelationDao.class).add(ipEntity); |
||||
return null; |
||||
}); |
||||
JSONObject jsonObject = new JSONObject(); |
||||
jsonObject.put("msg", "success"); |
||||
jsonObject.put("code", 200); |
||||
WebUtils.printAsJSON(httpServletResponse, jsonObject); |
||||
} |
||||
|
||||
String getBody(HttpServletRequest request) throws IOException { |
||||
BufferedReader br = request.getReader(); |
||||
String str; |
||||
StringBuilder wholeStr = new StringBuilder(); |
||||
while((str = br.readLine()) != null){ |
||||
wholeStr.append(str); |
||||
} |
||||
return wholeStr.toString(); |
||||
} |
||||
} |
@ -0,0 +1,60 @@
|
||||
package com.fr.plugin.http.ip; |
||||
|
||||
import com.fr.decision.fun.impl.BaseHttpHandler; |
||||
import com.fr.json.JSONObject; |
||||
import com.fr.plugin.IPTokenPluginDecisionDBAccessProvider; |
||||
import com.fr.plugin.dao.UserIpRelationDao; |
||||
import com.fr.plugin.entity.UserIpEntity; |
||||
import com.fr.plugin.http.HttpUtils; |
||||
import com.fr.stable.db.accessor.DBAccessor; |
||||
import com.fr.stable.query.QueryFactory; |
||||
import com.fr.stable.query.restriction.RestrictionFactory; |
||||
import com.fr.third.springframework.web.bind.annotation.RequestMethod; |
||||
import com.fr.web.utils.WebUtils; |
||||
|
||||
import javax.servlet.http.HttpServletRequest; |
||||
import javax.servlet.http.HttpServletResponse; |
||||
|
||||
public class DelApi extends BaseHttpHandler { |
||||
@Override |
||||
public RequestMethod getMethod() { |
||||
return RequestMethod.DELETE; |
||||
} |
||||
|
||||
@Override |
||||
public String getPath() { |
||||
return "/ip/del"; |
||||
} |
||||
|
||||
@Override |
||||
public boolean isPublic() { |
||||
return false; |
||||
} |
||||
|
||||
@Override |
||||
public void handle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception { |
||||
DBAccessor dbAccessor = IPTokenPluginDecisionDBAccessProvider.getDbAccessor(); |
||||
//通过这两个函数获取的参数可以避免中文乱码和空指针
|
||||
String id = HttpUtils.getJSONBody(httpServletRequest).getString("id"); |
||||
//先查找要更新的用户
|
||||
UserIpEntity entity = dbAccessor.runQueryAction(daoContext -> daoContext.getDAO(UserIpRelationDao.class) |
||||
.findOne(QueryFactory.create().addRestriction(RestrictionFactory.eq("id", id))) |
||||
); |
||||
if (entity != null) { |
||||
dbAccessor.runDMLAction(daoContext -> { |
||||
//执行更新操作
|
||||
daoContext.getDAO(UserIpRelationDao.class).remove(QueryFactory.create().addRestriction(RestrictionFactory.eq("id", id))); |
||||
return null; |
||||
}); |
||||
JSONObject jsonObject = new JSONObject(); |
||||
jsonObject.put("msg", "success"); |
||||
jsonObject.put("code", 200); |
||||
WebUtils.printAsJSON(httpServletResponse, jsonObject); |
||||
} else { |
||||
JSONObject jsonObject = new JSONObject(); |
||||
jsonObject.put("msg", "user not find"); |
||||
jsonObject.put("code", -1); |
||||
WebUtils.printAsJSON(httpServletResponse, jsonObject); |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,53 @@
|
||||
package com.fr.plugin.http.ip; |
||||
|
||||
import com.fr.decision.fun.impl.BaseHttpHandler; |
||||
import com.fr.json.JSONArray; |
||||
import com.fr.plugin.IPTokenPluginDecisionDBAccessProvider; |
||||
import com.fr.plugin.dao.UserIpRelationDao; |
||||
import com.fr.plugin.entity.UserIpEntity; |
||||
import com.fr.stable.StringUtils; |
||||
import com.fr.stable.db.accessor.DBAccessor; |
||||
import com.fr.stable.query.QueryFactory; |
||||
import com.fr.stable.query.condition.QueryCondition; |
||||
import com.fr.stable.query.restriction.RestrictionFactory; |
||||
import com.fr.third.springframework.web.bind.annotation.RequestMethod; |
||||
import com.fr.web.utils.WebUtils; |
||||
|
||||
import javax.servlet.http.HttpServletRequest; |
||||
import javax.servlet.http.HttpServletResponse; |
||||
import java.util.List; |
||||
|
||||
public class ListApi extends BaseHttpHandler { |
||||
@Override |
||||
public RequestMethod getMethod() { |
||||
return RequestMethod.GET; |
||||
} |
||||
|
||||
@Override |
||||
public String getPath() { |
||||
return "/ip/list"; |
||||
} |
||||
|
||||
@Override |
||||
public boolean isPublic() { |
||||
return false; |
||||
} |
||||
|
||||
@Override |
||||
public void handle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception { |
||||
DBAccessor dbAccessor = IPTokenPluginDecisionDBAccessProvider.getDbAccessor(); |
||||
// String userName = httpServletRequest.getParameter("userName");
|
||||
// int page = WebUtils.getHTTPRequestIntParameter(httpServletRequest, "page", 0);
|
||||
List<UserIpEntity> entityList = dbAccessor.runQueryAction(daoContext -> { |
||||
QueryCondition queryCondition = QueryFactory.create(); |
||||
// if (StringUtils.isNotBlank(userName)) {
|
||||
// queryCondition.addRestriction(RestrictionFactory.eq("userName", userName));
|
||||
// }
|
||||
// queryCondition.setSkip(page * 10);
|
||||
List<UserIpEntity> entityList1 = daoContext.getDAO(UserIpRelationDao.class).find(queryCondition); |
||||
return entityList1; |
||||
}); |
||||
JSONArray jsonArray = JSONArray.create(entityList); |
||||
WebUtils.printAsJSON(httpServletResponse, jsonArray); |
||||
} |
||||
} |
@ -0,0 +1,61 @@
|
||||
package com.fr.plugin.http.ip; |
||||
|
||||
import com.fr.decision.fun.impl.BaseHttpHandler; |
||||
import com.fr.json.JSONObject; |
||||
import com.fr.plugin.IPTokenPluginDecisionDBAccessProvider; |
||||
import com.fr.plugin.dao.UserIpRelationDao; |
||||
import com.fr.plugin.entity.UserIpEntity; |
||||
import com.fr.stable.db.accessor.DBAccessor; |
||||
import com.fr.stable.query.QueryFactory; |
||||
import com.fr.stable.query.restriction.RestrictionFactory; |
||||
import com.fr.third.springframework.web.bind.annotation.RequestMethod; |
||||
import com.fr.web.utils.WebUtils; |
||||
|
||||
import javax.servlet.http.HttpServletRequest; |
||||
import javax.servlet.http.HttpServletResponse; |
||||
|
||||
public class ModApi extends BaseHttpHandler { |
||||
@Override |
||||
public RequestMethod getMethod() { |
||||
return null; |
||||
} |
||||
|
||||
@Override |
||||
public String getPath() { |
||||
return "/ip/mod"; |
||||
} |
||||
|
||||
@Override |
||||
public boolean isPublic() { |
||||
return true; |
||||
} |
||||
|
||||
@Override |
||||
public void handle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception { |
||||
DBAccessor dbAccessor = IPTokenPluginDecisionDBAccessProvider.getDbAccessor(); |
||||
//通过这两个函数获取的参数可以避免中文乱码和空指针
|
||||
String userName = WebUtils.getHTTPRequestParameter(httpServletRequest, "userName"); |
||||
String ip = WebUtils.getHTTPRequestParameter(httpServletRequest, "Ip"); |
||||
//先查找要更新的用户
|
||||
UserIpEntity entity = dbAccessor.runQueryAction(daoContext -> daoContext.getDAO(UserIpRelationDao.class) |
||||
.findOne(QueryFactory.create().addRestriction(RestrictionFactory.eq("userName", userName))) |
||||
); |
||||
if (entity != null) { |
||||
entity.setIp(ip); |
||||
dbAccessor.runDMLAction(daoContext -> { |
||||
//执行更新操作
|
||||
daoContext.getDAO(UserIpRelationDao.class).update(entity); |
||||
return null; |
||||
}); |
||||
JSONObject jsonObject = new JSONObject(); |
||||
jsonObject.put("msg", "success"); |
||||
jsonObject.put("code", 200); |
||||
WebUtils.printAsJSON(httpServletResponse, jsonObject); |
||||
} else { |
||||
JSONObject jsonObject = new JSONObject(); |
||||
jsonObject.put("msg", "user not find"); |
||||
jsonObject.put("code", -1); |
||||
WebUtils.printAsJSON(httpServletResponse, jsonObject); |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,54 @@
|
||||
package com.fr.plugin.http.token; |
||||
|
||||
import com.fr.decision.fun.impl.BaseHttpHandler; |
||||
import com.fr.json.JSONObject; |
||||
import com.fr.plugin.IPTokenPluginDecisionDBAccessProvider; |
||||
import com.fr.plugin.dao.UserTokenRelationDao; |
||||
import com.fr.plugin.entity.UserTokenEntity; |
||||
import com.fr.plugin.http.HttpUtils; |
||||
import com.fr.stable.db.accessor.DBAccessor; |
||||
import com.fr.third.springframework.web.bind.annotation.RequestMethod; |
||||
import com.fr.web.utils.WebUtils; |
||||
|
||||
import javax.servlet.http.HttpServletRequest; |
||||
import javax.servlet.http.HttpServletResponse; |
||||
import java.util.UUID; |
||||
|
||||
public class TokenAddApi extends BaseHttpHandler { |
||||
@Override |
||||
public RequestMethod getMethod() { |
||||
return RequestMethod.POST; |
||||
} |
||||
|
||||
@Override |
||||
public String getPath() { |
||||
return "/token/add"; |
||||
} |
||||
|
||||
@Override |
||||
public boolean isPublic() { |
||||
return false; |
||||
} |
||||
|
||||
@Override |
||||
public void handle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception { |
||||
DBAccessor dbAccessor = IPTokenPluginDecisionDBAccessProvider.getDbAccessor(); |
||||
JSONObject jsonBody = HttpUtils.getJSONBody(httpServletRequest); |
||||
String userName =jsonBody.getString("userName"); |
||||
String token =jsonBody.getString("token"); |
||||
//使用配置
|
||||
UserTokenEntity tokenEntity = new UserTokenEntity(); |
||||
tokenEntity.setUserName(userName); |
||||
tokenEntity.setToken(token); |
||||
tokenEntity.setId(UUID.randomUUID().toString()); |
||||
//执行新增操作
|
||||
dbAccessor.runDMLAction(daoContext -> { |
||||
daoContext.getDAO(UserTokenRelationDao.class).add(tokenEntity); |
||||
return null; |
||||
}); |
||||
JSONObject jsonObject = new JSONObject(); |
||||
jsonObject.put("msg", "success"); |
||||
jsonObject.put("code", 200); |
||||
WebUtils.printAsJSON(httpServletResponse, jsonObject); |
||||
} |
||||
} |
@ -0,0 +1,63 @@
|
||||
package com.fr.plugin.http.token; |
||||
|
||||
import com.fr.decision.fun.impl.BaseHttpHandler; |
||||
import com.fr.json.JSONObject; |
||||
import com.fr.plugin.IPTokenPluginDecisionDBAccessProvider; |
||||
import com.fr.plugin.dao.UserIpRelationDao; |
||||
import com.fr.plugin.dao.UserTokenRelationDao; |
||||
import com.fr.plugin.entity.UserIpEntity; |
||||
import com.fr.plugin.entity.UserTokenEntity; |
||||
import com.fr.plugin.http.HttpUtils; |
||||
import com.fr.stable.db.accessor.DBAccessor; |
||||
import com.fr.stable.query.QueryFactory; |
||||
import com.fr.stable.query.restriction.RestrictionFactory; |
||||
import com.fr.third.springframework.web.bind.annotation.RequestMethod; |
||||
import com.fr.web.utils.WebUtils; |
||||
|
||||
import javax.servlet.http.HttpServletRequest; |
||||
import javax.servlet.http.HttpServletResponse; |
||||
|
||||
public class TokenDelApi extends BaseHttpHandler { |
||||
@Override |
||||
public RequestMethod getMethod() { |
||||
return RequestMethod.DELETE; |
||||
} |
||||
|
||||
@Override |
||||
public String getPath() { |
||||
return "/token/del"; |
||||
} |
||||
|
||||
@Override |
||||
public boolean isPublic() { |
||||
return false; |
||||
} |
||||
|
||||
@Override |
||||
public void handle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception { |
||||
DBAccessor dbAccessor = IPTokenPluginDecisionDBAccessProvider.getDbAccessor(); |
||||
//通过这两个函数获取的参数可以避免中文乱码和空指针
|
||||
JSONObject jsonBody = HttpUtils.getJSONBody(httpServletRequest); |
||||
String id =jsonBody.getString("id"); |
||||
//先查找要更新的用户
|
||||
UserTokenEntity entity = dbAccessor.runQueryAction(daoContext -> daoContext.getDAO(UserTokenRelationDao.class) |
||||
.findOne(QueryFactory.create().addRestriction(RestrictionFactory.eq("id", id))) |
||||
); |
||||
if (entity != null) { |
||||
dbAccessor.runDMLAction(daoContext -> { |
||||
//执行更新操作
|
||||
daoContext.getDAO(UserIpRelationDao.class).remove(QueryFactory.create().addRestriction(RestrictionFactory.eq("id", id))); |
||||
return null; |
||||
}); |
||||
JSONObject jsonObject = new JSONObject(); |
||||
jsonObject.put("msg", "success"); |
||||
jsonObject.put("code", 200); |
||||
WebUtils.printAsJSON(httpServletResponse, jsonObject); |
||||
} else { |
||||
JSONObject jsonObject = new JSONObject(); |
||||
jsonObject.put("msg", "Token not find"); |
||||
jsonObject.put("code", -1); |
||||
WebUtils.printAsJSON(httpServletResponse, jsonObject); |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,53 @@
|
||||
package com.fr.plugin.http.token; |
||||
|
||||
import com.fr.decision.fun.impl.BaseHttpHandler; |
||||
import com.fr.json.JSONArray; |
||||
import com.fr.plugin.IPTokenPluginDecisionDBAccessProvider; |
||||
import com.fr.plugin.dao.UserIpRelationDao; |
||||
import com.fr.plugin.dao.UserTokenRelationDao; |
||||
import com.fr.plugin.entity.UserIpEntity; |
||||
import com.fr.plugin.entity.UserTokenEntity; |
||||
import com.fr.stable.StringUtils; |
||||
import com.fr.stable.db.accessor.DBAccessor; |
||||
import com.fr.stable.query.QueryFactory; |
||||
import com.fr.stable.query.condition.QueryCondition; |
||||
import com.fr.stable.query.restriction.RestrictionFactory; |
||||
import com.fr.third.springframework.web.bind.annotation.RequestMethod; |
||||
import com.fr.web.utils.WebUtils; |
||||
|
||||
import javax.servlet.http.HttpServletRequest; |
||||
import javax.servlet.http.HttpServletResponse; |
||||
import java.util.List; |
||||
|
||||
public class TokenListApi extends BaseHttpHandler { |
||||
@Override |
||||
public RequestMethod getMethod() { |
||||
return RequestMethod.GET; |
||||
} |
||||
|
||||
@Override |
||||
public String getPath() { |
||||
return "/token/list"; |
||||
} |
||||
|
||||
@Override |
||||
public boolean isPublic() { |
||||
return false; |
||||
} |
||||
|
||||
@Override |
||||
public void handle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception { |
||||
DBAccessor dbAccessor = IPTokenPluginDecisionDBAccessProvider.getDbAccessor(); |
||||
String userName = httpServletRequest.getParameter("userName"); |
||||
List<UserTokenEntity> entityList = dbAccessor.runQueryAction(daoContext -> { |
||||
QueryCondition queryCondition = QueryFactory.create(); |
||||
if (StringUtils.isNotBlank(userName)) { |
||||
queryCondition.addRestriction(RestrictionFactory.eq("userName", userName)); |
||||
} |
||||
List<UserTokenEntity> entityList1 = daoContext.getDAO(UserTokenRelationDao.class).find(queryCondition); |
||||
return entityList1; |
||||
}); |
||||
JSONArray jsonArray = JSONArray.create(entityList); |
||||
WebUtils.printAsJSON(httpServletResponse, jsonArray); |
||||
} |
||||
} |
@ -0,0 +1,64 @@
|
||||
package com.fr.plugin.http.token; |
||||
|
||||
import com.fr.decision.fun.impl.BaseHttpHandler; |
||||
import com.fr.json.JSONObject; |
||||
import com.fr.plugin.IPTokenPluginDecisionDBAccessProvider; |
||||
import com.fr.plugin.dao.UserIpRelationDao; |
||||
import com.fr.plugin.dao.UserTokenRelationDao; |
||||
import com.fr.plugin.entity.UserTokenEntity; |
||||
import com.fr.plugin.http.HttpUtils; |
||||
import com.fr.stable.db.accessor.DBAccessor; |
||||
import com.fr.stable.query.QueryFactory; |
||||
import com.fr.stable.query.restriction.RestrictionFactory; |
||||
import com.fr.third.springframework.web.bind.annotation.RequestMethod; |
||||
import com.fr.web.utils.WebUtils; |
||||
|
||||
import javax.servlet.http.HttpServletRequest; |
||||
import javax.servlet.http.HttpServletResponse; |
||||
|
||||
public class TokenModApi extends BaseHttpHandler { |
||||
@Override |
||||
public RequestMethod getMethod() { |
||||
return RequestMethod.PUT; |
||||
} |
||||
|
||||
@Override |
||||
public String getPath() { |
||||
return "/token/mod"; |
||||
} |
||||
|
||||
@Override |
||||
public boolean isPublic() { |
||||
return false; |
||||
} |
||||
|
||||
@Override |
||||
public void handle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception { |
||||
DBAccessor dbAccessor = IPTokenPluginDecisionDBAccessProvider.getDbAccessor(); |
||||
//通过这两个函数获取的参数可以避免中文乱码和空指针
|
||||
JSONObject jsonBody = HttpUtils.getJSONBody(httpServletRequest); |
||||
String userName =jsonBody.getString("userName"); |
||||
String token =jsonBody.getString("token"); |
||||
//先查找要更新的用户
|
||||
UserTokenEntity entity = dbAccessor.runQueryAction(daoContext -> daoContext.getDAO(UserTokenRelationDao.class) |
||||
.findOne(QueryFactory.create().addRestriction(RestrictionFactory.eq("userName", userName))) |
||||
); |
||||
if (entity != null) { |
||||
entity.setToken(token); |
||||
dbAccessor.runDMLAction(daoContext -> { |
||||
//执行更新操作
|
||||
daoContext.getDAO(UserTokenRelationDao.class).update(entity); |
||||
return null; |
||||
}); |
||||
JSONObject jsonObject = new JSONObject(); |
||||
jsonObject.put("msg", "success"); |
||||
jsonObject.put("code", 200); |
||||
WebUtils.printAsJSON(httpServletResponse, jsonObject); |
||||
} else { |
||||
JSONObject jsonObject = new JSONObject(); |
||||
jsonObject.put("msg", "user not find"); |
||||
jsonObject.put("code", -1); |
||||
WebUtils.printAsJSON(httpServletResponse, jsonObject); |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,117 @@
|
||||
!(function () { |
||||
//这个菜单是配置ip关系的
|
||||
// 对应ppt的注册菜单3
|
||||
BI.config("dec.constant.system.tabs", function (items) { |
||||
items.push({ |
||||
value: "ipToken", |
||||
text: BI.i18nText("Ip配置"), // 文字
|
||||
cardType: "dec.management.ipConfig" |
||||
}); |
||||
return items; |
||||
}); |
||||
// 示例,向menus中加入百度搜索按钮. ppt的注册菜单1
|
||||
BI.config("dec.constant.menu.items", function (items) { |
||||
items.push({ |
||||
value: "baidu", |
||||
text: BI.i18nText("百度一下"), |
||||
cardType:{ |
||||
src:"http://baidu.com" |
||||
}, |
||||
cls: "analysis-menu-font" |
||||
}); |
||||
return items; |
||||
}); |
||||
debugger |
||||
//这个是从系统自己实现的中拷贝出来的,进行了一点修改
|
||||
function resolvePath(path, isPublic) { |
||||
if (!path || path[0] !== '/') { |
||||
path = '/' + path; |
||||
} |
||||
return isPublic === true |
||||
? '/plugin/public/com.fr.plugin.7.mix.project' + path |
||||
: '/plugin/private/com.fr.plugin.7.mix.project' + path; |
||||
} |
||||
// 组件实现,效果为使用绝对布局组件放置了一个iframe
|
||||
var ipConfig = BI.inherit(BI.Widget, { |
||||
props: { |
||||
baseCls: "ipConfig" |
||||
}, |
||||
render: function () { |
||||
var self = this; |
||||
return { |
||||
type: "bi.absolute", |
||||
items: [ |
||||
{ |
||||
el: { |
||||
type: "bi.button", |
||||
text: "添加", |
||||
handler: function () { |
||||
var id = "addUserPane" |
||||
var that = this; |
||||
//参考:https://fanruan.design/doc.html?post=df052e5842
|
||||
BI.Popovers.create(id, { |
||||
type: "bi.bar_popover", |
||||
header: "添加ip限制", |
||||
size: "small", |
||||
body: { |
||||
type: "bi.add.userTokenOrIp", |
||||
cType:"ip", |
||||
ref: function (e) { |
||||
that.userIpPane = e; |
||||
} |
||||
}, |
||||
listeners: [{ |
||||
eventName: "EVENT_CANCEL", |
||||
action: function () { |
||||
BI.Msg.toast("点击了取消") |
||||
} |
||||
}, { |
||||
eventName: "EVENT_CONFIRM", |
||||
action: function () { |
||||
var params = that.userIpPane.getValue(); |
||||
console.info(params) |
||||
Dec.reqPost(resolvePath("/ip/add", false), { |
||||
userName: params.userName, |
||||
ip:params.params2 |
||||
}, function () { |
||||
BI.Msg.toast("保存成功") |
||||
self.tableRef.reload(); |
||||
}) |
||||
} |
||||
}] |
||||
}).open(id); |
||||
} |
||||
}, |
||||
top: 0, |
||||
left: 0, |
||||
}, |
||||
{ |
||||
el: { |
||||
type: "bi.button", |
||||
text: "刷新", |
||||
handler: function () { |
||||
self.tableRef.reload(); |
||||
} |
||||
}, |
||||
top: 0, |
||||
left: 100, |
||||
}, |
||||
{ |
||||
el: { |
||||
type: "dec.management.iptoken.table", |
||||
tableType:"ipTable", |
||||
ref: function (e) { |
||||
self.tableRef = e; |
||||
} |
||||
}, |
||||
top: 40, |
||||
left: 0, |
||||
right: 0, |
||||
bottom: 0 |
||||
} |
||||
] |
||||
}; |
||||
} |
||||
}); |
||||
BI.shortcut("dec.management.ipConfig", ipConfig); |
||||
}()); |
@ -0,0 +1,115 @@
|
||||
;(function () { |
||||
var IpHeader = [[{ |
||||
text: "id", |
||||
}, { |
||||
text: "用户名", |
||||
}, { |
||||
text: "IP", |
||||
}, { |
||||
text: "操作" |
||||
}]]; |
||||
|
||||
var TokenHeader = [[{ |
||||
text: "id", |
||||
}, { |
||||
text: "用户名", |
||||
}, { |
||||
text: "Token", |
||||
}, { |
||||
text: "操作" |
||||
}]]; |
||||
function resolvePath(path, isPublic) { |
||||
if (!path || path[0] !== '/') { |
||||
path = '/' + path; |
||||
} |
||||
return isPublic === true |
||||
? '/plugin/public/com.fr.plugin.7.mix.project' + path |
||||
: '/plugin/private/com.fr.plugin.7.mix.project' + path; |
||||
} |
||||
|
||||
var IPAndTokenTable = BI.inherit(BI.Widget, { |
||||
props: { |
||||
baseCls: "iptoken-table", |
||||
tableType:"ipTable" |
||||
}, |
||||
beforeInit: function (render) { |
||||
//根据组件生命周期,在这个环境初始化组件需要的第一页数据
|
||||
var that=this; |
||||
this.getData( function (data){ |
||||
that.allData =data; |
||||
render(); |
||||
}) |
||||
}, |
||||
getData: function ( callBack) { |
||||
var that = this; |
||||
var url="/token/list"; |
||||
if(this.options.tableType === "ipTable"){ |
||||
url="/ip/list" |
||||
} |
||||
//Dec下一共有reqGet,Post,Put,Delete,Patch和后台RequestMethod对应
|
||||
Dec.reqGet( |
||||
resolvePath(url, false)//第一个参数是要访问的地址
|
||||
, {}//第二个参数是请求参数
|
||||
, function (data) { //第三个参数是回调成功
|
||||
// debugger
|
||||
var tempData = BI.map(data, function (i, v) { |
||||
return BI.map(v, function (ii, vv) { |
||||
return { |
||||
text: vv, |
||||
whiteSpace: "normal" |
||||
} |
||||
}) |
||||
}); |
||||
debugger |
||||
BI.each(tempData, function (i, v) { |
||||
v.push({ |
||||
type: "bi.button", |
||||
text: "删除", |
||||
handler: function (){ |
||||
var id=v[0].text; |
||||
var url="/token/del"; |
||||
if(that.options.tableType === "ipTable"){ |
||||
url="/ip/del" |
||||
} |
||||
Dec.reqDelete(resolvePath(url,false),{ |
||||
id:id |
||||
},function (){ |
||||
that.reload(); |
||||
}) |
||||
} |
||||
}) |
||||
}); |
||||
callBack(tempData); |
||||
}); |
||||
//还有一个complete 参数一共4个
|
||||
}, |
||||
reload: function () { |
||||
var that=this; |
||||
this.getData(function (data){ |
||||
that.tableIns.populate(data) |
||||
}) |
||||
}, |
||||
render: function () { |
||||
var that = this; |
||||
var header=TokenHeader; |
||||
if(this.options.tableType === "ipTable"){ |
||||
header=IpHeader; |
||||
} |
||||
return { |
||||
//table_view参考 https://fanruan.design/doc.html?post=5c39511444
|
||||
type: "bi.table_view", |
||||
width: 600, |
||||
height: 400, |
||||
ref: function (e) { |
||||
that.tableIns = e; |
||||
}, |
||||
minColumnSize: [100, 100, 100], |
||||
columnSize: [100, 100, 100], |
||||
regionColumnSize: [300, "fill"], |
||||
items: this.allData, |
||||
header: header, |
||||
} |
||||
} |
||||
}); |
||||
BI.shortcut("dec.management.iptoken.table", IPAndTokenTable); |
||||
})(); |
@ -0,0 +1,109 @@
|
||||
!(function () { |
||||
|
||||
// 关联wiki:https://wiki.fanruan.com/pages/viewpage.action?pageId=20021612
|
||||
// 特别注意,此配置需要配合服务端SystemOptionProvider接口使用,不然会因无权限而不显示节点.
|
||||
BI.config("dec.constant.management.navigation", function (items) { |
||||
items.push({ |
||||
value: "iptoekn", // 地址栏显示的hash值
|
||||
id: "ipToken-1", // id 这个和java类中的IpTokenOptionProvider 的id要一致
|
||||
text: BI.i18nText("Token关系配置"), // 文字
|
||||
cardType: "dec.management.tokenConfig", // 组件的shortcut,适用于用fineui开发的页面.
|
||||
cls: "management-directory-font" // 图标类名
|
||||
}); |
||||
return items; |
||||
}); |
||||
|
||||
|
||||
function resolvePath(path, isPublic) { |
||||
if (!path || path[0] !== '/') { |
||||
path = '/' + path; |
||||
} |
||||
return isPublic === true |
||||
? '/plugin/public/com.fr.plugin.7.mix.project' + path |
||||
: '/plugin/private/com.fr.plugin.7.mix.project' + path; |
||||
} |
||||
|
||||
// 组件实现,效果为使用绝对布局组件放置了一个iframe
|
||||
var tokenConfig = BI.inherit(BI.Widget, { |
||||
props: { |
||||
baseCls: "tokenConfig" |
||||
}, |
||||
render: function () { |
||||
var self = this; |
||||
return { |
||||
type: "bi.absolute", |
||||
items: [ |
||||
{ |
||||
el: { |
||||
type: "bi.button", |
||||
text: "添加", |
||||
handler: function () { |
||||
var id = "addUserPane" |
||||
var that = this; |
||||
//参考:https://fanruan.design/doc.html?post=df052e5842
|
||||
BI.Popovers.create(id, { |
||||
type: "bi.bar_popover", |
||||
header: "添加用户Token关联", |
||||
size: "small", |
||||
body: { |
||||
type: "bi.add.userTokenOrIp", |
||||
cType:"token", |
||||
ref: function (e) { |
||||
that.userIpPane = e; |
||||
} |
||||
}, |
||||
listeners: [{ |
||||
eventName: "EVENT_CANCEL", |
||||
action: function () { |
||||
BI.Msg.toast("点击了取消") |
||||
} |
||||
}, { |
||||
eventName: "EVENT_CONFIRM", |
||||
action: function () { |
||||
var params = that.userIpPane.getValue(); |
||||
console.info(params) |
||||
Dec.reqPost(resolvePath("/token/add", false), { |
||||
userName: params.userName, |
||||
token:params.params2 |
||||
}, function () { |
||||
BI.Msg.toast("保存成功") |
||||
self.tableRef.reload(); |
||||
}) |
||||
} |
||||
}] |
||||
}).open(id); |
||||
} |
||||
}, |
||||
top: 0, |
||||
left: 0, |
||||
}, |
||||
{ |
||||
el: { |
||||
type: "bi.button", |
||||
text: "刷新", |
||||
handler: function () { |
||||
self.tableRef.reload(); |
||||
} |
||||
}, |
||||
top: 0, |
||||
left: 100, |
||||
}, |
||||
{ |
||||
el: { |
||||
type: "dec.management.iptoken.table", |
||||
tableType:"tokenTable", |
||||
ref: function (e) { |
||||
self.tableRef = e; |
||||
} |
||||
}, |
||||
top: 40, |
||||
left: 0, |
||||
right: 0, |
||||
bottom: 0 |
||||
} |
||||
] |
||||
}; |
||||
} |
||||
}); |
||||
BI.shortcut("dec.management.tokenConfig", tokenConfig); |
||||
}()); |
@ -0,0 +1,74 @@
|
||||
;(function () { |
||||
|
||||
|
||||
function resolvePath(path, isPublic) { |
||||
if (!path || path[0] !== '/') { |
||||
path = '/' + path; |
||||
} |
||||
return isPublic === true |
||||
? '/plugin/public/com.fr.plugin.7.mix.project' + path |
||||
: '/plugin/private/com.fr.plugin.7.mix.project' + path; |
||||
} |
||||
|
||||
var IPTokenEditorPane = BI.inherit(BI.Widget, { |
||||
props: { |
||||
baseCls: "iptoken-table", |
||||
cType: "token",//可能有token 或者 ip两种
|
||||
}, |
||||
getValue: function () { |
||||
return { |
||||
userName:this.inputUserName.getValue(), |
||||
params2:this.inputIPOrToken.getValue() |
||||
} |
||||
}, |
||||
render: function () { |
||||
var that = this; |
||||
var inputIPORTokenText="请输入ip" |
||||
if (this.options.cType === "token") { |
||||
inputIPORTokenText="请输入Token" |
||||
} |
||||
return { |
||||
type: "bi.vtape", |
||||
vgap: 10, |
||||
height: 200, |
||||
items: [ |
||||
{ |
||||
height: 20, |
||||
type: "bi.horizontal_adapt", |
||||
columnSize: [140, "fill"], |
||||
items: [{ |
||||
type: "bi.label", |
||||
text: "输入用户名:", |
||||
}, { |
||||
type: "bi.text_editor", |
||||
watermark: "这个不允许为空", |
||||
allowBlank: false, |
||||
ref:function (e){ |
||||
that.inputUserName=e; |
||||
}, |
||||
errorText: "非空!", |
||||
}] |
||||
}, |
||||
{ |
||||
height: 20, |
||||
type: "bi.horizontal_adapt", |
||||
columnSize: [140, "fill"], |
||||
items: [{ |
||||
type: "bi.label", |
||||
text: inputIPORTokenText, |
||||
}, { |
||||
type: "bi.text_editor", |
||||
watermark: "这个不允许为空", |
||||
allowBlank: false, |
||||
ref:function (e){ |
||||
that.inputIPOrToken=e; |
||||
}, |
||||
errorText: "非空!", |
||||
}] |
||||
} |
||||
] |
||||
} |
||||
} |
||||
}); |
||||
BI.shortcut("bi.add.userTokenOrIp", IPTokenEditorPane); |
||||
})(); |
Loading…
Reference in new issue