diff --git a/src/main/java/com/fanruan/api/decision/CommonKit.java b/src/main/java/com/fanruan/api/decision/CommonKit.java
new file mode 100644
index 0000000..a0c49a7
--- /dev/null
+++ b/src/main/java/com/fanruan/api/decision/CommonKit.java
@@ -0,0 +1,54 @@
+package com.fanruan.api.decision;
+
+import com.fanruan.api.log.LogKit;
+import com.fanruan.api.util.StringKit;
+import com.fr.base.Base64;
+import com.fr.base.ServerConfig;
+import com.fr.decision.webservice.utils.DecisionServiceConstants;
+import com.fr.stable.StringUtils;
+
+/**
+ * @author richie
+ * @version 10.0
+ * Created by richie on 2019-09-19
+ * 常规工具类
+ */
+public class CommonKit {
+
+    /**
+     * 这个方法用于判断从前端返回服务器端的密码是否有被修改过
+     *
+     * @param password 从前端返回的密码文本
+     * @return 如果密码没有被修改过就返回true,否则就返回false
+     */
+    public static boolean isDefaultPasswordHolderString(String password) {
+        return DecisionServiceConstants.DEFAULT_PASSWORD.equals(password);
+    }
+
+    /**
+     * 获取默认密码占位符
+     *
+     * @return 默认密码占位符
+     */
+    public static String fetchDefaultPasswordHolderString() {
+        return DecisionServiceConstants.DEFAULT_PASSWORD;
+    }
+
+    /**
+     * 将base64编码的字符串转为常规的字符串
+     *
+     * @param encodeStr base64编码的字符串
+     * @return 常规字符串
+     */
+    public static String getBase64DecodeStr(String encodeStr) {
+        try {
+            if (StringUtils.isNotEmpty(encodeStr)) {
+                return new String(Base64.decode(encodeStr), ServerConfig.getInstance().getServerCharset());
+            }
+        } catch (Exception e) {
+            LogKit.error(e.getMessage(), e);
+        }
+
+        return StringKit.EMPTY;
+    }
+}
diff --git a/src/main/java/com/fanruan/api/decision/UserKit.java b/src/main/java/com/fanruan/api/decision/UserKit.java
new file mode 100644
index 0000000..323d6b4
--- /dev/null
+++ b/src/main/java/com/fanruan/api/decision/UserKit.java
@@ -0,0 +1,39 @@
+package com.fanruan.api.decision;
+
+import com.fanruan.api.decision.middle.ReadOnlyUser;
+import com.fr.decision.authority.data.User;
+import com.fr.decision.webservice.utils.UserSourceFactory;
+import com.fr.decision.webservice.utils.user.source.UserSource;
+import com.fr.decision.webservice.v10.user.UserService;
+
+/**
+ * @author richie
+ * @version 10.0
+ * Created by richie on 2019-09-19
+ */
+public class UserKit {
+
+    /**
+     * 根据用户名获取这个用户的来源
+     *
+     * @param username 用户名
+     * @return 用户来源
+     * @throws Exception 如果在获取用户的过程中出错了,则抛出此异常
+     */
+    public static UserSource fetchUserSource(String username) throws Exception {
+        User user = UserService.getInstance().getUserByUserName(username);
+        return UserSourceFactory.getInstance().getUserSource(user);
+    }
+
+    /**
+     * 根据用户名获取用户信息
+     *
+     * @param username 用户名
+     * @return 用户信息
+     * @throws Exception 如果获取用户出错,则抛出此异常
+     */
+    public static ReadOnlyUser getReadOnlyUser(String username) throws Exception {
+        User user = UserService.getInstance().getUserByUserName(username);
+        return ReadOnlyUser.build(user.getUserName(), user.getPassword(), user.getRealName());
+    }
+}
diff --git a/src/main/java/com/fanruan/api/decision/auth/BasePassport.java b/src/main/java/com/fanruan/api/decision/auth/BasePassport.java
new file mode 100644
index 0000000..e0e8aea
--- /dev/null
+++ b/src/main/java/com/fanruan/api/decision/auth/BasePassport.java
@@ -0,0 +1,25 @@
+package com.fanruan.api.decision.auth;
+
+import com.fr.decision.authorize.impl.AbstractPassport;
+
+/**
+ * @author richie
+ * @version 10.0
+ * Created by richie on 2019-09-19
+ * 认证方式
+ */
+public abstract class BasePassport extends AbstractPassport {
+
+    /**
+     * 检查登录信息是否有效
+     *
+     * @param username      用户名
+     * @param inputPassword 输入的密码
+     * @param savedPassword 配置文件中保存的密码
+     * @param hashPassword  哈希后的密码
+     * @return 登录凭证是有效的则返回true,否则返回false
+     */
+    public boolean checkTicket(String username, String inputPassword, String savedPassword, String hashPassword) {
+        return false;
+    }
+}
diff --git a/src/main/java/com/fanruan/api/decision/auth/bean/BasePassportBean.java b/src/main/java/com/fanruan/api/decision/auth/bean/BasePassportBean.java
new file mode 100644
index 0000000..e8b8b91
--- /dev/null
+++ b/src/main/java/com/fanruan/api/decision/auth/bean/BasePassportBean.java
@@ -0,0 +1,40 @@
+package com.fanruan.api.decision.auth.bean;
+
+import com.fr.decision.authorize.Passport;
+import com.fr.decision.webservice.bean.authentication.PassportBean;
+import com.fr.third.fasterxml.jackson.annotation.JsonTypeInfo;
+
+/**
+ * @author richie
+ * @version 10.0
+ * Created by richie on 2019-09-19
+ * 用于表示不同认证方式的接口
+ */
+@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, include = JsonTypeInfo.As.PROPERTY, property = "@class")
+public abstract class BasePassportBean<T extends Passport> extends PassportBean<T> {
+
+    /**
+     * 用于标记认证类型的字符串
+     *
+     * @return 字符串
+     */
+    @Override
+    public abstract String markType();
+
+    /**
+     * 根据配置对象生成认证配置数据层对象
+     *
+     * @param t 配置对象
+     * @return 配属数据层
+     */
+    @Override
+    public abstract BasePassportBean<T> createPassportBean(T t);
+
+    /**
+     * 生成配置对象
+     *
+     * @return 配置
+     */
+    @Override
+    public abstract Passport createPassport();
+}
diff --git a/src/main/java/com/fanruan/api/login/LoginKit.java b/src/main/java/com/fanruan/api/decision/login/LoginKit.java
similarity index 75%
rename from src/main/java/com/fanruan/api/login/LoginKit.java
rename to src/main/java/com/fanruan/api/decision/login/LoginKit.java
index be128c1..620c2a2 100644
--- a/src/main/java/com/fanruan/api/login/LoginKit.java
+++ b/src/main/java/com/fanruan/api/decision/login/LoginKit.java
@@ -1,4 +1,4 @@
-package com.fanruan.api.login;
+package com.fanruan.api.decision.login;
 
 import com.fr.decision.authorize.Passport;
 import com.fr.decision.authorize.impl.HttpPassport;
@@ -14,14 +14,27 @@ public class LoginKit {
 
     /**
      * 获取决策平台设置的认证类型
+     *
      * @return 认证对象
      */
     public static Passport getCurrentPassport() {
         return FSConfig.getInstance().getPassport();
     }
 
+    /**
+     * 获取指定类型的通行证,如果不存在,就返回null
+     *
+     * @param type 通行证类型
+     * @param <T>  类型
+     * @return 通行证
+     */
+    public static <T> T getPassport(Class<? extends T> type) {
+        return FSConfig.getInstance().getPassport(type);
+    }
+
     /**
      * 获取http认证的地址
+     *
      * @return http认证地址
      */
     public static @Nullable String getHttpPassportUrl() {
@@ -34,6 +47,7 @@ public class LoginKit {
 
     /**
      * 获取http认证的秘钥
+     *
      * @return http认证地址
      */
     public static @Nullable String getHttpPassportKey() {
diff --git a/src/main/java/com/fanruan/api/decision/middle/ReadOnlyUser.java b/src/main/java/com/fanruan/api/decision/middle/ReadOnlyUser.java
new file mode 100644
index 0000000..0c1321d
--- /dev/null
+++ b/src/main/java/com/fanruan/api/decision/middle/ReadOnlyUser.java
@@ -0,0 +1,45 @@
+package com.fanruan.api.decision.middle;
+
+/**
+ * @author richie
+ * @version 10.0
+ * Created by richie on 2019-09-19
+ */
+public class ReadOnlyUser {
+
+    /**
+     * 非空项,无默认值
+     */
+    private String userName = null;
+    /**
+     * 非空项,无默认值
+     */
+    private String password = null;
+
+    /**
+     * 姓名
+     */
+    private String realName = null;
+
+    public static ReadOnlyUser build(String userName, String password, String realName) {
+        return new ReadOnlyUser(userName, password, realName);
+    }
+
+    private ReadOnlyUser(String userName, String password, String realName) {
+        this.userName = userName;
+        this.password = password;
+        this.realName = realName;
+    }
+
+    public String getUserName() {
+        return userName;
+    }
+
+    public String getPassword() {
+        return password;
+    }
+
+    public String getRealName() {
+        return realName;
+    }
+}
diff --git a/src/main/java/com/fanruan/api/runtime/ResourceKit.java b/src/main/java/com/fanruan/api/runtime/ResourceKit.java
new file mode 100644
index 0000000..3bb638e
--- /dev/null
+++ b/src/main/java/com/fanruan/api/runtime/ResourceKit.java
@@ -0,0 +1,219 @@
+package com.fanruan.api.runtime;
+
+import com.fr.io.utils.ResourceIOUtils;
+import com.fr.stable.Filter;
+
+import java.io.IOException;
+import java.io.InputStream;
+
+/**
+ * @author richie
+ * @version 10.0
+ * Created by richie on 2019-09-19
+ * 操作运行环境下文件的工具方法
+ */
+public class ResourceKit {
+
+    /**
+     * 路径是否存在
+     *
+     * @param target 路径
+     * @return 是否存在
+     */
+    public static boolean exist(String target) {
+        return ResourceIOUtils.exist(target);
+    }
+
+    /**
+     * 创建文件
+     *
+     * @param file 文件路径
+     * @return 是否存在
+     */
+    public static boolean createFile(String file) {
+        return ResourceIOUtils.createFile(file);
+    }
+
+    /**
+     * 创建文件夹
+     *
+     * @param dir 文件夹路径
+     * @return 是否成功
+     */
+    public static boolean createDirectory(String dir) {
+        return ResourceIOUtils.createDirectory(dir);
+    }
+
+    /**
+     * 是否为文件夹
+     *
+     * @param path 路径
+     * @return 是否是文件夹
+     */
+    public static boolean isDirectory(String path) {
+        return ResourceIOUtils.isDirectory(path);
+    }
+
+    /**
+     * 获取文件或者文件夹的名称
+     *
+     * @param path 路径
+     * @return 名称
+     */
+    public static String getName(String path) {
+        return ResourceIOUtils.getName(path);
+    }
+
+    /**
+     * 列出路径下的所有内容的名称
+     *
+     * @param dir 路径
+     * @return 所有内容名称List
+     */
+    public static String[] list(String dir) {
+        return ResourceIOUtils.list(dir);
+    }
+
+    /**
+     * 列出路径下的所有符合要求的内容的名称
+     *
+     * @param dir    路径
+     * @param filter 过滤器
+     * @return 所有内容名称List
+     */
+    public static String[] list(String dir, Filter<String> filter) {
+        return ResourceIOUtils.list(dir, filter);
+    }
+
+    /**
+     * 文件夹是否存在
+     *
+     * @param dir 文件夹
+     * @return 是否存在
+     */
+    public static boolean isDirectoryExist(String dir) {
+        return ResourceIOUtils.isDirectoryExist(dir);
+    }
+
+
+    public static String getRealPath(String relativePath) {
+        return ResourceIOUtils.getRealPath(relativePath);
+    }
+
+    /**
+     * 读取文件到流
+     * <p>
+     * 相对路径下如果是仓库资源从仓库读取,其它从本地读取
+     * <p>
+     * 据对路径按绝对路径读
+     *
+     * @param path 路径
+     * @return 流
+     */
+    public static InputStream read(String path) {
+        return ResourceIOUtils.read(path);
+    }
+
+    /**
+     * 读取文件到bytes
+     *
+     * @param path 文件路径
+     * @return bytes
+     */
+    public static byte[] readBytes(String path) {
+        return ResourceIOUtils.readBytes(path);
+    }
+
+    /**
+     * 写入数据流到文件
+     *
+     * @param path 文件路径
+     * @param data 数据
+     */
+    public static void write(String path, InputStream data) {
+        ResourceIOUtils.write(path, data);
+    }
+
+    /**
+     * 写入字符串数据到文件
+     *
+     * @param path 文件路径
+     * @param data 数据
+     */
+    public static void write(String path, String data) {
+        ResourceIOUtils.write(path, data);
+    }
+
+    /**
+     * 写入字节数组数据到文件
+     *
+     * @param path 文件路径
+     * @param data 数据
+     */
+    public static void write(String path, byte[] data) {
+        ResourceIOUtils.write(path, data);
+    }
+
+    /**
+     * 获取父路径
+     *
+     * @param path 路径
+     * @return 父路径
+     */
+    public static String getParent(String path) {
+        return ResourceIOUtils.getParent(path);
+    }
+
+    /**
+     * 从仓库删除
+     *
+     * @param path 路径
+     * @return 是否删除成功
+     */
+    public static boolean delete(String path) {
+        return ResourceIOUtils.delete(path);
+    }
+
+    /**
+     * 文件的最后修改时间
+     *
+     * @param path 文件路径
+     * @return 修改的时间戳
+     */
+    public static long lastModified(String path) {
+        return ResourceIOUtils.lastModified(path);
+    }
+
+    /**
+     * 文件大小
+     *
+     * @param path 文件路径
+     * @return 文件字节数
+     */
+    public static long getLength(String path) {
+        return ResourceIOUtils.getLength(path);
+    }
+
+    /**
+     * 重命名
+     * <p>
+     * 文件位置根据oldFile来确定
+     *
+     * @param oldFile 原文件path
+     * @param newFile 新文件path
+     * @return 是否成功
+     */
+    public static boolean renameTo(String oldFile, String newFile) {
+        return ResourceIOUtils.renameTo(oldFile, newFile);
+    }
+
+    /**
+     * 拷贝文件到某目录下
+     *
+     * @param src 源文件
+     * @param dir 目标文件
+     */
+    public static void copy(String src, String dir) throws IOException {
+        ResourceIOUtils.copy(src, dir);
+    }
+}