操作员、角色、功能表等
diff --git a/build.gradle b/build.gradle
index 85ae14b..c2dbbbc 100644
--- a/build.gradle
+++ b/build.gradle
@@ -39,6 +39,7 @@
     implementation 'org.postgresql:postgresql:42.2.5'
     implementation 'com.jcabi:jcabi-manifests:1.1'
     implementation 'org.bitbucket.b_c:jose4j:0.6.3'
+    implementation 'org.springframework.social:spring-social-web:1.1.6.RELEASE'
     implementation group: 'com.google.code.gson', name: 'gson', version: '2.8.5'
     implementation group: 'com.sun.jersey', name: 'jersey-client', version: '1.19'
     implementation group: 'javax.servlet', name: 'jstl', version: '1.2'
diff --git a/src/main/java/com/supwisdom/dlpay/framework/dao/FunctionDao.java b/src/main/java/com/supwisdom/dlpay/framework/dao/FunctionDao.java
new file mode 100644
index 0000000..d846c25
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/framework/dao/FunctionDao.java
@@ -0,0 +1,9 @@
+package com.supwisdom.dlpay.framework.dao;
+
+import com.supwisdom.dlpay.framework.domain.TFunction;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.stereotype.Repository;
+
+@Repository
+public interface FunctionDao extends JpaRepository<TFunction, String> {
+}
diff --git a/src/main/java/com/supwisdom/dlpay/framework/dao/OperRoleDao.java b/src/main/java/com/supwisdom/dlpay/framework/dao/OperRoleDao.java
new file mode 100644
index 0000000..72dc37a
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/framework/dao/OperRoleDao.java
@@ -0,0 +1,15 @@
+package com.supwisdom.dlpay.framework.dao;
+
+import com.supwisdom.dlpay.framework.domain.TOperRole;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+
+@Repository
+public interface OperRoleDao extends JpaRepository<TOperRole, String> {
+
+  @Query(value = "select distinct role_code from TB_OPER_ROLE a,TB_ROLE b where a.role_id=b.role_id and a.operid=?1", nativeQuery = true)
+  List<String> getRolecodeByOperid(String operid);
+}
diff --git a/src/main/java/com/supwisdom/dlpay/framework/dao/OperatorDao.java b/src/main/java/com/supwisdom/dlpay/framework/dao/OperatorDao.java
new file mode 100644
index 0000000..da67163
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/framework/dao/OperatorDao.java
@@ -0,0 +1,10 @@
+package com.supwisdom.dlpay.framework.dao;
+
+import com.supwisdom.dlpay.framework.domain.TOperator;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.stereotype.Repository;
+
+@Repository
+public interface OperatorDao extends JpaRepository<TOperator, String> {
+  TOperator findByOpercode(String opercode);
+}
diff --git a/src/main/java/com/supwisdom/dlpay/framework/dao/ResourceDao.java b/src/main/java/com/supwisdom/dlpay/framework/dao/ResourceDao.java
new file mode 100644
index 0000000..b1a04a7
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/framework/dao/ResourceDao.java
@@ -0,0 +1,9 @@
+package com.supwisdom.dlpay.framework.dao;
+
+import com.supwisdom.dlpay.framework.domain.TResource;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.stereotype.Repository;
+
+@Repository
+public interface ResourceDao extends JpaRepository<TResource, String> {
+}
diff --git a/src/main/java/com/supwisdom/dlpay/framework/dao/RoleDao.java b/src/main/java/com/supwisdom/dlpay/framework/dao/RoleDao.java
new file mode 100644
index 0000000..25eee0d
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/framework/dao/RoleDao.java
@@ -0,0 +1,9 @@
+package com.supwisdom.dlpay.framework.dao;
+
+import com.supwisdom.dlpay.framework.domain.TRole;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.stereotype.Repository;
+
+@Repository
+public interface RoleDao extends JpaRepository<TRole, String> {
+}
diff --git a/src/main/java/com/supwisdom/dlpay/framework/domain/TFunction.java b/src/main/java/com/supwisdom/dlpay/framework/domain/TFunction.java
new file mode 100644
index 0000000..7ccab75
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/framework/domain/TFunction.java
@@ -0,0 +1,100 @@
+package com.supwisdom.dlpay.framework.domain;
+
+import org.hibernate.annotations.GenericGenerator;
+
+import javax.persistence.*;
+
+@Entity
+@Table(name = "TB_FUNCTION")
+public class TFunction {
+  @Id
+  @GenericGenerator(name = "idGenerator", strategy = "uuid")
+  @GeneratedValue(generator = "idGenerator")
+  @Column(name="ID", nullable = false, length = 32)
+  private String id;
+
+  @Column(name="PARENT_ID", length = 32)
+  private String parentId;
+
+  @Column(name="NAME", length = 32)
+  private String name;
+
+  @Column(name="MENU_URL", nullable = false, length = 60)
+  private String menuUrl; //菜单url
+
+  @Column(name="IS_LEAF", nullable = false, precision = 1)
+  private Integer isLeaf;
+
+  @Column(name="ORDER_NUM", precision = 9)
+  private Integer orderNum;
+
+  @Column(name="CREATETIME", length = 14)
+  private String createtime;
+
+  @Column(name="LASTSAVED", length = 14)
+  private String lastsaved;
+
+  public String getId() {
+    return id;
+  }
+
+  public void setId(String id) {
+    this.id = id;
+  }
+
+  public String getParentId() {
+    return parentId;
+  }
+
+  public void setParentId(String parentId) {
+    this.parentId = parentId;
+  }
+
+  public String getName() {
+    return name;
+  }
+
+  public void setName(String name) {
+    this.name = name;
+  }
+
+  public String getMenuUrl() {
+    return menuUrl;
+  }
+
+  public void setMenuUrl(String menuUrl) {
+    this.menuUrl = menuUrl;
+  }
+
+  public Integer getIsLeaf() {
+    return isLeaf;
+  }
+
+  public void setIsLeaf(Integer isLeaf) {
+    this.isLeaf = isLeaf;
+  }
+
+  public Integer getOrderNum() {
+    return orderNum;
+  }
+
+  public void setOrderNum(Integer orderNum) {
+    this.orderNum = orderNum;
+  }
+
+  public String getCreatetime() {
+    return createtime;
+  }
+
+  public void setCreatetime(String createtime) {
+    this.createtime = createtime;
+  }
+
+  public String getLastsaved() {
+    return lastsaved;
+  }
+
+  public void setLastsaved(String lastsaved) {
+    this.lastsaved = lastsaved;
+  }
+}
diff --git a/src/main/java/com/supwisdom/dlpay/framework/domain/TOperRole.java b/src/main/java/com/supwisdom/dlpay/framework/domain/TOperRole.java
new file mode 100644
index 0000000..f889fac
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/framework/domain/TOperRole.java
@@ -0,0 +1,45 @@
+package com.supwisdom.dlpay.framework.domain;
+
+import org.hibernate.annotations.GenericGenerator;
+
+import javax.persistence.*;
+
+@Entity
+@Table(name = "TB_OPER_ROLE")
+public class TOperRole {
+  @Id
+  @GenericGenerator(name = "idGenerator", strategy = "uuid")
+  @GeneratedValue(generator = "idGenerator")
+  @Column(name="ID", nullable = false, length = 32)
+  private String id;
+
+  @Column(name="ROLE_ID", nullable = false, length = 32)
+  private String roleId;
+
+  @Column(name="OPERID", nullable = false, length = 32)
+  private String operid;
+
+  public String getId() {
+    return id;
+  }
+
+  public void setId(String id) {
+    this.id = id;
+  }
+
+  public String getRoleId() {
+    return roleId;
+  }
+
+  public void setRoleId(String roleId) {
+    this.roleId = roleId;
+  }
+
+  public String getOperid() {
+    return operid;
+  }
+
+  public void setOperid(String operid) {
+    this.operid = operid;
+  }
+}
diff --git a/src/main/java/com/supwisdom/dlpay/framework/domain/TOperator.java b/src/main/java/com/supwisdom/dlpay/framework/domain/TOperator.java
new file mode 100644
index 0000000..1da944b
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/framework/domain/TOperator.java
@@ -0,0 +1,146 @@
+package com.supwisdom.dlpay.framework.domain;
+
+import com.supwisdom.dlpay.framework.util.TradeDict;
+import org.hibernate.annotations.GenericGenerator;
+import org.springframework.security.core.GrantedAuthority;
+import org.springframework.security.core.userdetails.UserDetails;
+
+import javax.persistence.*;
+import java.util.Collection;
+
+@Entity
+@Table(name = "TB_OPERATOR")
+public class TOperator implements UserDetails {
+  @Id
+  @GenericGenerator(name = "idGenerator", strategy = "uuid")
+  @GeneratedValue(generator = "idGenerator")
+  @Column(name="OPERID", nullable = false, length = 32)
+  private String operid;
+
+  @Column(name="OPERCODE", nullable = false, length = 20)
+  private String opercode;
+
+  @Column(name="OPERTYPE", nullable = false, length = 20)
+  private String opertype;
+
+  @Column(name="OPERNAME", nullable = false, length = 100)
+  private String opername;
+
+  @Column(name="OPERPWD", nullable = false, length = 32)
+  private String operpwd;
+
+  @Column(name="STATUS", nullable = false, length = 32)
+  private String status;
+
+  @Column(name="OPENDATE", length = 8)
+  private String opendate;
+
+  @Column(name="CLOSEDATE", length = 8)
+  private String closedate;
+
+  @Transient
+  private Collection<? extends GrantedAuthority> authorities;  //权限
+
+  public String getOperid() {
+    return operid;
+  }
+
+  public void setOperid(String operid) {
+    this.operid = operid;
+  }
+
+  public String getOpercode() {
+    return opercode;
+  }
+
+  public void setOpercode(String opercode) {
+    this.opercode = opercode;
+  }
+
+  public String getOpertype() {
+    return opertype;
+  }
+
+  public void setOpertype(String opertype) {
+    this.opertype = opertype;
+  }
+
+  public String getOpername() {
+    return opername;
+  }
+
+  public void setOpername(String opername) {
+    this.opername = opername;
+  }
+
+  public String getOperpwd() {
+    return operpwd;
+  }
+
+  public void setOperpwd(String operpwd) {
+    this.operpwd = operpwd;
+  }
+
+  public String getStatus() {
+    return status;
+  }
+
+  public void setStatus(String status) {
+    this.status = status;
+  }
+
+  public String getOpendate() {
+    return opendate;
+  }
+
+  public void setOpendate(String opendate) {
+    this.opendate = opendate;
+  }
+
+  public String getClosedate() {
+    return closedate;
+  }
+
+  public void setClosedate(String closedate) {
+    this.closedate = closedate;
+  }
+
+  public void setAuthorities(Collection<? extends GrantedAuthority> authorities) {
+    this.authorities = authorities;
+  }
+
+  @Override
+  public Collection<? extends GrantedAuthority> getAuthorities() {
+    return this.authorities;
+  }
+
+  @Override
+  public String getPassword() {
+    return this.operpwd;
+  }
+
+  @Override
+  public String getUsername() {
+    return this.opercode;
+  }
+
+  @Override
+  public boolean isAccountNonExpired() {
+    return true; //账户不会过期
+  }
+
+  @Override
+  public boolean isAccountNonLocked() {
+    return !TradeDict.STATUS_LOCKED.equals(this.status); //true - 没锁定
+  }
+
+  @Override
+  public boolean isCredentialsNonExpired() {
+    return true; //TODO:密码是否未过期
+  }
+
+  @Override
+  public boolean isEnabled() {
+    return !TradeDict.STATUS_CLOSED.equals(this.status);  //注销操作员不启用
+  }
+}
diff --git a/src/main/java/com/supwisdom/dlpay/framework/domain/TResource.java b/src/main/java/com/supwisdom/dlpay/framework/domain/TResource.java
new file mode 100644
index 0000000..889eaca
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/framework/domain/TResource.java
@@ -0,0 +1,66 @@
+package com.supwisdom.dlpay.framework.domain;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Table;
+
+@Entity
+@Table(name = "TB_RESOURCE")
+public class TResource {
+  @Id
+  @Column(name = "ID", nullable = false, length = 32)
+  private String id;
+
+  @Column(name = "CODE", nullable = false, length = 32)
+  private String code;
+
+  @Column(name = "NAME", length = 32)
+  private String name;
+
+  @Column(name = "URI", length = 32)
+  private String uri;
+
+  @Column(name = "FUNCTION_ID", nullable = false, length = 32)
+  private String functionId;
+
+  public String getId() {
+    return id;
+  }
+
+  public void setId(String id) {
+    this.id = id;
+  }
+
+  public String getCode() {
+    return code;
+  }
+
+  public void setCode(String code) {
+    this.code = code;
+  }
+
+  public String getName() {
+    return name;
+  }
+
+  public void setName(String name) {
+    this.name = name;
+  }
+
+  public String getUri() {
+    return uri;
+  }
+
+  public void setUri(String uri) {
+    this.uri = uri;
+  }
+
+  public String getFunctionId() {
+    return functionId;
+  }
+
+  public void setFunctionId(String functionId) {
+    this.functionId = functionId;
+  }
+}
diff --git a/src/main/java/com/supwisdom/dlpay/framework/domain/TRole.java b/src/main/java/com/supwisdom/dlpay/framework/domain/TRole.java
new file mode 100644
index 0000000..6be9d78
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/framework/domain/TRole.java
@@ -0,0 +1,89 @@
+package com.supwisdom.dlpay.framework.domain;
+
+import org.hibernate.annotations.GenericGenerator;
+
+import javax.persistence.*;
+
+@Entity
+@Table(name = "TB_ROLE")
+public class TRole {
+  @Id
+  @GenericGenerator(name = "idGenerator", strategy = "uuid")
+  @GeneratedValue(generator = "idGenerator")
+  @Column(name="ROLE_ID", nullable = false, length = 32)
+  private String roleId;
+
+  @Column(name="ROLE_NAME", nullable = false, length = 60)
+  private String roleName;
+
+  @Column(name="ROLE_CODE", nullable = false, length = 20)
+  private String roleCode;
+
+  @Column(name="ROLE_DESC", length = 60)
+  private String roleDesc;
+
+  @Column(name="EDITFLAG", length = 60)
+  private Integer editflag;
+
+  @Column(name="CREATETIME", length = 14)
+  private String createtime;
+
+  @Column(name="LASTSAVED", length = 14)
+  private String lastsaved;
+
+  public String getRoleId() {
+    return roleId;
+  }
+
+  public void setRoleId(String roleId) {
+    this.roleId = roleId;
+  }
+
+  public String getRoleName() {
+    return roleName;
+  }
+
+  public void setRoleName(String roleName) {
+    this.roleName = roleName;
+  }
+
+  public String getRoleCode() {
+    return roleCode;
+  }
+
+  public void setRoleCode(String roleCode) {
+    this.roleCode = roleCode;
+  }
+
+  public String getRoleDesc() {
+    return roleDesc;
+  }
+
+  public void setRoleDesc(String roleDesc) {
+    this.roleDesc = roleDesc;
+  }
+
+  public Integer getEditflag() {
+    return editflag;
+  }
+
+  public void setEditflag(Integer editflag) {
+    this.editflag = editflag;
+  }
+
+  public String getCreatetime() {
+    return createtime;
+  }
+
+  public void setCreatetime(String createtime) {
+    this.createtime = createtime;
+  }
+
+  public String getLastsaved() {
+    return lastsaved;
+  }
+
+  public void setLastsaved(String lastsaved) {
+    this.lastsaved = lastsaved;
+  }
+}
diff --git a/src/main/java/com/supwisdom/dlpay/framework/filter/ValidateCodeFilter.java b/src/main/java/com/supwisdom/dlpay/framework/filter/ValidateCodeFilter.java
index e4e7afb..fd8c4d1 100755
--- a/src/main/java/com/supwisdom/dlpay/framework/filter/ValidateCodeFilter.java
+++ b/src/main/java/com/supwisdom/dlpay/framework/filter/ValidateCodeFilter.java
@@ -4,6 +4,7 @@
 import com.supwisdom.dlpay.exception.ValidateCodeException;

 import com.supwisdom.dlpay.framework.security.validate.ImageCode;

 import com.supwisdom.dlpay.framework.security.validate.ImageCodeUtil;

+import com.supwisdom.dlpay.framework.security.validate.VerifyCode;

 import com.supwisdom.dlpay.framework.util.StringUtil;

 import org.springframework.beans.factory.InitializingBean;

 import org.springframework.beans.factory.annotation.Autowired;

@@ -51,7 +52,7 @@
 	}

 

 	private void validate(HttpServletRequest request) throws ValidateCodeException {

-		ImageCode imageCode = (ImageCode) request.getSession().getAttribute(ImageCodeUtil.LOGIN_IMAGECODE_SESSIONKEY);

+		VerifyCode imageCode = (VerifyCode) request.getSession().getAttribute(ImageCodeUtil.LOGIN_IMAGECODE_SESSIONKEY);

 		String inputCode;

 		try {

 			inputCode = request.getParameter("imageCode");

@@ -64,11 +65,11 @@
 		if (null == imageCode) {

 			throw new ValidateCodeException("验证码不存在");

 		}

-		if (imageCode.isExpried()) {

+		if (imageCode.isExpired()) {

 			request.getSession().removeAttribute(ImageCodeUtil.LOGIN_IMAGECODE_SESSIONKEY);

 			throw new ValidateCodeException("验证码已过期");

 		}

-		if (!StringUtil.equalsIgnoreCase(imageCode.getCode(), inputCode)) {

+		if (!StringUtil.equalsIgnoreCase(imageCode.getText(), inputCode)) {

 			throw new ValidateCodeException("验证码不匹配");

 		}

 		request.getSession().removeAttribute(ImageCodeUtil.LOGIN_IMAGECODE_SESSIONKEY);

diff --git a/src/main/java/com/supwisdom/dlpay/framework/security/validate/ImageCodeUtil.java b/src/main/java/com/supwisdom/dlpay/framework/security/validate/ImageCodeUtil.java
index 19fd80a..0a105b9 100644
--- a/src/main/java/com/supwisdom/dlpay/framework/security/validate/ImageCodeUtil.java
+++ b/src/main/java/com/supwisdom/dlpay/framework/security/validate/ImageCodeUtil.java
@@ -1,7 +1,5 @@
 package com.supwisdom.dlpay.framework.security.validate;
 
-import org.springframework.web.context.request.ServletWebRequest;
-
 import javax.servlet.http.HttpServletRequest;
 import java.awt.*;
 import java.awt.image.BufferedImage;
diff --git a/src/main/java/com/supwisdom/dlpay/framework/security/validate/ValidateCode.java b/src/main/java/com/supwisdom/dlpay/framework/security/validate/ValidateCode.java
index a26f63f..b20eca2 100755
--- a/src/main/java/com/supwisdom/dlpay/framework/security/validate/ValidateCode.java
+++ b/src/main/java/com/supwisdom/dlpay/framework/security/validate/ValidateCode.java
@@ -44,7 +44,7 @@
 	}

 

 	@JsonIgnore

-	public boolean isExpried() {

+	public boolean isExpired() {

 		return new Date().compareTo(expireTime) > 0;

 	}

 

diff --git a/src/main/java/com/supwisdom/dlpay/framework/security/validate/VerifyCode.java b/src/main/java/com/supwisdom/dlpay/framework/security/validate/VerifyCode.java
new file mode 100644
index 0000000..30f368a
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/framework/security/validate/VerifyCode.java
@@ -0,0 +1,123 @@
+package com.supwisdom.dlpay.framework.security.validate;
+
+import javax.imageio.ImageIO;
+import java.awt.*;
+import java.awt.image.BufferedImage;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.time.LocalDateTime;
+import java.util.Random;
+
+public class VerifyCode {
+  private int w = 70;
+  private int h = 35;
+  private Random r = new Random();
+  // {"宋体", "华文楷体", "黑体", "华文新魏", "华文隶书", "微软雅黑", "楷体_GB2312"}
+  private String[] fontNames  = {"宋体", "华文楷体", "黑体", "微软雅黑", "楷体_GB2312"};
+  // 可选字符
+  private String codes  = "0123456789abcdefghjkmnopqrstuvwxyzABCDEFGHJKMNPQRSTUVWXYZ";
+  // 背景色
+  private Color bgColor  = new Color(255, 255, 255);
+  // 验证码上的文本
+  private String text ;
+
+  public VerifyCode() {
+  }
+  public VerifyCode(LocalDateTime localDateTime) {
+    this.localDateTime = localDateTime;
+  }
+  public VerifyCode(int second) {
+    // 多少秒后
+    this.localDateTime = LocalDateTime.now().plusSeconds(second);
+  }
+
+
+  //过期时间
+  private LocalDateTime localDateTime;
+  // 生成随机的颜色
+  private Color randomColor () {
+    int red = r.nextInt(150);
+    int green = r.nextInt(150);
+    int blue = r.nextInt(150);
+    return new Color(red, green, blue);
+  }
+
+  // 生成随机的字体
+  private Font randomFont () {
+    int index = r.nextInt(fontNames.length);
+    String fontName = fontNames[index];//生成随机的字体名称
+    int style = r.nextInt(4);//生成随机的样式, 0(无样式), 1(粗体), 2(斜体), 3(粗体+斜体)
+    int size = r.nextInt(5) + 24; //生成随机字号, 24 ~ 28
+    return new Font(fontName, style, size);
+  }
+
+  // 画干扰线
+  private void drawLine (BufferedImage image) {
+    int num  = 3;//一共画3条
+    Graphics2D g2 = (Graphics2D)image.getGraphics();
+    for(int i = 0; i < num; i++) {//生成两个点的坐标,即4个值
+      int x1 = r.nextInt(w);
+      int y1 = r.nextInt(h);
+      int x2 = r.nextInt(w);
+      int y2 = r.nextInt(h);
+      g2.setStroke(new BasicStroke(1.5F));
+      g2.setColor(Color.BLUE); //干扰线是蓝色
+      g2.drawLine(x1, y1, x2, y2);//画线
+    }
+  }
+
+  // 随机生成一个字符
+  private char randomChar () {
+    int index = r.nextInt(codes.length());
+    return codes.charAt(index);
+  }
+
+  // 创建BufferedImage
+  private BufferedImage createImage () {
+    BufferedImage image = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
+    Graphics2D g2 = (Graphics2D)image.getGraphics();
+    g2.setColor(this.bgColor);
+    g2.fillRect(0, 0, w, h);
+    return image;
+  }
+
+  // 调用这个方法得到验证码
+  public BufferedImage getImage () {
+    BufferedImage image = createImage();//创建图片缓冲区
+    Graphics2D g2 = (Graphics2D)image.getGraphics();//得到绘制环境
+    StringBuilder sb = new StringBuilder();//用来装载生成的验证码文本
+    // 向图片中画4个字符
+    for(int i = 0; i < 4; i++)  {//循环四次,每次生成一个字符
+      String s = randomChar() + "";//随机生成一个字母
+      sb.append(s); //把字母添加到sb中
+      float x = i * 1.0F * w / 4; //设置当前字符的x轴坐标
+      g2.setFont(randomFont()); //设置随机字体
+      g2.setColor(randomColor()); //设置随机颜色
+      g2.drawString(s, x, h-5); //画图
+    }
+    this.text = sb.toString(); //把生成的字符串赋给了this.text
+    drawLine(image); //添加干扰线
+    return image;
+  }
+
+  // 返回验证码图片上的文本
+  public String getText () {
+    return text;
+  }
+
+  // 保存图片到指定的输出流
+  public static void output (BufferedImage image, OutputStream out)
+      throws IOException {
+    ImageIO.write(image, "JPEG", out);
+  }
+  public LocalDateTime getLocalDateTime() {
+    return localDateTime;
+  }
+
+  public void setLocalDateTime(LocalDateTime localDateTime) {
+    this.localDateTime = localDateTime;
+  }
+  public boolean isExpired(){
+    return LocalDateTime.now().isAfter(localDateTime);
+  }
+}
diff --git a/src/main/java/com/supwisdom/dlpay/framework/service/OperatorDetailService.java b/src/main/java/com/supwisdom/dlpay/framework/service/OperatorDetailService.java
new file mode 100644
index 0000000..bf72bfe
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/framework/service/OperatorDetailService.java
@@ -0,0 +1,6 @@
+package com.supwisdom.dlpay.framework.service;
+
+import org.springframework.security.core.userdetails.UserDetailsService;
+
+public interface OperatorDetailService extends UserDetailsService {
+}
diff --git a/src/main/java/com/supwisdom/dlpay/framework/service/impl/OperatorDetailServiceImpl.java b/src/main/java/com/supwisdom/dlpay/framework/service/impl/OperatorDetailServiceImpl.java
new file mode 100644
index 0000000..755828d
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/framework/service/impl/OperatorDetailServiceImpl.java
@@ -0,0 +1,42 @@
+package com.supwisdom.dlpay.framework.service.impl;
+
+import com.supwisdom.dlpay.framework.dao.OperRoleDao;
+import com.supwisdom.dlpay.framework.dao.OperatorDao;
+import com.supwisdom.dlpay.framework.domain.TOperator;
+import com.supwisdom.dlpay.framework.service.OperatorDetailService;
+import com.supwisdom.dlpay.framework.util.StringUtil;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.core.GrantedAuthority;
+import org.springframework.security.core.authority.AuthorityUtils;
+import org.springframework.security.core.userdetails.UserDetails;
+import org.springframework.security.core.userdetails.UsernameNotFoundException;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+
+@Service
+public class OperatorDetailServiceImpl implements OperatorDetailService {
+  @Autowired
+  private OperatorDao operatorDao;
+  @Autowired
+  private OperRoleDao operRoleDao;
+
+  @Override
+  public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
+    TOperator oper = operatorDao.findByOpercode(username);
+    if (null == oper) {
+      throw new UsernameNotFoundException("管理员不存在");
+    }
+    Collection<GrantedAuthority> authorities = new ArrayList<GrantedAuthority>() {
+    };
+
+    List<String> roles = operRoleDao.getRolecodeByOperid(oper.getOperid());
+    if (!StringUtil.isEmpty(roles)) {
+      authorities = AuthorityUtils.createAuthorityList(roles.toArray(new String[0]));
+    }
+    oper.setAuthorities(authorities);
+    return oper;
+  }
+}
diff --git a/src/main/kotlin/com/supwisdom/dlpay/DlpayApplication.kt b/src/main/kotlin/com/supwisdom/dlpay/DlpayApplication.kt
index 9befb05..c13dae9 100644
--- a/src/main/kotlin/com/supwisdom/dlpay/DlpayApplication.kt
+++ b/src/main/kotlin/com/supwisdom/dlpay/DlpayApplication.kt
@@ -1,5 +1,6 @@
 package com.supwisdom.dlpay
 
+import com.supwisdom.dlpay.framework.filter.ValidateCodeFilter
 import com.supwisdom.dlpay.framework.security.MyAuthenticationFailureHandler
 import com.supwisdom.dlpay.framework.security.MyAuthenticationSuccessHandler
 import io.lettuce.core.ReadFrom
@@ -27,6 +28,7 @@
 import org.springframework.security.provisioning.InMemoryUserDetailsManager
 import org.springframework.security.web.authentication.AuthenticationFailureHandler
 import org.springframework.security.web.authentication.logout.CookieClearingLogoutHandler
+import javax.servlet.Filter
 
 
 @Configuration
diff --git a/src/main/kotlin/com/supwisdom/dlpay/framework/controller/security_controller.kt b/src/main/kotlin/com/supwisdom/dlpay/framework/controller/security_controller.kt
index 8c39312..e776623 100644
--- a/src/main/kotlin/com/supwisdom/dlpay/framework/controller/security_controller.kt
+++ b/src/main/kotlin/com/supwisdom/dlpay/framework/controller/security_controller.kt
@@ -6,14 +6,17 @@
 import com.supwisdom.dlpay.framework.domain.AppClientRedis
 import com.supwisdom.dlpay.framework.redisrepo.AppClientRepository
 import com.supwisdom.dlpay.framework.security.validate.ImageCodeUtil
+import com.supwisdom.dlpay.framework.security.validate.VerifyCode
 import com.supwisdom.dlpay.framework.service.SystemUtilService
 import com.supwisdom.dlpay.framework.util.HmacUtil
 import org.springframework.beans.factory.annotation.Autowired
 import org.springframework.http.ResponseEntity
+import org.springframework.social.connect.web.HttpSessionSessionStrategy
 import org.springframework.stereotype.Controller
 import org.springframework.web.bind.annotation.GetMapping
 import org.springframework.web.bind.annotation.RequestMapping
 import org.springframework.web.bind.annotation.RestController
+import org.springframework.web.context.request.ServletWebRequest
 import java.util.*
 import javax.imageio.ImageIO
 import javax.servlet.http.HttpServletRequest
@@ -99,16 +102,19 @@
 class ValidateCodeController{
 
     @GetMapping("/code/image")
-    fun createCode(request: HttpServletRequest,response: HttpServletResponse){
-        val imageCode = ImageCodeUtil.generate(request)
-        request.getSession(true).setAttribute(ImageCodeUtil.LOGIN_IMAGECODE_SESSIONKEY,imageCode)
-        ImageIO.write(imageCode.image,"JPEG", response.outputStream)
+    fun createCode(request: HttpServletRequest, response: HttpServletResponse) {
+        val imageCode = VerifyCode(60)
+        HttpSessionSessionStrategy().setAttribute(ServletWebRequest(request), ImageCodeUtil.LOGIN_IMAGECODE_SESSIONKEY, imageCode)
+        ImageIO.write(imageCode.image, "JPEG", response.outputStream)
     }
 }
 
 @Controller
 class WebHomeController {
 
+    @GetMapping("/{index}")
+    fun homeView() = "index"
+
     @GetMapping("/login")
     fun loginView() = "login"
 }
\ No newline at end of file