+ * + *
+ * + * @author cyw + * @since 2021-02-03 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("org_user") +public class OrgUser implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId("id") + private String id; + + /** + * 部门ID + */ + @TableField("org_id") + private String orgId; + + /** + * 用户ID + */ + @TableField("user_id") + private String userId; + + +} diff --git a/fit2cloud-commons/fit2cloud-common-auth/src/main/java/com/fit2cloud/commons/auth/entity/Organization.java b/fit2cloud-commons/fit2cloud-common-auth/src/main/java/com/fit2cloud/commons/auth/entity/Organization.java new file mode 100644 index 0000000000..9a884542d0 --- /dev/null +++ b/fit2cloud-commons/fit2cloud-common-auth/src/main/java/com/fit2cloud/commons/auth/entity/Organization.java @@ -0,0 +1,62 @@ +package com.fit2cloud.commons.auth.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableField; +import java.io.Serializable; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + *+ * + *
+ * + * @author cyw + * @since 2021-02-03 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("organization") +public class Organization implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId("id") + private String id; + + /** + * 部门名称 + */ + @TableField("name") + private String name; + + /** + * 描述 + */ + @TableField("description") + private String description; + + /** + * 上级部门ID + */ + @TableField("pid") + private Integer pid; + + /** + * 部门级别 + */ + @TableField("level") + private Integer level; + + /** + * 创建时间 + */ + @TableField("create_time") + private Long createTime; + + +} diff --git a/fit2cloud-commons/fit2cloud-common-auth/src/main/java/com/fit2cloud/commons/auth/entity/Permission.java b/fit2cloud-commons/fit2cloud-common-auth/src/main/java/com/fit2cloud/commons/auth/entity/Permission.java new file mode 100644 index 0000000000..6844b5cfeb --- /dev/null +++ b/fit2cloud-commons/fit2cloud-common-auth/src/main/java/com/fit2cloud/commons/auth/entity/Permission.java @@ -0,0 +1,50 @@ +package com.fit2cloud.commons.auth.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableField; +import java.io.Serializable; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + *+ * + *
+ * + * @author cyw + * @since 2021-02-03 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("permission") +public class Permission implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId("id") + private String id; + + /** + * 类型 + */ + @TableField("type") + private String type; + + /** + * 关联ID + */ + @TableField("relation_id") + private String relationId; + + /** + * 资源ID + */ + @TableField("resource_id") + private String resourceId; + + +} diff --git a/fit2cloud-commons/fit2cloud-common-auth/src/main/java/com/fit2cloud/commons/auth/entity/Resource.java b/fit2cloud-commons/fit2cloud-common-auth/src/main/java/com/fit2cloud/commons/auth/entity/Resource.java new file mode 100644 index 0000000000..f4fcddca18 --- /dev/null +++ b/fit2cloud-commons/fit2cloud-common-auth/src/main/java/com/fit2cloud/commons/auth/entity/Resource.java @@ -0,0 +1,62 @@ +package com.fit2cloud.commons.auth.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableField; +import java.io.Serializable; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + *+ * + *
+ * + * @author cyw + * @since 2021-02-03 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("resource") +public class Resource implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId("id") + private String id; + + /** + * 资源名称 + */ + @TableField("name") + private String name; + + /** + * 资源描述 + */ + @TableField("desc") + private String desc; + + /** + * 资源类型 + */ + @TableField("type") + private String type; + + /** + * 资源地址 + */ + @TableField("url") + private String url; + + /** + * 创建时间 + */ + @TableField("create_time") + private Long createTime; + + +} diff --git a/fit2cloud-commons/fit2cloud-common-auth/src/main/java/com/fit2cloud/commons/auth/entity/Role.java b/fit2cloud-commons/fit2cloud-common-auth/src/main/java/com/fit2cloud/commons/auth/entity/Role.java new file mode 100644 index 0000000000..5779f62d83 --- /dev/null +++ b/fit2cloud-commons/fit2cloud-common-auth/src/main/java/com/fit2cloud/commons/auth/entity/Role.java @@ -0,0 +1,50 @@ +package com.fit2cloud.commons.auth.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableField; +import java.io.Serializable; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + *+ * + *
+ * + * @author cyw + * @since 2021-02-03 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("role") +public class Role implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 角色ID + */ + @TableId("id") + private String id; + + /** + * 角色名称 + */ + @TableField("name") + private String name; + + /** + * 角色类型 + */ + @TableField("type") + private String type; + + /** + * 描述 + */ + @TableField("description") + private String description; + + +} diff --git a/fit2cloud-commons/fit2cloud-common-auth/src/main/java/com/fit2cloud/commons/auth/entity/RoleUser.java b/fit2cloud-commons/fit2cloud-common-auth/src/main/java/com/fit2cloud/commons/auth/entity/RoleUser.java new file mode 100644 index 0000000000..19d54ecd54 --- /dev/null +++ b/fit2cloud-commons/fit2cloud-common-auth/src/main/java/com/fit2cloud/commons/auth/entity/RoleUser.java @@ -0,0 +1,44 @@ +package com.fit2cloud.commons.auth.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableField; +import java.io.Serializable; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + *+ * + *
+ * + * @author cyw + * @since 2021-02-03 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("role_user") +public class RoleUser implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId("id") + private String id; + + /** + * 角色ID + */ + @TableField("role_id") + private String roleId; + + /** + * 用户ID + */ + @TableField("user_id") + private String userId; + + +} diff --git a/fit2cloud-commons/fit2cloud-common-auth/src/main/java/com/fit2cloud/commons/auth/entity/User.java b/fit2cloud-commons/fit2cloud-common-auth/src/main/java/com/fit2cloud/commons/auth/entity/User.java new file mode 100644 index 0000000000..9a15992eef --- /dev/null +++ b/fit2cloud-commons/fit2cloud-common-auth/src/main/java/com/fit2cloud/commons/auth/entity/User.java @@ -0,0 +1,68 @@ +package com.fit2cloud.commons.auth.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableField; +import java.io.Serializable; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + *+ * + *
+ * + * @author cyw + * @since 2021-02-03 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("user") +public class User implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId("user_id") + private String userId; + + /** + * 姓名 + */ + @TableField("user_name") + private String userName; + + /** + * 密码 + */ + @TableField("password") + private String password; + + /** + * 是否有效 + */ + @TableField("valid") + private Boolean valid; + + /** + * 电话号码 + */ + @TableField("phone_number") + private Integer phoneNumber; + + /** + * 邮箱 + */ + @TableField("email") + private String email; + + /** + * 创建时间 + */ + @TableField("create_time") + private Long createTime; + + +} diff --git a/fit2cloud-commons/fit2cloud-common-auth/src/main/java/com/fit2cloud/commons/auth/filter/F2CLogoutFilter.java b/fit2cloud-commons/fit2cloud-common-auth/src/main/java/com/fit2cloud/commons/auth/filter/F2CLogoutFilter.java new file mode 100644 index 0000000000..433d8995ce --- /dev/null +++ b/fit2cloud-commons/fit2cloud-common-auth/src/main/java/com/fit2cloud/commons/auth/filter/F2CLogoutFilter.java @@ -0,0 +1,27 @@ +package com.fit2cloud.commons.auth.filter; + +import org.apache.shiro.subject.Subject; +import org.apache.shiro.web.filter.authc.LogoutFilter; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; + +public class F2CLogoutFilter extends LogoutFilter { + + private static final Logger logger = LoggerFactory.getLogger(F2CLogoutFilter.class); + + + @Override + protected boolean preHandle(ServletRequest request, ServletResponse response) throws Exception { + Subject subject = getSubject(request, response); + try { + subject.logout(); + } catch (Exception ex) { + logger.error("退出登录错误",ex); + } + return true; + } + +} diff --git a/fit2cloud-commons/fit2cloud-common-auth/src/main/java/com/fit2cloud/commons/auth/filter/F2CPermissionsFilter.java b/fit2cloud-commons/fit2cloud-common-auth/src/main/java/com/fit2cloud/commons/auth/filter/F2CPermissionsFilter.java new file mode 100644 index 0000000000..3877d5d68c --- /dev/null +++ b/fit2cloud-commons/fit2cloud-common-auth/src/main/java/com/fit2cloud/commons/auth/filter/F2CPermissionsFilter.java @@ -0,0 +1,30 @@ +package com.fit2cloud.commons.auth.filter; + +import org.apache.shiro.subject.Subject; +import org.apache.shiro.web.filter.authz.PermissionsAuthorizationFilter; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; +import java.io.IOException; + +public class F2CPermissionsFilter extends PermissionsAuthorizationFilter { + + @Override + public boolean isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue) throws IOException { + Subject subject = getSubject(request, response); + String[] perms = (String[]) mappedValue; + if (perms != null && perms.length > 0) { + for (String str : perms) { + // 判断访问的用户是否拥有mappedValue权限 + if (subject.isPermitted(str)) { + return true; + } + } + return false; + } + return true; + } + + + + +} diff --git a/fit2cloud-commons/fit2cloud-common-auth/src/main/java/com/fit2cloud/commons/auth/filter/F2CRolesFilter.java b/fit2cloud-commons/fit2cloud-common-auth/src/main/java/com/fit2cloud/commons/auth/filter/F2CRolesFilter.java new file mode 100644 index 0000000000..6e8370d439 --- /dev/null +++ b/fit2cloud-commons/fit2cloud-common-auth/src/main/java/com/fit2cloud/commons/auth/filter/F2CRolesFilter.java @@ -0,0 +1,25 @@ +package com.fit2cloud.commons.auth.filter; + +import org.apache.shiro.subject.Subject; +import org.apache.shiro.web.filter.authz.AuthorizationFilter; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; + +public class F2CRolesFilter extends AuthorizationFilter { + @Override + protected boolean isAccessAllowed(ServletRequest servletRequest, ServletResponse servletResponse, Object o) throws Exception { + Subject subject = getSubject(servletRequest, servletResponse); + String[] rolesArray = (String[]) o; + // 没有角色限制,有权限访问 + if (rolesArray == null || rolesArray.length == 0) { + return true; + } + for (int i = 0; i < rolesArray.length; i++) { + //若当前用户是rolesArray中的任何一个,则有权限访问 + if (subject.hasRole(rolesArray[i])) { + return true; + } + } + return false; + } +} diff --git a/fit2cloud-commons/fit2cloud-common-auth/src/main/java/com/fit2cloud/commons/auth/filter/JWTFilter.java b/fit2cloud-commons/fit2cloud-common-auth/src/main/java/com/fit2cloud/commons/auth/filter/JWTFilter.java new file mode 100644 index 0000000000..66c52e7528 --- /dev/null +++ b/fit2cloud-commons/fit2cloud-common-auth/src/main/java/com/fit2cloud/commons/auth/filter/JWTFilter.java @@ -0,0 +1,121 @@ +package com.fit2cloud.commons.auth.filter; + +import com.fit2cloud.commons.auth.config.JWTToken; +import com.fit2cloud.commons.auth.util.JWTUtil; +import org.apache.shiro.subject.Subject; +import org.apache.shiro.web.filter.authc.BasicHttpAuthenticationFilter; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.http.HttpStatus; +import org.springframework.web.bind.annotation.RequestMethod; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + + +public class JWTFilter extends BasicHttpAuthenticationFilter { + + + private Logger LOGGER = LoggerFactory.getLogger(this.getClass()); + + + /** + * 判断用户是否想要登入。 + * 检测header里面是否包含Authorization字段即可 + */ + @Override + protected boolean isLoginAttempt(ServletRequest request, ServletResponse response) { + HttpServletRequest req = (HttpServletRequest) request; + String authorization = req.getHeader("Authorization"); + return authorization != null; + } + + /** + * + */ + @Override + protected boolean executeLogin(ServletRequest request, ServletResponse response) throws Exception { + HttpServletRequest httpServletRequest = (HttpServletRequest) request; + String authorization = httpServletRequest.getHeader("Authorization"); + + if (JWTUtil.needRefresh(authorization)){ + authorization = refreshToken(request, response); + } + JWTToken token = new JWTToken(authorization); + Subject subject = getSubject(request, response); + // 提交给realm进行登入,如果错误他会抛出异常并被捕获 + subject.login(token); + return true; + } + + + + /** + */ + @Override + protected boolean isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue) { + if (isLoginAttempt(request, response)) { + try { + boolean loginSuccess = executeLogin(request, response); + return loginSuccess; + } catch (Exception e) { + response401(request, response); + } + } + return false; + } + + private String refreshToken(ServletRequest request, ServletResponse response) { + // 获取AccessToken(Shiro中getAuthzHeader方法已经实现) + String token = this.getAuthzHeader(request); + // 获取当前Token的帐号信息 + String username = JWTUtil.getUsername(token); + String password = JWTUtil.getPassword(username); + try { + String newToken = JWTUtil.sign(username, password); + JWTToken jwtToken = new JWTToken(newToken); + this.getSubject(request, response).login(jwtToken); + // 设置响应的Header头新Token + HttpServletResponse httpServletResponse = (HttpServletResponse) response; + httpServletResponse.addHeader("Access-Control-Expose-Headers", "Authorization"); + httpServletResponse.setHeader("Authorization", newToken); + return newToken; + }catch (Exception e){ + e.printStackTrace(); + } + return null; + } + + + /** + * 对跨域提供支持 + */ + @Override + protected boolean preHandle(ServletRequest request, ServletResponse response) throws Exception { + HttpServletRequest httpServletRequest = (HttpServletRequest) request; + HttpServletResponse httpServletResponse = (HttpServletResponse) response; + httpServletResponse.setHeader("Access-control-Allow-Origin", httpServletRequest.getHeader("Origin")); + httpServletResponse.setHeader("Access-Control-Allow-Methods", "GET,POST,OPTIONS,PUT,DELETE"); + httpServletResponse.setHeader("Access-Control-Allow-Headers", httpServletRequest.getHeader("Access-Control-Request-Headers")); + // 跨域时会首先发送一个option请求,这里我们给option请求直接返回正常状态 + if (httpServletRequest.getMethod().equals(RequestMethod.OPTIONS.name())) { + httpServletResponse.setStatus(HttpStatus.OK.value()); + return false; + } + return super.preHandle(request, response); + } + + /** + * 将非法请求跳转到 /401 + */ + private void response401(ServletRequest req, ServletResponse resp) { + try { + HttpServletResponse httpServletResponse = (HttpServletResponse) resp; + httpServletResponse.sendRedirect("/401"); + } catch (IOException e) { + LOGGER.error(e.getMessage()); + } + } +} diff --git a/fit2cloud-commons/fit2cloud-common-auth/src/main/java/com/fit2cloud/commons/auth/filter/XssFilter.java b/fit2cloud-commons/fit2cloud-common-auth/src/main/java/com/fit2cloud/commons/auth/filter/XssFilter.java new file mode 100644 index 0000000000..88050c84e0 --- /dev/null +++ b/fit2cloud-commons/fit2cloud-common-auth/src/main/java/com/fit2cloud/commons/auth/filter/XssFilter.java @@ -0,0 +1,52 @@ +package com.fit2cloud.commons.auth.filter; + + +import cn.hutool.core.util.StrUtil; +import org.apache.commons.text.StringEscapeUtils; +import org.springframework.stereotype.Component; +import javax.servlet.*; +import javax.servlet.annotation.WebFilter; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletRequestWrapper; +import java.io.IOException; + +@Component +@WebFilter +public class XssFilter implements Filter { + @Override + public void init(FilterConfig filterConfig) throws ServletException { + + } + + @Override + public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException, ServletException { + XssHttpServletRequestWrapper xssHttpServletRequestWrapper = new XssHttpServletRequestWrapper((HttpServletRequest) request); + filterChain.doFilter(xssHttpServletRequestWrapper, response); + } + + @Override + public void destroy() { + + } + + class XssHttpServletRequestWrapper extends HttpServletRequestWrapper { + + private HttpServletRequest request; + + public XssHttpServletRequestWrapper(HttpServletRequest request) { + super(request); + this.request = request; + } + + @Override + public String getParameter(String name) { + String oldValue = super.getParameter(name); + if(StrUtil.isEmpty(oldValue)){ + return oldValue; + } + String newValue = StringEscapeUtils.escapeHtml4(oldValue); + return newValue; + } + + } +} diff --git a/fit2cloud-commons/fit2cloud-common-auth/src/main/java/com/fit2cloud/commons/auth/mapper/OrgUserMapper.java b/fit2cloud-commons/fit2cloud-common-auth/src/main/java/com/fit2cloud/commons/auth/mapper/OrgUserMapper.java new file mode 100644 index 0000000000..c834dc5b12 --- /dev/null +++ b/fit2cloud-commons/fit2cloud-common-auth/src/main/java/com/fit2cloud/commons/auth/mapper/OrgUserMapper.java @@ -0,0 +1,19 @@ +package com.fit2cloud.commons.auth.mapper; + +import com.fit2cloud.commons.auth.entity.OrgUser; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; + + +/** + *+ * Mapper 接口 + *
+ * + * @author cyw + * @since 2021-02-03 +*/ +@Mapper +public interface OrgUserMapper extends BaseMapper+ * Mapper 接口 + *
+ * + * @author cyw + * @since 2021-02-03 +*/ +@Mapper +public interface OrganizationMapper extends BaseMapper+ * Mapper 接口 + *
+ * + * @author cyw + * @since 2021-02-03 +*/ +@Mapper +public interface PermissionMapper extends BaseMapper+ * Mapper 接口 + *
+ * + * @author cyw + * @since 2021-02-03 +*/ +@Mapper +public interface ResourceMapper extends BaseMapper+ * Mapper 接口 + *
+ * + * @author cyw + * @since 2021-02-03 +*/ +@Mapper +public interface RoleMapper extends BaseMapper+ * Mapper 接口 + *
+ * + * @author cyw + * @since 2021-02-03 +*/ +@Mapper +public interface RoleUserMapper extends BaseMapper+ * Mapper 接口 + *
+ * + * @author cyw + * @since 2021-02-03 +*/ +@Mapper +public interface UserMapper extends BaseMapper+ * ${table.comment!} Mapper 接口 + *
+ * + * @author ${author} + * @since ${date} +*/ +<#if kotlin> +interface ${table.mapperName} : ${superMapperClass}<${entity}> +<#else> +<#if table.convert> +@Mapper +#if> +public interface ${table.mapperName} extends ${superMapperClass}<${entity}> { + +} +#if> diff --git a/fit2cloud-commons/fit2cloud-common-logs/pom.xml b/fit2cloud-commons/fit2cloud-common-logs/pom.xml new file mode 100644 index 0000000000..213646cded --- /dev/null +++ b/fit2cloud-commons/fit2cloud-common-logs/pom.xml @@ -0,0 +1,15 @@ + +