Commit e8c98a25 authored by david.zhong's avatar david.zhong

Initial commit

parents
FROM java:8
EXPOSE 8080
VOLUME /tmp
ADD renren-admin.jar /app.jar
RUN bash -c 'touch /app.jar'
ENTRYPOINT ["java","-jar","/app.jar"]
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>micro-context</artifactId>
<groupId>com.ost.micro</groupId>
<version>1.0.0-alpha</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>micro-security</artifactId>
<name>Micro :: Context :: Security</name>
<dependencies>
<!-- common start -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
</dependency>
<!-- mysql驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<exclusions>
<exclusion>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
</dependency>
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
</dependency>
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
</dependency>
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
</dependency>
<dependency>
<groupId>joda-time</groupId>
<artifactId>joda-time</artifactId>
</dependency>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
</dependency>
<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
</dependency>
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-core</artifactId>
</dependency>
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-spring</artifactId>
</dependency>
<dependency>
<groupId>com.github.axet</groupId>
<artifactId>kaptcha</artifactId>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.8.8</version>
</dependency>
<!-- common end -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-zuul</artifactId>
</dependency>
<dependency>
<groupId>com.ost.micro</groupId>
<artifactId>pay-dependencies</artifactId>
</dependency>
</dependencies>
<!-- 阿里云maven仓库 -->
<repositories>
<repository>
<id>public</id>
<name>aliyun nexus</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<releases>
<enabled>true</enabled>
</releases>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>public</id>
<name>aliyun nexus</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>false</enabled>
</snapshots>
</pluginRepository>
</pluginRepositories>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
package com.ost.micro;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.netflix.zuul.EnableZuulProxy;
@EnableZuulProxy
//@EnableDiscoveryClient
@SpringBootApplication(exclude = {
org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration.class
})
public class MicroSecurityApplication {
public static void main(String[] args) {
SpringApplication.run(MicroSecurityApplication.class, args);
}
}
package com.ost.micro.config;
import com.alibaba.fastjson.serializer.SerializerFeature;
import com.alibaba.fastjson.support.config.FastJsonConfig;
import com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.MediaType;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import java.util.ArrayList;
import java.util.List;
@Configuration
public class SecurityWebMvcConfigurer implements WebMvcConfigurer {
/**
* 利用fastjson替换掉jackson,且解决中文乱码问题
* @param converters
*/
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
//1.构建了一个HttpMessageConverter FastJson 消息转换器
FastJsonHttpMessageConverter fastConverter = new FastJsonHttpMessageConverter();
//2.定义一个配置,设置编码方式,和格式化的形式
FastJsonConfig fastJsonConfig = new FastJsonConfig();
//3.设置成了PrettyFormat格式
fastJsonConfig.setSerializerFeatures(SerializerFeature.PrettyFormat);
//4.处理中文乱码问题
List<MediaType> fastMediaTypes = new ArrayList<>();
fastMediaTypes.add(MediaType.APPLICATION_JSON_UTF8);
fastConverter.setSupportedMediaTypes(fastMediaTypes);
//5.将fastJsonConfig加到消息转换器中
fastConverter.setFastJsonConfig(fastJsonConfig);
converters.add(fastConverter);
}
}
package com.ost.micro.filter;
import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import com.netflix.zuul.exception.ZuulException;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.subject.Subject;
import org.springframework.cloud.netflix.zuul.filters.support.FilterConstants;
import org.springframework.stereotype.Component;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
//@Component
@Slf4j
public class AccessFilter extends ZuulFilter {
@Override
public String filterType() {
return FilterConstants.PRE_TYPE;
}
@Override
public int filterOrder() {
return 0;
}
@Override
public boolean shouldFilter() {
return true;
}
@Override
public Object run() throws ZuulException {
log.info("开始进入zuul方法=======>");
RequestContext ctx = RequestContext.getCurrentContext();
HttpServletRequest request = ctx.getRequest();
HttpServletResponse response = ctx.getResponse();
Object originalRequestPath = ctx.get(FilterConstants.REQUEST_URI_KEY);
Subject subject = SecurityUtils.getSubject();
log.info("originalRequestPath is {}",originalRequestPath);
String permission = urlToPermission(request.getRequestURI(),request);
Boolean ispermission = subject.isPermitted(permission);
if (!ispermission) {
ctx.setSendZuulResponse(false);
ctx.setResponseStatusCode(401);
ctx.setResponseBody("{\"result\": 无访问权限! }");
ctx.getResponse().setContentType("text/html;charset=UTF-8");
return null;
}
//String modifiedRequestPath = "/api/prefix" + originalRequestPath;
log.info("结束进入zuul方法=======>");
return null;
}
/**
* 权限标志定义
* @param uri
* @param request
* @return
*/
private String urlToPermission(String uri,HttpServletRequest request){
String permission = "";
if (StringUtils.isNotEmpty(uri)) {
if (uri.startsWith("/api/")){
uri = uri.replace("/api/","");
}
if (uri.startsWith("/mch/")){
uri = uri.replace("/mch/","");
}
permission = uri.replaceAll("/",":");
if (permission.startsWith(":")){
permission = permission.replaceFirst(":","");
}
if (uri.lastIndexOf("/") > 0) {
String lastParams = uri.substring(uri.lastIndexOf("/")+1,uri.length());
Pattern pattern = Pattern.compile("\\d{19}");
Matcher isNum = pattern.matcher(lastParams);
if (isNum.matches()) {
String params = uri.substring(0,uri.lastIndexOf("/"));
permission = params+":info";
}
}
}
String method = request.getMethod().toLowerCase();
return permission+":"+method;
}
}
/**
* Copyright (c) 2018 人人开源 All rights reserved.
*
* https://www.renren.io
*
* 版权所有,侵权必究!
*/
package com.ost.micro.modules.log.controller;
import com.ost.micro.common.constant.Constant;
import com.ost.micro.common.page.PageData;
import com.ost.micro.common.utils.Result;
import com.ost.micro.modules.log.dto.SysLogErrorDTO;
import com.ost.micro.modules.log.excel.SysLogErrorExcel;
import com.ost.micro.modules.log.service.SysLogErrorService;
import com.ost.micro.securitycommon.annotation.LogOperation;
import com.ost.micro.securitycommon.utils.ExcelUtils;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import springfox.documentation.annotations.ApiIgnore;
import javax.servlet.http.HttpServletResponse;
import java.util.List;
import java.util.Map;
/**
* 异常日志
*
* @author Mark sunlightcs@gmail.com
* @since 1.0.0
*/
@RestController
@RequestMapping("sys/log/error")
@Api(tags="异常日志")
public class SysLogErrorController {
@Autowired
private SysLogErrorService sysLogErrorService;
@GetMapping("page")
@ApiOperation("分页")
@ApiImplicitParams({
@ApiImplicitParam(name = Constant.PAGE, value = "当前页码,从1开始", paramType = "query", required = true, dataType="int") ,
@ApiImplicitParam(name = Constant.LIMIT, value = "每页显示记录数", paramType = "query",required = true, dataType="int") ,
@ApiImplicitParam(name = Constant.ORDER_FIELD, value = "排序字段", paramType = "query", dataType="String") ,
@ApiImplicitParam(name = Constant.ORDER, value = "排序方式,可选值(asc、desc)", paramType = "query", dataType="String")
})
//@RequiresPermissions("sys:log:error")
public Result<PageData<SysLogErrorDTO>> page(@ApiIgnore @RequestParam Map<String, Object> params){
PageData<SysLogErrorDTO> page = sysLogErrorService.page(params);
return new Result<PageData<SysLogErrorDTO>>().ok(page);
}
@GetMapping("export")
@ApiOperation("导出")
@LogOperation("导出")
//@RequiresPermissions("sys:log:error")
public void export(@ApiIgnore @RequestParam Map<String, Object> params, HttpServletResponse response) throws Exception {
List<SysLogErrorDTO> list = sysLogErrorService.list(params);
ExcelUtils.exportExcelToTarget(response, null, list, SysLogErrorExcel.class);
}
}
\ No newline at end of file
/**
* Copyright (c) 2018 人人开源 All rights reserved.
*
* https://www.renren.io
*
* 版权所有,侵权必究!
*/
package com.ost.micro.modules.log.controller;
import com.ost.micro.common.constant.Constant;
import com.ost.micro.common.page.PageData;
import com.ost.micro.common.utils.Result;
import com.ost.micro.modules.log.dto.SysLogLoginDTO;
import com.ost.micro.modules.log.excel.SysLogLoginExcel;
import com.ost.micro.modules.log.service.SysLogLoginService;
import com.ost.micro.securitycommon.annotation.LogOperation;
import com.ost.micro.securitycommon.utils.ExcelUtils;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import springfox.documentation.annotations.ApiIgnore;
import javax.servlet.http.HttpServletResponse;
import java.util.List;
import java.util.Map;
/**
* 登录日志
*
* @author Mark sunlightcs@gmail.com
* @since 1.0.0
*/
@RestController
@RequestMapping("sys/log/login")
@Api(tags="登录日志")
public class SysLogLoginController {
@Autowired
private SysLogLoginService sysLogLoginService;
@GetMapping("page")
@ApiOperation("分页")
@ApiImplicitParams({
@ApiImplicitParam(name = Constant.PAGE, value = "当前页码,从1开始", paramType = "query", required = true, dataType="int") ,
@ApiImplicitParam(name = Constant.LIMIT, value = "每页显示记录数", paramType = "query",required = true, dataType="int") ,
@ApiImplicitParam(name = Constant.ORDER_FIELD, value = "排序字段", paramType = "query", dataType="String") ,
@ApiImplicitParam(name = Constant.ORDER, value = "排序方式,可选值(asc、desc)", paramType = "query", dataType="String") ,
@ApiImplicitParam(name = "status", value = "状态 0:失败 1:成功 2:账号已锁定", paramType = "query", dataType="int"),
@ApiImplicitParam(name = "createrName", value = "用户名", paramType = "query", dataType="String")
})
//@RequiresPermissions("sys:log:login")
public Result<PageData<SysLogLoginDTO>> page(@ApiIgnore @RequestParam Map<String, Object> params){
PageData<SysLogLoginDTO> page = sysLogLoginService.page(params);
return new Result<PageData<SysLogLoginDTO>>().ok(page);
}
@GetMapping("export")
@ApiOperation("导出")
@LogOperation("导出")
@ApiImplicitParams({
@ApiImplicitParam(name = "status", value = "状态 0:失败 1:成功 2:账号已锁定", paramType = "query", dataType="int"),
@ApiImplicitParam(name = "createrName", value = "用户名", paramType = "query", dataType="String")
})
//@RequiresPermissions("sys:log:login")
public void export(@ApiIgnore @RequestParam Map<String, Object> params, HttpServletResponse response) throws Exception {
List<SysLogLoginDTO> list = sysLogLoginService.list(params);
ExcelUtils.exportExcelToTarget(response, null, list, SysLogLoginExcel.class);
}
}
\ No newline at end of file
/**
* Copyright (c) 2018 人人开源 All rights reserved.
*
* https://www.renren.io
*
* 版权所有,侵权必究!
*/
package com.ost.micro.modules.log.controller;
import com.ost.micro.common.constant.Constant;
import com.ost.micro.common.page.PageData;
import com.ost.micro.common.utils.Result;
import com.ost.micro.modules.log.dto.SysLogOperationDTO;
import com.ost.micro.modules.log.excel.SysLogOperationExcel;
import com.ost.micro.modules.log.service.SysLogOperationService;
import com.ost.micro.securitycommon.annotation.LogOperation;
import com.ost.micro.securitycommon.utils.ExcelUtils;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import springfox.documentation.annotations.ApiIgnore;
import javax.servlet.http.HttpServletResponse;
import java.util.List;
import java.util.Map;
/**
* 操作日志
*
* @author Mark sunlightcs@gmail.com
* @since 1.0.0
*/
@RestController
@RequestMapping("sys/log/operation")
@Api(tags="操作日志")
public class SysLogOperationController {
@Autowired
private SysLogOperationService sysLogOperationService;
@GetMapping("page")
@ApiOperation("分页")
@ApiImplicitParams({
@ApiImplicitParam(name = Constant.PAGE, value = "当前页码,从1开始", paramType = "query", required = true, dataType="int") ,
@ApiImplicitParam(name = Constant.LIMIT, value = "每页显示记录数", paramType = "query",required = true, dataType="int") ,
@ApiImplicitParam(name = Constant.ORDER_FIELD, value = "排序字段", paramType = "query", dataType="String") ,
@ApiImplicitParam(name = Constant.ORDER, value = "排序方式,可选值(asc、desc)", paramType = "query", dataType="String") ,
@ApiImplicitParam(name = "status", value = "状态 0:失败 1:成功", paramType = "query", dataType="int")
})
//@RequiresPermissions("sys:log:operation")
public Result<PageData<SysLogOperationDTO>> page(@ApiIgnore @RequestParam Map<String, Object> params){
PageData<SysLogOperationDTO> page = sysLogOperationService.page(params);
return new Result<PageData<SysLogOperationDTO>>().ok(page);
}
@GetMapping("export")
@ApiOperation("导出")
@LogOperation("导出")
//@RequiresPermissions("sys:log:operation")
public void export(@ApiIgnore @RequestParam Map<String, Object> params, HttpServletResponse response) throws Exception {
List<SysLogOperationDTO> list = sysLogOperationService.list(params);
ExcelUtils.exportExcelToTarget(response, null, list, SysLogOperationExcel.class);
}
}
\ No newline at end of file
/**
* Copyright (c) 2018 人人开源 All rights reserved.
*
* https://www.renren.io
*
* 版权所有,侵权必究!
*/
package com.ost.micro.modules.log.dao;
import com.ost.micro.common.dao.BaseDao;
import com.ost.micro.modules.log.entity.SysLogErrorEntity;
import org.apache.ibatis.annotations.Mapper;
/**
* 异常日志
*
* @author Mark sunlightcs@gmail.com
* @since 1.0.0
*/
@Mapper
public interface SysLogErrorDao extends BaseDao<SysLogErrorEntity> {
}
/**
* Copyright (c) 2018 人人开源 All rights reserved.
*
* https://www.renren.io
*
* 版权所有,侵权必究!
*/
package com.ost.micro.modules.log.dao;
import com.ost.micro.common.dao.BaseDao;
import com.ost.micro.modules.log.entity.SysLogLoginEntity;
import org.apache.ibatis.annotations.Mapper;
/**
* 登录日志
*
* @author Mark sunlightcs@gmail.com
* @since 1.0.0
*/
@Mapper
public interface SysLogLoginDao extends BaseDao<SysLogLoginEntity> {
}
/**
* Copyright (c) 2018 人人开源 All rights reserved.
*
* https://www.renren.io
*
* 版权所有,侵权必究!
*/
package com.ost.micro.modules.log.dao;
import com.ost.micro.common.dao.BaseDao;
import com.ost.micro.modules.log.entity.SysLogOperationEntity;
import org.apache.ibatis.annotations.Mapper;
/**
* 操作日志
*
* @author Mark sunlightcs@gmail.com
* @since 1.0.0
*/
@Mapper
public interface SysLogOperationDao extends BaseDao<SysLogOperationEntity> {
}
/**
* Copyright (c) 2018 人人开源 All rights reserved.
*
* https://www.renren.io
*
* 版权所有,侵权必究!
*/
package com.ost.micro.modules.log.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import java.io.Serializable;
import java.util.Date;
/**
* 异常日志
*
* @author Mark sunlightcs@gmail.com
* @since 1.0.0
*/
@ApiModel(value = "异常日志")
public class SysLogErrorDTO implements Serializable {
private static final long serialVersionUID = 1L;
@ApiModelProperty(value = "id")
private String id;
@ApiModelProperty(value = "请求URI")
private String requestUri;
@ApiModelProperty(value = "请求方式")
private String requestMethod;
@ApiModelProperty(value = "请求参数")
private String requestParams;
@ApiModelProperty(value = "用户代理")
private String userAgent;
@ApiModelProperty(value = "操作IP")
private String ip;
@ApiModelProperty(value = "异常信息")
private String errorInfo;
@ApiModelProperty(value = "创建时间")
private Date createDate;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getRequestUri() {
return requestUri;
}
public void setRequestUri(String requestUri) {
this.requestUri = requestUri;
}
public String getRequestMethod() {
return requestMethod;
}
public void setRequestMethod(String requestMethod) {
this.requestMethod = requestMethod;
}
public String getRequestParams() {
return requestParams;
}
public void setRequestParams(String requestParams) {
this.requestParams = requestParams;
}
public String getUserAgent() {
return userAgent;
}
public void setUserAgent(String userAgent) {
this.userAgent = userAgent;
}
public String getIp() {
return ip;
}
public void setIp(String ip) {
this.ip = ip;
}
public String getErrorInfo() {
return errorInfo;
}
public void setErrorInfo(String errorInfo) {
this.errorInfo = errorInfo;
}
public Date getCreateDate() {
return createDate;
}
public void setCreateDate(Date createDate) {
this.createDate = createDate;
}
}
\ No newline at end of file
/**
* Copyright (c) 2018 人人开源 All rights reserved.
*
* https://www.renren.io
*
* 版权所有,侵权必究!
*/
package com.ost.micro.modules.log.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import java.io.Serializable;
import java.util.Date;
/**
* 登录日志
*
* @author Mark sunlightcs@gmail.com
* @since 1.0.0
*/
@ApiModel(value = "登录日志")
public class SysLogLoginDTO implements Serializable {
private static final long serialVersionUID = 1L;
@ApiModelProperty(value = "id")
private String id;
@ApiModelProperty(value = "用户操作 0:用户登录 1:用户退出")
private Integer operation;
@ApiModelProperty(value = "状态 0:失败 1:成功 2:账号已锁定")
private Integer status;
@ApiModelProperty(value = "用户代理")
private String userAgent;
@ApiModelProperty(value = "操作IP")
private String ip;
@ApiModelProperty(value = "用户名")
private String createrName;
@ApiModelProperty(value = "创建时间")
private Date createDate;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public Integer getOperation() {
return operation;
}
public void setOperation(Integer operation) {
this.operation = operation;
}
public Integer getStatus() {
return status;
}
public void setStatus(Integer status) {
this.status = status;
}
public String getUserAgent() {
return userAgent;
}
public void setUserAgent(String userAgent) {
this.userAgent = userAgent;
}
public String getIp() {
return ip;
}
public void setIp(String ip) {
this.ip = ip;
}
public String getCreaterName() {
return createrName;
}
public void setCreaterName(String createrName) {
this.createrName = createrName;
}
public Date getCreateDate() {
return createDate;
}
public void setCreateDate(Date createDate) {
this.createDate = createDate;
}
}
/**
* Copyright (c) 2018 人人开源 All rights reserved.
*
* https://www.renren.io
*
* 版权所有,侵权必究!
*/
package com.ost.micro.modules.log.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import java.io.Serializable;
import java.util.Date;
/**
* 操作日志
*
* @author Mark sunlightcs@gmail.com
* @since 1.0.0
*/
@ApiModel(value = "操作日志")
public class SysLogOperationDTO implements Serializable {
private static final long serialVersionUID = 1L;
@ApiModelProperty(value = "id")
private String id;
@ApiModelProperty(value = "用户操作")
private String operation;
@ApiModelProperty(value = "请求URI")
private String requestUri;
@ApiModelProperty(value = "请求方式")
private String requestMethod;
@ApiModelProperty(value = "请求参数")
private String requestParams;
@ApiModelProperty(value = "请求时长(毫秒)")
private Integer requestTime;
@ApiModelProperty(value = "用户代理")
private String userAgent;
@ApiModelProperty(value = "操作IP")
private String ip;
@ApiModelProperty(value = "状态 0:失败 1:成功")
private Integer status;
@ApiModelProperty(value = "用户名")
private String createrName;
@ApiModelProperty(value = "创建时间")
private Date createDate;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getOperation() {
return operation;
}
public void setOperation(String operation) {
this.operation = operation;
}
public String getRequestUri() {
return requestUri;
}
public void setRequestUri(String requestUri) {
this.requestUri = requestUri;
}
public String getRequestMethod() {
return requestMethod;
}
public void setRequestMethod(String requestMethod) {
this.requestMethod = requestMethod;
}
public String getRequestParams() {
return requestParams;
}
public void setRequestParams(String requestParams) {
this.requestParams = requestParams;
}
public Integer getRequestTime() {
return requestTime;
}
public void setRequestTime(Integer requestTime) {
this.requestTime = requestTime;
}
public String getUserAgent() {
return userAgent;
}
public void setUserAgent(String userAgent) {
this.userAgent = userAgent;
}
public String getIp() {
return ip;
}
public void setIp(String ip) {
this.ip = ip;
}
public Integer getStatus() {
return status;
}
public void setStatus(Integer status) {
this.status = status;
}
public String getCreaterName() {
return createrName;
}
public void setCreaterName(String createrName) {
this.createrName = createrName;
}
public Date getCreateDate() {
return createDate;
}
public void setCreateDate(Date createDate) {
this.createDate = createDate;
}
}
\ No newline at end of file
/**
* Copyright (c) 2018 人人开源 All rights reserved.
*
* https://www.renren.io
*
* 版权所有,侵权必究!
*/
package com.ost.micro.modules.log.entity;
import com.baomidou.mybatisplus.annotation.TableName;
import com.ost.micro.common.entity.BaseEntity;
/**
* 异常日志
*
* @author Mark sunlightcs@gmail.com
* @since 1.0.0
*/
@TableName("sys_log_error")
public class SysLogErrorEntity extends BaseEntity {
private static final long serialVersionUID = 1L;
/**
* 请求URI
*/
private String requestUri;
/**
* 请求方式
*/
private String requestMethod;
/**
* 请求参数
*/
private String requestParams;
/**
* 用户代理
*/
private String userAgent;
/**
* 操作IP
*/
private String ip;
/**
* 异常信息
*/
private String errorInfo;
public String getRequestUri() {
return requestUri;
}
public void setRequestUri(String requestUri) {
this.requestUri = requestUri;
}
public String getRequestMethod() {
return requestMethod;
}
public void setRequestMethod(String requestMethod) {
this.requestMethod = requestMethod;
}
public String getRequestParams() {
return requestParams;
}
public void setRequestParams(String requestParams) {
this.requestParams = requestParams;
}
public String getUserAgent() {
return userAgent;
}
public void setUserAgent(String userAgent) {
this.userAgent = userAgent;
}
public String getIp() {
return ip;
}
public void setIp(String ip) {
this.ip = ip;
}
public String getErrorInfo() {
return errorInfo;
}
public void setErrorInfo(String errorInfo) {
this.errorInfo = errorInfo;
}
}
\ No newline at end of file
/**
* Copyright (c) 2018 人人开源 All rights reserved.
*
* https://www.renren.io
*
* 版权所有,侵权必究!
*/
package com.ost.micro.modules.log.entity;
import com.baomidou.mybatisplus.annotation.TableName;
import com.ost.micro.common.entity.BaseEntity;
/**
* 登录日志
*
* @author Mark sunlightcs@gmail.com
* @since 1.0.0
*/
@TableName("sys_log_login")
public class SysLogLoginEntity extends BaseEntity {
private static final long serialVersionUID = 1L;
/**
* 用户操作 0:用户登录 1:用户退出
*/
private Integer operation;
/**
* 状态 0:失败 1:成功 2:账号已锁定
*/
private Integer status;
/**
* 用户代理
*/
private String userAgent;
/**
* 操作IP
*/
private String ip;
/**
* 用户名
*/
private String createrName;
public Integer getOperation() {
return operation;
}
public void setOperation(Integer operation) {
this.operation = operation;
}
public Integer getStatus() {
return status;
}
public void setStatus(Integer status) {
this.status = status;
}
public String getUserAgent() {
return userAgent;
}
public void setUserAgent(String userAgent) {
this.userAgent = userAgent;
}
public String getIp() {
return ip;
}
public void setIp(String ip) {
this.ip = ip;
}
public String getCreaterName() {
return createrName;
}
public void setCreaterName(String createrName) {
this.createrName = createrName;
}
}
\ No newline at end of file
/**
* Copyright (c) 2018 人人开源 All rights reserved.
*
* https://www.renren.io
*
* 版权所有,侵权必究!
*/
package com.ost.micro.modules.log.entity;
import com.baomidou.mybatisplus.annotation.TableName;
import com.ost.micro.common.entity.BaseEntity;
/**
* 操作日志
*
* @author Mark sunlightcs@gmail.com
* @since 1.0.0
*/
@TableName("sys_log_operation")
public class SysLogOperationEntity extends BaseEntity {
private static final long serialVersionUID = 1L;
/**
* 用户操作
*/
private String operation;
/**
* 请求URI
*/
private String requestUri;
/**
* 请求方式
*/
private String requestMethod;
/**
* 请求参数
*/
private String requestParams;
/**
* 请求时长(毫秒)
*/
private Integer requestTime;
/**
* 用户代理
*/
private String userAgent;
/**
* 操作IP
*/
private String ip;
/**
* 状态 0:失败 1:成功
*/
private Integer status;
/**
* 用户名
*/
private String createrName;
public String getOperation() {
return operation;
}
public void setOperation(String operation) {
this.operation = operation;
}
public String getRequestUri() {
return requestUri;
}
public void setRequestUri(String requestUri) {
this.requestUri = requestUri;
}
public String getRequestMethod() {
return requestMethod;
}
public void setRequestMethod(String requestMethod) {
this.requestMethod = requestMethod;
}
public String getRequestParams() {
return requestParams;
}
public void setRequestParams(String requestParams) {
this.requestParams = requestParams;
}
public Integer getRequestTime() {
return requestTime;
}
public void setRequestTime(Integer requestTime) {
this.requestTime = requestTime;
}
public String getUserAgent() {
return userAgent;
}
public void setUserAgent(String userAgent) {
this.userAgent = userAgent;
}
public String getIp() {
return ip;
}
public void setIp(String ip) {
this.ip = ip;
}
public Integer getStatus() {
return status;
}
public void setStatus(Integer status) {
this.status = status;
}
public String getCreaterName() {
return createrName;
}
public void setCreaterName(String createrName) {
this.createrName = createrName;
}
}
\ No newline at end of file
/**
* Copyright (c) 2018 人人开源 All rights reserved.
*
* https://www.renren.io
*
* 版权所有,侵权必究!
*/
package com.ost.micro.modules.log.enums;
/**
* 登录操作枚举
*
* @author Mark sunlightcs@gmail.com
* @since 1.0.0
*/
public enum LoginOperationEnum {
/**
* 用户登录
*/
LOGIN(0),
/**
* 用户退出
*/
LOGOUT(1);
private int value;
LoginOperationEnum(int value) {
this.value = value;
}
public int value() {
return this.value;
}
}
\ No newline at end of file
/**
* Copyright (c) 2018 人人开源 All rights reserved.
*
* https://www.renren.io
*
* 版权所有,侵权必究!
*/
package com.ost.micro.modules.log.enums;
/**
* 登录状态枚举
*
* @author Mark sunlightcs@gmail.com
* @since 1.0.0
*/
public enum LoginStatusEnum {
/**
* 失败
*/
FAIL(0),
/**
* 成功
*/
SUCCESS(1),
/**
* 账号已锁定
*/
LOCK(2);
private int value;
LoginStatusEnum(int value) {
this.value = value;
}
public int value() {
return this.value;
}
}
/**
* Copyright (c) 2018 人人开源 All rights reserved.
*
* https://www.renren.io
*
* 版权所有,侵权必究!
*/
package com.ost.micro.modules.log.enums;
/**
* 操作状态枚举
*
* @author Mark sunlightcs@gmail.com
* @since 1.0.0
*/
public enum OperationStatusEnum {
/**
* 失败
*/
FAIL(0),
/**
* 成功
*/
SUCCESS(1);
private int value;
OperationStatusEnum(int value) {
this.value = value;
}
public int value() {
return this.value;
}
}
\ No newline at end of file
/**
* Copyright (c) 2018 人人开源 All rights reserved.
*
* https://www.renren.io
*
* 版权所有,侵权必究!
*/
package com.ost.micro.modules.log.excel;
import cn.afterturn.easypoi.excel.annotation.Excel;
import java.util.Date;
/**
* 异常日志
*
* @author Mark sunlightcs@gmail.com
* @since 1.0.0
*/
public class SysLogErrorExcel {
@Excel(name = "请求URI")
private String requestUri;
@Excel(name = "请求方式")
private String requestMethod;
@Excel(name = "请求参数")
private String requestParams;
@Excel(name = "User-Agent")
private String userAgent;
@Excel(name = "操作IP")
private String ip;
@Excel(name = "创建时间", format = "yyyy-MM-dd HH:mm:ss")
private Date createDate;
public void setRequestUri(String requestUri) {
this.requestUri = requestUri;
}
public String getRequestUri() {
return requestUri;
}
public void setRequestMethod(String requestMethod) {
this.requestMethod = requestMethod;
}
public String getRequestMethod() {
return requestMethod;
}
public void setRequestParams(String requestParams) {
this.requestParams = requestParams;
}
public String getRequestParams() {
return requestParams;
}
public void setUserAgent(String userAgent) {
this.userAgent = userAgent;
}
public String getUserAgent() {
return userAgent;
}
public void setIp(String ip) {
this.ip = ip;
}
public String getIp() {
return ip;
}
public void setCreateDate(Date createDate) {
this.createDate = createDate;
}
public Date getCreateDate() {
return createDate;
}
}
\ No newline at end of file
/**
* Copyright (c) 2018 人人开源 All rights reserved.
*
* https://www.renren.io
*
* 版权所有,侵权必究!
*/
package com.ost.micro.modules.log.excel;
import cn.afterturn.easypoi.excel.annotation.Excel;
import java.util.Date;
/**
* 登录日志
*
* @author Mark sunlightcs@gmail.com
* @since 1.0.0
*/
public class SysLogLoginExcel {
@Excel(name = "用户操作")
private String operation;
@Excel(name = "状态", replace = {"失败_0", "成功_1", "账号已锁定_1"})
private Integer status;
@Excel(name = "User-Agent")
private String userAgent;
@Excel(name = "操作IP")
private String ip;
@Excel(name = "用户名")
private String createrName;
@Excel(name = "创建时间", format = "yyyy-MM-dd HH:mm:ss")
private Date createDate;
public void setOperation(String operation) {
this.operation = operation;
}
public String getOperation() {
return operation;
}
public void setStatus(Integer status) {
this.status = status;
}
public Integer getStatus() {
return status;
}
public void setUserAgent(String userAgent) {
this.userAgent = userAgent;
}
public String getUserAgent() {
return userAgent;
}
public void setIp(String ip) {
this.ip = ip;
}
public String getIp() {
return ip;
}
public void setCreaterName(String createrName) {
this.createrName = createrName;
}
public String getCreaterName() {
return createrName;
}
public void setCreateDate(Date createDate) {
this.createDate = createDate;
}
public Date getCreateDate() {
return createDate;
}
}
/**
* Copyright (c) 2018 人人开源 All rights reserved.
*
* https://www.renren.io
*
* 版权所有,侵权必究!
*/
package com.ost.micro.modules.log.excel;
import cn.afterturn.easypoi.excel.annotation.Excel;
import java.util.Date;
/**
* 操作日志
*
* @author Mark sunlightcs@gmail.com
* @since 1.0.0
*/
public class SysLogOperationExcel {
@Excel(name = "用户操作")
private String operation;
@Excel(name = "请求URI")
private String requestUri;
@Excel(name = "请求方式")
private String requestMethod;
@Excel(name = "请求参数")
private String requestParams;
@Excel(name = "请求时长(毫秒)")
private Integer requestTime;
@Excel(name = "User-Agent")
private String userAgent;
@Excel(name = "操作IP")
private String ip;
@Excel(name = "状态", replace = {"失败_0", "成功_1"})
private Integer status;
@Excel(name = "用户名")
private String createrName;
@Excel(name = "创建时间", format = "yyyy-MM-dd HH:mm:ss")
private Date createDate;
public void setOperation(String operation) {
this.operation = operation;
}
public String getOperation() {
return operation;
}
public void setRequestUri(String requestUri) {
this.requestUri = requestUri;
}
public String getRequestUri() {
return requestUri;
}
public void setRequestMethod(String requestMethod) {
this.requestMethod = requestMethod;
}
public String getRequestMethod() {
return requestMethod;
}
public void setRequestParams(String requestParams) {
this.requestParams = requestParams;
}
public String getRequestParams() {
return requestParams;
}
public void setRequestTime(Integer requestTime) {
this.requestTime = requestTime;
}
public Integer getRequestTime() {
return requestTime;
}
public void setUserAgent(String userAgent) {
this.userAgent = userAgent;
}
public String getUserAgent() {
return userAgent;
}
public void setIp(String ip) {
this.ip = ip;
}
public String getIp() {
return ip;
}
public void setStatus(Integer status) {
this.status = status;
}
public Integer getStatus() {
return status;
}
public void setCreaterName(String createrName) {
this.createrName = createrName;
}
public String getCreaterName() {
return createrName;
}
public void setCreateDate(Date createDate) {
this.createDate = createDate;
}
public Date getCreateDate() {
return createDate;
}
}
/**
* Copyright (c) 2018 人人开源 All rights reserved.
*
* https://www.renren.io
*
* 版权所有,侵权必究!
*/
package com.ost.micro.modules.log.service;
import com.ost.micro.common.page.PageData;
import com.ost.micro.common.service.BaseService;
import com.ost.micro.modules.log.dto.SysLogErrorDTO;
import com.ost.micro.modules.log.entity.SysLogErrorEntity;
import java.util.List;
import java.util.Map;
/**
* 异常日志
*
* @author Mark sunlightcs@gmail.com
* @since 1.0.0
*/
public interface SysLogErrorService extends BaseService<SysLogErrorEntity> {
PageData<SysLogErrorDTO> page(Map<String, Object> params);
List<SysLogErrorDTO> list(Map<String, Object> params);
void save(SysLogErrorEntity entity);
}
\ No newline at end of file
/**
* Copyright (c) 2018 人人开源 All rights reserved.
*
* https://www.renren.io
*
* 版权所有,侵权必究!
*/
package com.ost.micro.modules.log.service;
import com.ost.micro.common.page.PageData;
import com.ost.micro.common.service.BaseService;
import com.ost.micro.modules.log.dto.SysLogLoginDTO;
import com.ost.micro.modules.log.entity.SysLogLoginEntity;
import java.util.List;
import java.util.Map;
/**
* 登录日志
*
* @author Mark sunlightcs@gmail.com
* @since 1.0.0
*/
public interface SysLogLoginService extends BaseService<SysLogLoginEntity> {
PageData<SysLogLoginDTO> page(Map<String, Object> params);
List<SysLogLoginDTO> list(Map<String, Object> params);
void save(SysLogLoginEntity entity);
}
\ No newline at end of file
/**
* Copyright (c) 2018 人人开源 All rights reserved.
*
* https://www.renren.io
*
* 版权所有,侵权必究!
*/
package com.ost.micro.modules.log.service;
import com.ost.micro.common.page.PageData;
import com.ost.micro.common.service.BaseService;
import com.ost.micro.modules.log.dto.SysLogOperationDTO;
import com.ost.micro.modules.log.entity.SysLogOperationEntity;
import java.util.List;
import java.util.Map;
/**
* 操作日志
*
* @author Mark sunlightcs@gmail.com
* @since 1.0.0
*/
public interface SysLogOperationService extends BaseService<SysLogOperationEntity> {
PageData<SysLogOperationDTO> page(Map<String, Object> params);
List<SysLogOperationDTO> list(Map<String, Object> params);
void save(SysLogOperationEntity entity);
}
\ No newline at end of file
/**
* Copyright (c) 2018 人人开源 All rights reserved.
*
* https://www.renren.io
*
* 版权所有,侵权必究!
*/
package com.ost.micro.modules.log.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.ost.micro.common.constant.Constant;
import com.ost.micro.common.page.PageData;
import com.ost.micro.common.service.impl.BaseServiceImpl;
import com.ost.micro.common.utils.ConvertUtils;
import com.ost.micro.modules.log.dao.SysLogErrorDao;
import com.ost.micro.modules.log.dto.SysLogErrorDTO;
import com.ost.micro.modules.log.entity.SysLogErrorEntity;
import com.ost.micro.modules.log.service.SysLogErrorService;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
import java.util.Map;
/**
* 异常日志
*
* @author Mark sunlightcs@gmail.com
* @since 1.0.0
*/
@Service
public class SysLogErrorServiceImpl extends BaseServiceImpl<SysLogErrorDao, SysLogErrorEntity> implements SysLogErrorService {
@Override
public PageData<SysLogErrorDTO> page(Map<String, Object> params) {
IPage<SysLogErrorEntity> page = baseDao.selectPage(
getPage(params, Constant.CREATE_DATE, false),
getWrapper(params)
);
return getPageData(page, SysLogErrorDTO.class);
}
@Override
public List<SysLogErrorDTO> list(Map<String, Object> params) {
List<SysLogErrorEntity> entityList = baseDao.selectList(getWrapper(params));
return ConvertUtils.sourceToTarget(entityList, SysLogErrorDTO.class);
}
private QueryWrapper<SysLogErrorEntity> getWrapper(Map<String, Object> params){
QueryWrapper<SysLogErrorEntity> wrapper = new QueryWrapper<>();
return wrapper;
}
@Override
@Transactional(rollbackFor = Exception.class)
public void save(SysLogErrorEntity entity) {
insert(entity);
}
}
\ No newline at end of file
/**
* Copyright (c) 2018 人人开源 All rights reserved.
*
* https://www.renren.io
*
* 版权所有,侵权必究!
*/
package com.ost.micro.modules.log.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.ost.micro.common.constant.Constant;
import com.ost.micro.common.page.PageData;
import com.ost.micro.common.service.impl.BaseServiceImpl;
import com.ost.micro.common.utils.ConvertUtils;
import com.ost.micro.modules.log.dao.SysLogLoginDao;
import com.ost.micro.modules.log.dto.SysLogLoginDTO;
import com.ost.micro.modules.log.entity.SysLogLoginEntity;
import com.ost.micro.modules.log.service.SysLogLoginService;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
import java.util.Map;
/**
* 登录日志
*
* @author Mark sunlightcs@gmail.com
* @since 1.0.0
*/
@Service
public class SysLogLoginServiceImpl extends BaseServiceImpl<SysLogLoginDao, SysLogLoginEntity> implements SysLogLoginService {
@Override
public PageData<SysLogLoginDTO> page(Map<String, Object> params) {
IPage<SysLogLoginEntity> page = baseDao.selectPage(
getPage(params, Constant.CREATE_DATE, false),
getWrapper(params)
);
return getPageData(page, SysLogLoginDTO.class);
}
@Override
public List<SysLogLoginDTO> list(Map<String, Object> params) {
List<SysLogLoginEntity> entityList = baseDao.selectList(getWrapper(params));
return ConvertUtils.sourceToTarget(entityList, SysLogLoginDTO.class);
}
private QueryWrapper<SysLogLoginEntity> getWrapper(Map<String, Object> params){
String status = (String) params.get("status");
String createrName = (String) params.get("createrName");
QueryWrapper<SysLogLoginEntity> wrapper = new QueryWrapper<>();
wrapper.eq(StringUtils.isNotBlank(status), "status", status);
wrapper.like(StringUtils.isNotBlank(createrName), "creater_name", createrName);
return wrapper;
}
@Override
@Transactional(rollbackFor = Exception.class)
public void save(SysLogLoginEntity entity) {
insert(entity);
}
}
\ No newline at end of file
/**
* Copyright (c) 2018 人人开源 All rights reserved.
*
* https://www.renren.io
*
* 版权所有,侵权必究!
*/
package com.ost.micro.modules.log.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.ost.micro.common.constant.Constant;
import com.ost.micro.common.page.PageData;
import com.ost.micro.common.service.impl.BaseServiceImpl;
import com.ost.micro.common.utils.ConvertUtils;
import com.ost.micro.modules.log.dao.SysLogOperationDao;
import com.ost.micro.modules.log.dto.SysLogOperationDTO;
import com.ost.micro.modules.log.entity.SysLogOperationEntity;
import com.ost.micro.modules.log.service.SysLogOperationService;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
import java.util.Map;
/**
* 操作日志
*
* @author Mark sunlightcs@gmail.com
* @since 1.0.0
*/
@Service
public class SysLogOperationServiceImpl extends BaseServiceImpl<SysLogOperationDao, SysLogOperationEntity> implements SysLogOperationService {
@Override
public PageData<SysLogOperationDTO> page(Map<String, Object> params) {
IPage<SysLogOperationEntity> page = baseDao.selectPage(
getPage(params, Constant.CREATE_DATE, false),
getWrapper(params)
);
return getPageData(page, SysLogOperationDTO.class);
}
@Override
public List<SysLogOperationDTO> list(Map<String, Object> params) {
List<SysLogOperationEntity> entityList = baseDao.selectList(getWrapper(params));
return ConvertUtils.sourceToTarget(entityList, SysLogOperationDTO.class);
}
private QueryWrapper<SysLogOperationEntity> getWrapper(Map<String, Object> params){
String status = (String) params.get("status");
QueryWrapper<SysLogOperationEntity> wrapper = new QueryWrapper<>();
wrapper.eq(StringUtils.isNotBlank(status), "status", status);
return wrapper;
}
@Override
@Transactional(rollbackFor = Exception.class)
public void save(SysLogOperationEntity entity) {
insert(entity);
}
}
\ No newline at end of file
/**
* Copyright (c) 2018 人人开源 All rights reserved.
*
* https://www.renren.io
*
* 版权所有,侵权必究!
*/
package com.ost.micro.modules.security.config;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class CorsConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("*")
.allowCredentials(true)
.allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS")
.maxAge(3600);
}
}
\ No newline at end of file
/**
* Copyright (c) 2018 人人开源 All rights reserved.
*
* https://www.renren.io
*
* 版权所有,侵权必究!
*/
package com.ost.micro.modules.security.config;
import com.ost.micro.common.xss.XssFilter;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.filter.DelegatingFilterProxy;
import javax.servlet.DispatcherType;
/**
* Filter配置
*
* @author Mark sunlightcs@gmail.com
*/
@Configuration
public class FilterConfig {
@Bean
public FilterRegistrationBean shiroFilterRegistration() {
FilterRegistrationBean registration = new FilterRegistrationBean();
registration.setFilter(new DelegatingFilterProxy("shiroFilter"));
//该值缺省为false,表示生命周期由SpringApplicationContext管理,设置为true则表示由ServletContainer管理
registration.addInitParameter("targetFilterLifecycle", "true");
registration.setEnabled(true);
registration.setOrder(Integer.MAX_VALUE - 1);
registration.addUrlPatterns("/*");
return registration;
}
@Bean
public FilterRegistrationBean xssFilterRegistration() {
FilterRegistrationBean registration = new FilterRegistrationBean();
registration.setDispatcherTypes(DispatcherType.REQUEST);
registration.setFilter(new XssFilter());
registration.addUrlPatterns("/*");
registration.setName("xssFilter");
registration.setOrder(Integer.MAX_VALUE);
return registration;
}
}
/**
* Copyright (c) 2018 人人开源 All rights reserved.
*
* https://www.renren.io
*
* 版权所有,侵权必究!
*/
package com.ost.micro.modules.security.config;
import com.ost.micro.modules.security.oauth2.Oauth2Filter;
import com.ost.micro.modules.security.oauth2.Oauth2Realm;
import org.apache.shiro.mgt.SecurityManager;
import org.apache.shiro.spring.LifecycleBeanPostProcessor;
import org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor;
import org.apache.shiro.spring.web.ShiroFilterFactoryBean;
import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
import org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import javax.servlet.Filter;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;
/**
* Shiro的配置文件
*
* @author Mark sunlightcs@gmail.com
*/
@Configuration
public class ShiroConfig {
@Bean("securityManager")
public SecurityManager securityManager(Oauth2Realm oAuth2Realm) {
DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
securityManager.setRealm(oAuth2Realm);
securityManager.setRememberMeManager(null);
return securityManager;
}
@Bean("shiroFilter")
public ShiroFilterFactoryBean shirFilter(SecurityManager securityManager) {
ShiroFilterFactoryBean shiroFilter = new ShiroFilterFactoryBean();
shiroFilter.setSecurityManager(securityManager);
//oauth过滤
Map<String, Filter> filters = new HashMap<>();
filters.put("oauth2", new Oauth2Filter());
shiroFilter.setFilters(filters);
Map<String, String> filterMap = new LinkedHashMap<>();
filterMap.put("/webjars/**", "anon");
filterMap.put("/druid/**", "anon");
filterMap.put("/login", "anon");
filterMap.put("/swagger/**", "anon");
filterMap.put("/v2/api-docs", "anon");
filterMap.put("/swagger-ui.html", "anon");
filterMap.put("/swagger-resources/**", "anon");
filterMap.put("/service/**", "anon");
filterMap.put("/editor-app/**", "anon");
filterMap.put("/diagram-viewer/**", "anon");
filterMap.put("/modeler.html", "anon");
filterMap.put("/captcha", "anon");
filterMap.put("/favicon.ico", "anon");
filterMap.put("/**", "oauth2");
shiroFilter.setFilterChainDefinitionMap(filterMap);
return shiroFilter;
}
@Bean("lifecycleBeanPostProcessor")
public LifecycleBeanPostProcessor lifecycleBeanPostProcessor() {
return new LifecycleBeanPostProcessor();
}
@Bean
public DefaultAdvisorAutoProxyCreator defaultAdvisorAutoProxyCreator() {
DefaultAdvisorAutoProxyCreator proxyCreator = new DefaultAdvisorAutoProxyCreator();
proxyCreator.setProxyTargetClass(true);
return proxyCreator;
}
@Bean
public AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor(SecurityManager securityManager) {
AuthorizationAttributeSourceAdvisor advisor = new AuthorizationAttributeSourceAdvisor();
advisor.setSecurityManager(securityManager);
return advisor;
}
}
\ No newline at end of file
/**
* Copyright (c) 2018 人人开源 All rights reserved.
*
* https://www.renren.io
*
* 版权所有,侵权必究!
*/
package com.ost.micro.modules.security.controller;
import com.ost.micro.common.exception.ErrorCode;
import com.ost.micro.common.exception.RenException;
import com.ost.micro.common.utils.IpUtils;
import com.ost.micro.common.utils.Result;
import com.ost.micro.common.validator.AssertUtils;
import com.ost.micro.common.validator.ValidatorUtils;
import com.ost.micro.modules.log.entity.SysLogLoginEntity;
import com.ost.micro.modules.log.enums.LoginOperationEnum;
import com.ost.micro.modules.log.enums.LoginStatusEnum;
import com.ost.micro.modules.log.service.SysLogLoginService;
import com.ost.micro.modules.security.dto.LoginDTO;
import com.ost.micro.modules.security.password.PasswordUtils;
import com.ost.micro.modules.security.service.CaptchaService;
import com.ost.micro.modules.security.service.SysUserTokenService;
import com.ost.micro.modules.security.user.SecurityUser;
import com.ost.micro.modules.security.user.UserDetail;
import com.ost.micro.modules.sys.dto.SysUserDTO;
import com.ost.micro.modules.sys.enums.UserStatusEnum;
import com.ost.micro.modules.sys.service.SysUserService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpHeaders;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
import javax.imageio.ImageIO;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
/**
* 登录
*
* @author Mark sunlightcs@gmail.com
*/
@RestController
@Api(tags="登录管理")
@Slf4j
public class LoginController {
@Autowired
private SysUserService sysUserService;
@Autowired
private SysUserTokenService sysUserTokenService;
@Autowired
private CaptchaService captchaService;
@Autowired
private SysLogLoginService sysLogLoginService;
@GetMapping("captcha")
@ApiOperation(value = "验证码", produces="application/octet-stream")
@ApiImplicitParam(paramType = "query", dataType="string", name = "uuid", required = true)
public void captcha(HttpServletResponse response, String uuid)throws IOException {
//uuid不能为空
AssertUtils.isBlank(uuid, ErrorCode.IDENTIFIER_NOT_NULL);
//生成图片验证码
BufferedImage image = captchaService.create(uuid);
response.setHeader("Cache-Control", "no-store, no-cache");
response.setContentType("image/jpeg");
ServletOutputStream out = response.getOutputStream();
ImageIO.write(image, "jpg", out);
out.close();
}
@PostMapping("login")
@ApiOperation(value = "登录")
public Result login(HttpServletRequest request, @RequestBody LoginDTO login) {
log.info("开始登录>>>>>>>>>>>>>>>");
String url = request.getScheme()+"://"+request.getServerName();
log.info("请求url为:{}",url);
//效验数据
ValidatorUtils.validateEntity(login);
//验证码是否正确
boolean flag = captchaService.validate(login.getUuid(), login.getCaptcha());
if(!flag){
return new Result().error(ErrorCode.CAPTCHA_ERROR);
}
//用户信息
Map<String,Object> params = new HashMap<>();
params.put("username",login.getUsername());
params.put("bizId",login.getBizId());
SysUserDTO user = sysUserService.getByUsername(params);
SysLogLoginEntity sysLog = new SysLogLoginEntity();
sysLog.setOperation(LoginOperationEnum.LOGIN.value());
sysLog.setCreateDate(new Date());
sysLog.setIp(IpUtils.getIpAddr(request));
sysLog.setUserAgent(request.getHeader(HttpHeaders.USER_AGENT));
sysLog.setIp(IpUtils.getIpAddr(request));
// 判断是商户登录还是商家登录,通过url去判断
if (url.contains("backmch")) {//商户后台登录
if ("admin".equals(login.getUsername())) {
sysLog.setStatus(LoginStatusEnum.FAIL.value());
sysLog.setCreaterName(login.getUsername());
sysLogLoginService.save(sysLog);
log.info("[admin账号]不能登录商家后台");
throw new RenException(ErrorCode.ACCOUNT_ERROR);
}
if (StringUtils.isEmpty(login.getBizId())) {
log.info("商家号为空或者错误");
sysLog.setStatus(LoginStatusEnum.FAIL.value());
sysLog.setCreaterName(login.getUsername());
sysLogLoginService.save(sysLog);
throw new RenException(ErrorCode.BIZID_ERROR_OR_NULL);
}
}
//用户不存在
if(user == null){
sysLog.setStatus(LoginStatusEnum.FAIL.value());
sysLog.setCreaterName(login.getUsername());
sysLogLoginService.save(sysLog);
throw new RenException(ErrorCode.ACCOUNT_PASSWORD_ERROR);
}
//密码错误
if(!PasswordUtils.matches(login.getPassword(), user.getPassword())){
sysLog.setStatus(LoginStatusEnum.FAIL.value());
sysLog.setCreater(user.getId());
sysLog.setCreaterName(user.getUsername());
sysLogLoginService.save(sysLog);
throw new RenException(ErrorCode.ACCOUNT_PASSWORD_ERROR);
}
//账号停用
if(user.getStatus() == UserStatusEnum.DISABLE.value()){
sysLog.setStatus(LoginStatusEnum.LOCK.value());
sysLog.setCreater(user.getId());
sysLog.setCreaterName(user.getUsername());
sysLogLoginService.save(sysLog);
throw new RenException(ErrorCode.ACCOUNT_DISABLE);
}
//登录成功
sysLog.setStatus(LoginStatusEnum.SUCCESS.value());
sysLog.setCreater(user.getId());
sysLog.setCreaterName(user.getUsername());
sysLogLoginService.save(sysLog);
Result result = sysUserTokenService.createToken(user.getId());
log.info("登录结束>>>>>>>>>>>>>>>result:{}",result);
return result;
}
@PostMapping("logout")
@ApiOperation(value = "退出")
public Result logout(HttpServletRequest request) {
UserDetail user = SecurityUser.getUser();
//退出
sysUserTokenService.logout(user.getId());
//用户信息
SysLogLoginEntity log = new SysLogLoginEntity();
log.setOperation(LoginOperationEnum.LOGOUT.value());
log.setCreateDate(new Date());
log.setIp(IpUtils.getIpAddr(request));
log.setUserAgent(request.getHeader(HttpHeaders.USER_AGENT));
log.setIp(IpUtils.getIpAddr(request));
log.setStatus(LoginStatusEnum.SUCCESS.value());
log.setCreater(user.getId());
log.setCreaterName(user.getUsername());
sysLogLoginService.save(log);
return new Result();
}
}
\ No newline at end of file
/**
* Copyright (c) 2018 人人开源 All rights reserved.
*
* https://www.renren.io
*
* 版权所有,侵权必究!
*/
package com.ost.micro.modules.security.dao;
import com.ost.micro.common.dao.BaseDao;
import com.ost.micro.modules.security.entity.SysUserTokenEntity;
import org.apache.ibatis.annotations.Mapper;
/**
* 系统用户Token
*
* @author Mark sunlightcs@gmail.com
*/
@Mapper
public interface SysUserTokenDao extends BaseDao<SysUserTokenEntity> {
SysUserTokenEntity getByToken(String token);
SysUserTokenEntity getByUserId(String userId);
}
/**
* Copyright (c) 2018 人人开源 All rights reserved.
*
* https://www.renren.io
*
* 版权所有,侵权必究!
*/
package com.ost.micro.modules.security.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import javax.validation.constraints.NotBlank;
import java.io.Serializable;
/**
* 登录表单
*
* @author Mark sunlightcs@gmail.com
*/
@ApiModel(value = "登录表单")
public class LoginDTO implements Serializable {
private static final long serialVersionUID = 1L;
@ApiModelProperty(value = "商户号")
private String bizId;
@ApiModelProperty(value = "用户名", required = true)
@NotBlank(message="{sysuser.username.require}")
private String username;
@ApiModelProperty(value = "密码")
@NotBlank(message="{sysuser.password.require}")
private String password;
@ApiModelProperty(value = "验证码")
@NotBlank(message="{sysuser.captcha.require}")
private String captcha;
@ApiModelProperty(value = "唯一标识")
@NotBlank(message="{sysuser.uuid.require}")
private String uuid;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getCaptcha() {
return captcha;
}
public void setCaptcha(String captcha) {
this.captcha = captcha;
}
public String getUuid() {
return uuid;
}
public void setUuid(String uuid) {
this.uuid = uuid;
}
public String getBizId() {
return bizId;
}
public void setBizId(String bizId) {
this.bizId = bizId;
}
}
\ No newline at end of file
/**
* Copyright (c) 2018 人人开源 All rights reserved.
*
* https://www.renren.io
*
* 版权所有,侵权必究!
*/
package com.ost.micro.modules.security.entity;
import com.baomidou.mybatisplus.annotation.TableName;
import com.ost.micro.common.entity.BaseEntity;
import java.util.Date;
/**
* 系统用户Token
*/
@TableName("sys_user_token")
public class SysUserTokenEntity extends BaseEntity {
private static final long serialVersionUID = 1L;
/**
* 用户ID
*/
private String userId;
/**
* 用户token
*/
private String token;
/**
* 过期时间
*/
private Date expireDate;
/**
* 更新时间
*/
private Date updateDate;
public String getUserId() {
return userId;
}
public void setUserId(String userId) {
this.userId = userId;
}
public String getToken() {
return token;
}
public void setToken(String token) {
this.token = token;
}
public Date getExpireDate() {
return expireDate;
}
public void setExpireDate(Date expireDate) {
this.expireDate = expireDate;
}
public Date getUpdateDate() {
return updateDate;
}
public void setUpdateDate(Date updateDate) {
this.updateDate = updateDate;
}
}
\ No newline at end of file
/**
* Copyright (c) 2018 人人开源 All rights reserved.
*
* https://www.renren.io
*
* 版权所有,侵权必究!
*/
package com.ost.micro.modules.security.oauth2;
import com.google.gson.Gson;
import com.ost.micro.common.constant.Constant;
import com.ost.micro.common.exception.ErrorCode;
import com.ost.micro.common.utils.HttpContextUtils;
import com.ost.micro.common.utils.Result;
import org.apache.commons.lang3.StringUtils;
import org.apache.http.HttpStatus;
import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.AuthenticationToken;
import org.apache.shiro.web.filter.authc.AuthenticatingFilter;
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;
/**
* oauth2过滤器
*
* @author Mark sunlightcs@gmail.com
*/
public class Oauth2Filter extends AuthenticatingFilter {
@Override
protected AuthenticationToken createToken(ServletRequest request, ServletResponse response) throws Exception {
//获取请求token
String token = getRequestToken((HttpServletRequest) request);
if(StringUtils.isBlank(token)){
return null;
}
return new Oauth2Token(token);
}
@Override
protected boolean isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue) {
if(((HttpServletRequest) request).getMethod().equals(RequestMethod.OPTIONS.name())){
return true;
}
return false;
}
@Override
protected boolean onAccessDenied(ServletRequest request, ServletResponse response) throws Exception {
//获取请求token,如果token不存在,直接返回401
String token = getRequestToken((HttpServletRequest) request);
if(StringUtils.isBlank(token)){
HttpServletResponse httpResponse = (HttpServletResponse) response;
httpResponse.setHeader("Access-Control-Allow-Credentials", "true");
httpResponse.setHeader("Access-Control-Allow-Origin", HttpContextUtils.getOrigin());
String json = new Gson().toJson(new Result().error(ErrorCode.UNAUTHORIZED));
httpResponse.getWriter().print(json);
return false;
}
return executeLogin(request, response);
}
@Override
protected boolean onLoginFailure(AuthenticationToken token, AuthenticationException e, ServletRequest request, ServletResponse response) {
HttpServletResponse httpResponse = (HttpServletResponse) response;
httpResponse.setContentType("application/json;charset=utf-8");
httpResponse.setHeader("Access-Control-Allow-Credentials", "true");
httpResponse.setHeader("Access-Control-Allow-Origin", HttpContextUtils.getOrigin());
try {
//处理登录失败的异常
Throwable throwable = e.getCause() == null ? e : e.getCause();
Result r = new Result().error(HttpStatus.SC_UNAUTHORIZED, throwable.getMessage());
String json = new Gson().toJson(r);
httpResponse.getWriter().print(json);
} catch (IOException e1) {
}
return false;
}
/**
* 获取请求的token
*/
private String getRequestToken(HttpServletRequest httpRequest){
//从header中获取token
String token = httpRequest.getHeader(Constant.TOKEN_HEADER);
//如果header中不存在token,则从参数中获取token
if(StringUtils.isBlank(token)){
token = httpRequest.getParameter(Constant.TOKEN_HEADER);
}
return token;
}
}
\ No newline at end of file
/**
* Copyright (c) 2018 人人开源 All rights reserved.
*
* https://www.renren.io
*
* 版权所有,侵权必究!
*/
package com.ost.micro.modules.security.oauth2;
import com.ost.micro.common.exception.ErrorCode;
import com.ost.micro.common.utils.ConvertUtils;
import com.ost.micro.common.utils.MessageUtils;
import com.ost.micro.modules.security.entity.SysUserTokenEntity;
import com.ost.micro.modules.security.service.ShiroService;
import com.ost.micro.modules.security.user.UserDetail;
import com.ost.micro.modules.sys.entity.SysUserEntity;
import org.apache.shiro.authc.*;
import org.apache.shiro.authz.AuthorizationInfo;
import org.apache.shiro.authz.SimpleAuthorizationInfo;
import org.apache.shiro.realm.AuthorizingRealm;
import org.apache.shiro.subject.PrincipalCollection;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.List;
import java.util.Set;
/**
* 认证
*
* @author Mark sunlightcs@gmail.com
*/
@Component
public class Oauth2Realm extends AuthorizingRealm {
@Autowired
private ShiroService shiroService;
@Override
public boolean supports(AuthenticationToken token) {
return token instanceof Oauth2Token;
}
/**
* 授权(验证权限时调用)
*/
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
UserDetail user = (UserDetail)principals.getPrimaryPrincipal();
//用户权限列表
Set<String> permsSet = shiroService.getUserPermissions(user);
SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
info.setStringPermissions(permsSet);
return info;
}
/**
* 认证(登录时调用)
*/
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
String accessToken = (String) token.getPrincipal();
//根据accessToken,查询用户信息
SysUserTokenEntity tokenEntity = shiroService.getByToken(accessToken);
//token失效
if(tokenEntity == null || tokenEntity.getExpireDate().getTime() < System.currentTimeMillis()){
throw new IncorrectCredentialsException(MessageUtils.getMessage(ErrorCode.TOKEN_INVALID));
}
//查询用户信息
SysUserEntity userEntity = shiroService.getUser(tokenEntity.getUserId());
//转换成UserDetail对象
UserDetail userDetail = ConvertUtils.sourceToTarget(userEntity, UserDetail.class);
//获取用户对应的部门数据权限
List<String> deptIdList = shiroService.getDataScopeList(userDetail.getId());
userDetail.setDeptIdList(deptIdList);
//账号锁定
if(userDetail.getStatus() == 0){
throw new LockedAccountException(MessageUtils.getMessage(ErrorCode.ACCOUNT_LOCK));
}
SimpleAuthenticationInfo info = new SimpleAuthenticationInfo(userDetail, accessToken, getName());
return info;
}
}
\ No newline at end of file
/**
* Copyright (c) 2018 人人开源 All rights reserved.
*
* https://www.renren.io
*
* 版权所有,侵权必究!
*/
package com.ost.micro.modules.security.oauth2;
import org.apache.shiro.authc.AuthenticationToken;
/**
* token
*
* @author Mark sunlightcs@gmail.com
*/
public class Oauth2Token implements AuthenticationToken {
private String token;
public Oauth2Token(String token){
this.token = token;
}
@Override
public String getPrincipal() {
return token;
}
@Override
public Object getCredentials() {
return token;
}
}
/**
* Copyright (c) 2018 人人开源 All rights reserved.
*
* https://www.renren.io
*
* 版权所有,侵权必究!
*/
package com.ost.micro.modules.security.oauth2;
import com.ost.micro.common.exception.RenException;
import java.security.MessageDigest;
import java.util.UUID;
/**
* 生成token
*
* @author Mark sunlightcs@gmail.com
*/
public class TokenGenerator {
public static String generateValue() {
return generateValue(UUID.randomUUID().toString());
}
private static final char[] HEX_CODE = "0123456789abcdef".toCharArray();
public static String toHexString(byte[] data) {
if(data == null) {
return null;
}
StringBuilder r = new StringBuilder(data.length*2);
for ( byte b : data) {
r.append(HEX_CODE[(b >> 4) & 0xF]);
r.append(HEX_CODE[(b & 0xF)]);
}
return r.toString();
}
public static String generateValue(String param) {
try {
MessageDigest algorithm = MessageDigest.getInstance("MD5");
algorithm.reset();
algorithm.update(param.getBytes());
byte[] messageDigest = algorithm.digest();
return toHexString(messageDigest);
} catch (Exception e) {
throw new RenException("token invalid", e);
}
}
}
package com.ost.micro.modules.security.password;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import java.security.SecureRandom;
import java.util.regex.Pattern;
/**
* Implementation of PasswordEncoder that uses the BCrypt strong hashing function. Clients
* can optionally supply a "strength" (a.k.a. log rounds in BCrypt) and a SecureRandom
* instance. The larger the strength parameter the more work will have to be done
* (exponentially) to hash the passwords. The default value is 10.
*
* @author Dave Syer
*
*/
public class BCryptPasswordEncoder implements PasswordEncoder {
private Pattern BCRYPT_PATTERN = Pattern
.compile("\\A\\$2a?\\$\\d\\d\\$[./0-9A-Za-z]{53}");
private final Log logger = LogFactory.getLog(getClass());
private final int strength;
private final SecureRandom random;
public BCryptPasswordEncoder() {
this(-1);
}
/**
* @param strength the log rounds to use, between 4 and 31
*/
public BCryptPasswordEncoder(int strength) {
this(strength, null);
}
/**
* @param strength the log rounds to use, between 4 and 31
* @param random the secure random instance to use
*
*/
public BCryptPasswordEncoder(int strength, SecureRandom random) {
if (strength != -1 && (strength < BCrypt.MIN_LOG_ROUNDS || strength > BCrypt.MAX_LOG_ROUNDS)) {
throw new IllegalArgumentException("Bad strength");
}
this.strength = strength;
this.random = random;
}
@Override
public String encode(CharSequence rawPassword) {
String salt;
if (strength > 0) {
if (random != null) {
salt = BCrypt.gensalt(strength, random);
}
else {
salt = BCrypt.gensalt(strength);
}
}
else {
salt = BCrypt.gensalt();
}
return BCrypt.hashpw(rawPassword.toString(), salt);
}
@Override
public boolean matches(CharSequence rawPassword, String encodedPassword) {
if (encodedPassword == null || encodedPassword.length() == 0) {
logger.warn("Empty encoded password");
return false;
}
if (!BCRYPT_PATTERN.matcher(encodedPassword).matches()) {
logger.warn("Encoded password does not look like BCrypt");
return false;
}
return BCrypt.checkpw(rawPassword.toString(), encodedPassword);
}
}
\ No newline at end of file
package com.ost.micro.modules.security.password;
/**
* Service interface for encoding passwords.
*
* The preferred implementation is {@code BCryptPasswordEncoder}.
*
* @author Keith Donald
*/
public interface PasswordEncoder {
/**
* Encode the raw password. Generally, a good encoding algorithm applies a SHA-1 or
* greater hash combined with an 8-byte or greater randomly generated salt.
*/
String encode(CharSequence rawPassword);
/**
* Verify the encoded password obtained from storage matches the submitted raw
* password after it too is encoded. Returns true if the passwords match, false if
* they do not. The stored password itself is never decoded.
*
* @param rawPassword the raw password to encode and match
* @param encodedPassword the encoded password from storage to compare with
* @return true if the raw password, after encoding, matches the encoded password from
* storage
*/
boolean matches(CharSequence rawPassword, String encodedPassword);
}
/**
* Copyright 2018 人人开源 https://www.renren.io
* <p>
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
* <p>
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
* <p>
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.ost.micro.modules.security.password;
/**
* 密码工具类
*
* @author Mark sunlightcs@gmail.com
* @since 1.0.0
*/
public class PasswordUtils {
private static PasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
/**
* 加密
* @param str 字符串
* @return 返回加密字符串
*/
public static String encode(String str){
return passwordEncoder.encode(str);
}
/**
* 比较密码是否相等
* @param str 明文密码
* @param password 加密后密码
* @return true:成功 false:失败
*/
public static boolean matches(String str, String password){
return passwordEncoder.matches(str, password);
}
public static void main(String[] args) {
String str = "common";
String password = encode(str);
System.out.println(password);
System.out.println(matches(str, password));
}
}
/**
* Copyright (c) 2018 人人开源 All rights reserved.
*
* https://www.renren.io
*
* 版权所有,侵权必究!
*/
package com.ost.micro.modules.security.service;
import java.awt.image.BufferedImage;
/**
* 验证码
*
* @author Mark sunlightcs@gmail.com
*/
public interface CaptchaService {
/**
* 图片验证码
*/
BufferedImage create(String uuid);
/**
* 验证码效验
* @param uuid uuid
* @param code 验证码
* @return true:成功 false:失败
*/
boolean validate(String uuid, String code);
}
/**
* Copyright (c) 2018 人人开源 All rights reserved.
*
* https://www.renren.io
*
* 版权所有,侵权必究!
*/
package com.ost.micro.modules.security.service;
import com.ost.micro.modules.security.entity.SysUserTokenEntity;
import com.ost.micro.modules.security.user.UserDetail;
import com.ost.micro.modules.sys.entity.SysUserEntity;
import java.util.List;
import java.util.Set;
/**
* shiro相关接口
*
* @author Mark sunlightcs@gmail.com
*/
public interface ShiroService {
/**
* 获取用户权限列表
*/
Set<String> getUserPermissions(UserDetail user);
SysUserTokenEntity getByToken(String token);
/**
* 根据用户ID,查询用户
* @param userId
*/
SysUserEntity getUser(String userId);
/**
* 获取用户对应的部门数据权限
* @param userId 用户ID
* @return 返回部门ID列表
*/
List<String> getDataScopeList(String userId);
}
/**
* Copyright (c) 2018 人人开源 All rights reserved.
*
* https://www.renren.io
*
* 版权所有,侵权必究!
*/
package com.ost.micro.modules.security.service;
import com.ost.micro.common.service.BaseService;
import com.ost.micro.common.utils.Result;
import com.ost.micro.modules.security.entity.SysUserTokenEntity;
/**
* 用户Token
*
* @author Mark sunlightcs@gmail.com
*/
public interface SysUserTokenService extends BaseService<SysUserTokenEntity> {
/**
* 生成token
* @param userId 用户ID
*/
Result createToken(String userId);
/**
* 退出,修改token值
* @param userId 用户ID
*/
void logout(String userId);
}
\ No newline at end of file
/**
* Copyright (c) 2018 人人开源 All rights reserved.
*
* https://www.renren.io
*
* 版权所有,侵权必究!
*/
package com.ost.micro.modules.security.service.impl;
import com.google.code.kaptcha.Producer;
import com.google.common.cache.Cache;
import com.google.common.cache.CacheBuilder;
import com.ost.micro.common.redis.RedisKeys;
import com.ost.micro.common.redis.RedisUtils;
import com.ost.micro.modules.security.service.CaptchaService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import java.awt.image.BufferedImage;
import java.util.concurrent.TimeUnit;
/**
* 验证码
*
* @author Mark sunlightcs@gmail.com
*/
@Service
public class CaptchaServiceImpl implements CaptchaService {
@Autowired
private Producer producer;
@Autowired
private RedisUtils redisUtils;
@Value("${renren.redis.open: false}")
private boolean open;
/**
* Local Cache 5分钟过期
*/
Cache<String, String> localCache = CacheBuilder.newBuilder().maximumSize(1000).expireAfterAccess(5, TimeUnit.MINUTES).build();
@Override
public BufferedImage create(String uuid) {
//生成文字验证码
String code = producer.createText();
//保存到缓存
setCache(uuid, code);
return producer.createImage(code);
}
@Override
public boolean validate(String uuid, String code) {
//获取验证码
String captcha = getCache(uuid);
//效验成功
if(code.equalsIgnoreCase(captcha)){
return true;
}
return false;
}
private void setCache(String key, String value){
if(open){
key = RedisKeys.getCaptchaKey(key);
redisUtils.set(key, value, 300);
}else{
localCache.put(key, value);
}
}
private String getCache(String key){
if(open){
key = RedisKeys.getCaptchaKey(key);
String captcha = (String)redisUtils.get(key);
//删除验证码
if(captcha != null){
redisUtils.delete(key);
}
return captcha;
}
String captcha = localCache.getIfPresent(key);
//删除验证码
if(captcha != null){
localCache.invalidate(key);
}
return captcha;
}
}
\ No newline at end of file
/**
* Copyright (c) 2018 人人开源 All rights reserved.
*
* https://www.renren.io
*
* 版权所有,侵权必究!
*/
package com.ost.micro.modules.security.service.impl;
import com.ost.micro.modules.security.dao.SysUserTokenDao;
import com.ost.micro.modules.security.entity.SysUserTokenEntity;
import com.ost.micro.modules.security.service.ShiroService;
import com.ost.micro.modules.security.user.UserDetail;
import com.ost.micro.modules.sys.dao.SysMenuDao;
import com.ost.micro.modules.sys.dao.SysRoleDataScopeDao;
import com.ost.micro.modules.sys.dao.SysUserDao;
import com.ost.micro.modules.sys.entity.SysUserEntity;
import com.ost.micro.modules.sys.enums.SuperAdminEnum;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
@Service
public class ShiroServiceImpl implements ShiroService {
@Autowired
private SysMenuDao sysMenuDao;
@Autowired
private SysUserDao sysUserDao;
@Autowired
private SysUserTokenDao sysUserTokenDao;
@Autowired
private SysRoleDataScopeDao sysRoleDataScopeDao;
@Override
public Set<String> getUserPermissions(UserDetail user) {
//系统管理员,拥有最高权限
List<String> permissionsList;
if(user.getSuperAdmin() == SuperAdminEnum.YES.value()) {
permissionsList = sysMenuDao.getPermissionsList();
}else{
permissionsList = sysMenuDao.getUserPermissionsList(user.getId());
}
//用户权限列表
Set<String> permsSet = new HashSet<>();
for(String permissions : permissionsList){
if(StringUtils.isBlank(permissions)){
continue;
}
permsSet.addAll(Arrays.asList(permissions.trim().split(",")));
}
return permsSet;
}
/* @Override
public Set<String> getUserPermissions(UserDetail user) {
return null;
}*/
@Override
public SysUserTokenEntity getByToken(String token) {
return sysUserTokenDao.getByToken(token);
}
@Override
public SysUserEntity getUser(String userId) {
return sysUserDao.selectById(userId);
}
@Override
public List<String> getDataScopeList(String userId) {
return sysRoleDataScopeDao.getDataScopeList(userId);
}
}
\ No newline at end of file
/**
* Copyright (c) 2018 人人开源 All rights reserved.
*
* https://www.renren.io
*
* 版权所有,侵权必究!
*/
package com.ost.micro.modules.security.service.impl;
import com.ost.micro.common.constant.Constant;
import com.ost.micro.common.service.impl.BaseServiceImpl;
import com.ost.micro.common.utils.Result;
import com.ost.micro.modules.security.dao.SysUserTokenDao;
import com.ost.micro.modules.security.entity.SysUserTokenEntity;
import com.ost.micro.modules.security.oauth2.TokenGenerator;
import com.ost.micro.modules.security.service.SysUserTokenService;
import org.springframework.stereotype.Service;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
@Service
public class SysUserTokenServiceImpl extends BaseServiceImpl<SysUserTokenDao, SysUserTokenEntity> implements SysUserTokenService {
/**
* 12小时后过期
*/
private final static int EXPIRE = 3600 * 12;
@Override
public Result createToken(String userId) {
//用户token
String token;
//当前时间
Date now = new Date();
//过期时间
Date expireTime = new Date(now.getTime() + EXPIRE * 1000);
//判断是否生成过token
SysUserTokenEntity tokenEntity = baseDao.getByUserId(userId);
if(tokenEntity == null){
//生成一个token
token = TokenGenerator.generateValue();
tokenEntity = new SysUserTokenEntity();
tokenEntity.setUserId(userId);
tokenEntity.setToken(token);
tokenEntity.setUpdateDate(now);
tokenEntity.setExpireDate(expireTime);
//保存token
this.insert(tokenEntity);
}else{
//判断token是否过期
if(tokenEntity.getExpireDate().getTime() < System.currentTimeMillis()){
//token过期,重新生成token
token = TokenGenerator.generateValue();
}else {
token = tokenEntity.getToken();
}
tokenEntity.setToken(token);
tokenEntity.setUpdateDate(now);
tokenEntity.setExpireDate(expireTime);
//更新token
this.updateById(tokenEntity);
}
Map<String, Object> map = new HashMap<>(2);
map.put(Constant.TOKEN_HEADER, token);
map.put("expire", EXPIRE);
return new Result().ok(map);
}
@Override
public void logout(String userId) {
//生成一个token
String token = TokenGenerator.generateValue();
//修改token
SysUserTokenEntity tokenEntity = new SysUserTokenEntity();
tokenEntity.setUserId(userId);
tokenEntity.setToken(token);
this.updateById(tokenEntity);
}
}
\ No newline at end of file
/**
* Copyright (c) 2018 人人开源 All rights reserved.
*
* https://www.renren.io
*
* 版权所有,侵权必究!
*/
package com.ost.micro.modules.security.user;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.subject.Subject;
/**
* 用户
*
* @author Mark sunlightcs@gmail.com
*/
public class SecurityUser {
public static Subject getSubject() {
try {
return SecurityUtils.getSubject();
}catch (Exception e){
return null;
}
}
/**
* 获取用户信息
*/
public static UserDetail getUser() {
Subject subject = getSubject();
if(subject == null){
return new UserDetail();
}
UserDetail user = (UserDetail)subject.getPrincipal();
if(user == null){
return new UserDetail();
}
return user;
}
/**
* 获取用户ID
*/
public static String getUserId() {
return getUser().getId();
}
/**
* 获取部门ID
*/
public static String getDeptId() {
return getUser().getDeptId();
}
}
\ No newline at end of file
/**
* Copyright (c) 2018 人人开源 All rights reserved.
*
* https://www.renren.io
*
* 版权所有,侵权必究!
*/
package com.ost.micro.modules.security.user;
import java.io.Serializable;
import java.util.List;
/**
* 登录用户信息
*
* @author Mark sunlightcs@gmail.com
*/
public class UserDetail implements Serializable {
private static final long serialVersionUID = 1L;
private String id;
private String username;
private String realName;
private String headUrl;
private Integer gender;
private String email;
private String mobile;
private String deptId;
private String password;
private Integer status;
private Integer superAdmin;
/**
* 部门数据权限
*/
private List<String> deptIdList;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getRealName() {
return realName;
}
public void setRealName(String realName) {
this.realName = realName;
}
public String getHeadUrl() {
return headUrl;
}
public void setHeadUrl(String headUrl) {
this.headUrl = headUrl;
}
public Integer getGender() {
return gender;
}
public void setGender(Integer gender) {
this.gender = gender;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getMobile() {
return mobile;
}
public void setMobile(String mobile) {
this.mobile = mobile;
}
public String getDeptId() {
return deptId;
}
public void setDeptId(String deptId) {
this.deptId = deptId;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public Integer getStatus() {
return status;
}
public void setStatus(Integer status) {
this.status = status;
}
public Integer getSuperAdmin() {
return superAdmin;
}
public void setSuperAdmin(Integer superAdmin) {
this.superAdmin = superAdmin;
}
public List<String> getDeptIdList() {
return deptIdList;
}
public void setDeptIdList(List<String> deptIdList) {
this.deptIdList = deptIdList;
}
}
\ No newline at end of file
/**
* Copyright (c) 2018 人人开源 All rights reserved.
*
* https://www.renren.io
*
* 版权所有,侵权必究!
*/
package com.ost.micro.modules.sys.controller;
import com.ost.micro.common.utils.Result;
import com.ost.micro.common.validator.AssertUtils;
import com.ost.micro.common.validator.ValidatorUtils;
import com.ost.micro.common.validator.group.AddGroup;
import com.ost.micro.common.validator.group.DefaultGroup;
import com.ost.micro.common.validator.group.UpdateGroup;
import com.ost.micro.core.utils.DateUtil;
import com.ost.micro.modules.sys.dto.SysDeptDTO;
import com.ost.micro.modules.sys.service.SysDeptService;
import com.ost.micro.securitycommon.annotation.LogOperation;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
/**
* 部门管理
*
* @author Mark sunlightcs@gmail.com
*/
@RestController
@RequestMapping("/sys/dept")
@Api(tags="部门管理")
public class SysDeptController {
@Autowired
private SysDeptService sysDeptService;
@GetMapping("list")
@ApiOperation("列表")
@RequiresPermissions("sys:dept:list")
public Result<List<SysDeptDTO>> list(){
List<SysDeptDTO> list = sysDeptService.list(new HashMap<>(1));
return new Result<List<SysDeptDTO>>().ok(list);
}
@GetMapping("{id}")
@ApiOperation("信息")
@RequiresPermissions("sys:dept:info")
public Result<SysDeptDTO> get(@PathVariable("id") String id){
SysDeptDTO data = sysDeptService.get(id);
return new Result<SysDeptDTO>().ok(data);
}
@PostMapping
@ApiOperation("保存")
@LogOperation("保存")
@RequiresPermissions("sys:dept:save")
public Result save(@RequestBody SysDeptDTO dto){
dto.setDeptNum(DateUtil.getDateFormat(new Date(),"yyyyMMddHHmmss"));
//效验数据
ValidatorUtils.validateEntity(dto, AddGroup.class, DefaultGroup.class);
sysDeptService.save(dto);
return new Result();
}
@PutMapping
@ApiOperation("修改")
@LogOperation("修改")
@RequiresPermissions("sys:dept:update")
public Result update(@RequestBody SysDeptDTO dto){
//效验数据
ValidatorUtils.validateEntity(dto, UpdateGroup.class, DefaultGroup.class);
sysDeptService.update(dto);
return new Result();
}
@DeleteMapping("{id}")
@ApiOperation("删除")
@LogOperation("删除")
@RequiresPermissions("sys:dept:delete")
public Result delete(@PathVariable("id") String id){
//效验数据
AssertUtils.isNull(id, "id");
sysDeptService.delete(id);
return new Result();
}
}
\ No newline at end of file
/**
* Copyright (c) 2018 人人开源 All rights reserved.
*
* https://www.renren.io
*
* 版权所有,侵权必究!
*/
package com.ost.micro.modules.sys.controller;
import com.ost.micro.common.constant.Constant;
import com.ost.micro.common.page.PageData;
import com.ost.micro.common.utils.Result;
import com.ost.micro.common.validator.AssertUtils;
import com.ost.micro.common.validator.ValidatorUtils;
import com.ost.micro.common.validator.group.DefaultGroup;
import com.ost.micro.common.validator.group.UpdateGroup;
import com.ost.micro.modules.sys.dto.SysDictDTO;
import com.ost.micro.modules.sys.service.SysDictService;
import com.ost.micro.securitycommon.annotation.LogOperation;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import springfox.documentation.annotations.ApiIgnore;
import java.util.List;
import java.util.Map;
/**
* 数据字典
*
* @author Mark sunlightcs@gmail.com
* @since 1.0.0
*/
@RestController
@RequestMapping("sys/dict")
@Api(tags="数据字典")
public class SysDictController {
@Autowired
private SysDictService sysDictService;
@GetMapping("page")
@ApiOperation("字典分类")
@ApiImplicitParams({
@ApiImplicitParam(name = Constant.PAGE, value = "当前页码,从1开始", paramType = "query", required = true, dataType="int") ,
@ApiImplicitParam(name = Constant.LIMIT, value = "每页显示记录数", paramType = "query",required = true, dataType="int") ,
@ApiImplicitParam(name = Constant.ORDER_FIELD, value = "排序字段", paramType = "query", dataType="String") ,
@ApiImplicitParam(name = Constant.ORDER, value = "排序方式,可选值(asc、desc)", paramType = "query", dataType="String") ,
@ApiImplicitParam(name = "dictType", value = "字典类型", paramType = "query", dataType="String"),
@ApiImplicitParam(name = "dictName", value = "字典名称", paramType = "query", dataType="String")
})
@RequiresPermissions("sys:dict:page")
public Result<PageData<SysDictDTO>> page(@ApiIgnore @RequestParam Map<String, Object> params){
//字典分类
PageData<SysDictDTO> page = sysDictService.page(params);
return new Result<PageData<SysDictDTO>>().ok(page);
}
@GetMapping("list")
@ApiOperation("字典分类数据")
@ApiImplicitParams({
@ApiImplicitParam(name = "dictName", value = "字典名称", paramType = "query", dataType="String"),
@ApiImplicitParam(name = "dictValue", value = "字典值", paramType = "query", dataType="String")
})
@RequiresPermissions("sys:dict:page")
public Result<List<SysDictDTO>> list(@ApiIgnore @RequestParam Map<String, Object> params){
//字典分类数据
List<SysDictDTO> list = sysDictService.list(params);
return new Result<List<SysDictDTO>>().ok(list);
}
@GetMapping("{id}")
@ApiOperation("信息")
@RequiresPermissions("sys:dict:info")
public Result<SysDictDTO> get(@PathVariable("id") String id){
SysDictDTO data = sysDictService.get(id);
return new Result<SysDictDTO>().ok(data);
}
@PostMapping
@ApiOperation("保存")
@LogOperation("保存")
@RequiresPermissions("sys:dict:save")
public Result save(@RequestBody SysDictDTO dto){
//效验数据
ValidatorUtils.validateEntity(dto, DefaultGroup.class);
sysDictService.save(dto);
return new Result();
}
@PutMapping
@ApiOperation("修改")
@LogOperation("修改")
@RequiresPermissions("sys:dict:update")
public Result update(@RequestBody SysDictDTO dto){
//效验数据
ValidatorUtils.validateEntity(dto, UpdateGroup.class, DefaultGroup.class);
sysDictService.update(dto);
return new Result();
}
@DeleteMapping
@ApiOperation("删除")
@LogOperation("删除")
@RequiresPermissions("sys:dict:delete")
public Result delete(@RequestBody String[] ids){
//效验数据
AssertUtils.isArrayEmpty(ids, "id");
sysDictService.delete(ids);
return new Result();
}
}
\ No newline at end of file
/**
* Copyright (c) 2018 人人开源 All rights reserved.
*
* https://www.renren.io
*
* 版权所有,侵权必究!
*/
package com.ost.micro.modules.sys.controller;
import com.ost.micro.common.exception.ErrorCode;
import com.ost.micro.common.utils.Result;
import com.ost.micro.common.validator.AssertUtils;
import com.ost.micro.common.validator.ValidatorUtils;
import com.ost.micro.common.validator.group.DefaultGroup;
import com.ost.micro.core.utils.DateUtil;
import com.ost.micro.modules.security.service.ShiroService;
import com.ost.micro.modules.security.user.SecurityUser;
import com.ost.micro.modules.security.user.UserDetail;
import com.ost.micro.modules.sys.dto.SysMenuDTO;
import com.ost.micro.modules.sys.enums.MenuTypeEnum;
import com.ost.micro.modules.sys.service.SysMenuService;
import com.ost.micro.securitycommon.annotation.LogOperation;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiOperation;
import org.apache.commons.lang.StringUtils;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.Date;
import java.util.List;
import java.util.Set;
/**
* 菜单管理
*
* @author Mark sunlightcs@gmail.com
*/
@RestController
@RequestMapping("/sys/menu")
@Api(tags="菜单管理")
public class SysMenuController {
@Autowired
private SysMenuService sysMenuService;
@Autowired
private ShiroService shiroService;
@GetMapping("nav")
@ApiOperation("导航")
public Result<List<SysMenuDTO>> nav(){
UserDetail user = SecurityUser.getUser();
List<SysMenuDTO> list = sysMenuService.getUserMenuList(user, MenuTypeEnum.MENU.value());
return new Result<List<SysMenuDTO>>().ok(list);
}
@GetMapping("permissions")
@ApiOperation("权限标识")
public Result<Set<String>> permissions(){
UserDetail user = SecurityUser.getUser();
Set<String> set = shiroService.getUserPermissions(user);
return new Result<Set<String>>().ok(set);
}
@GetMapping("list")
@ApiOperation("列表")
@ApiImplicitParam(name = "type", value = "菜单类型 0:菜单 1:按钮 null:全部", paramType = "query", dataType="int")
@RequiresPermissions("sys:menu:list")
public Result<List<SysMenuDTO>> list(Integer type){
List<SysMenuDTO> list = sysMenuService.getAllMenuList(type);
return new Result<List<SysMenuDTO>>().ok(list);
}
@GetMapping("{id}")
@ApiOperation("信息")
@RequiresPermissions("sys:menu:info")
public Result<SysMenuDTO> get(@PathVariable("id") String id){
SysMenuDTO data = sysMenuService.get(id);
return new Result<SysMenuDTO>().ok(data);
}
@PostMapping
@ApiOperation("保存")
@LogOperation("保存")
@RequiresPermissions("sys:menu:save")
public Result save(@RequestBody SysMenuDTO dto){
//效验数据
dto.setMenuNum(DateUtil.getDateFormat(new Date(),"yyyyMMddHHmmss"));
ValidatorUtils.validateEntity(dto, DefaultGroup.class);
sysMenuService.save(dto);
return new Result();
}
@PutMapping
@ApiOperation("修改")
@LogOperation("修改")
@RequiresPermissions("sys:menu:update")
public Result update(@RequestBody SysMenuDTO dto){
//效验数据
ValidatorUtils.validateEntity(dto, DefaultGroup.class);
sysMenuService.update(dto);
return new Result();
}
@DeleteMapping("{id}")
@ApiOperation("删除")
@LogOperation("删除")
@RequiresPermissions("sys:menu:delete")
public Result delete(@PathVariable("id") String id){
//效验数据
AssertUtils.isNull(id, "id");
//判断是否有子菜单或按钮
List<SysMenuDTO> list = sysMenuService.getListPid(id);
if(list.size() > 0){
return new Result().error(ErrorCode.SUB_MENU_EXIST);
}
sysMenuService.delete(id);
return new Result();
}
@GetMapping("select")
@ApiOperation("角色菜单权限")
@RequiresPermissions("sys:menu:select")
public Result<List<SysMenuDTO>> select(){
UserDetail user = SecurityUser.getUser();
List<SysMenuDTO> list = sysMenuService.getUserMenuList(user, null);
return new Result<List<SysMenuDTO>>().ok(list);
}
}
\ No newline at end of file
/**
* Copyright (c) 2018 人人开源 All rights reserved.
*
* https://www.renren.io
*
* 版权所有,侵权必究!
*/
package com.ost.micro.modules.sys.controller;
import com.ost.micro.common.constant.Constant;
import com.ost.micro.common.page.PageData;
import com.ost.micro.common.utils.Result;
import com.ost.micro.common.validator.AssertUtils;
import com.ost.micro.common.validator.ValidatorUtils;
import com.ost.micro.common.validator.group.AddGroup;
import com.ost.micro.common.validator.group.DefaultGroup;
import com.ost.micro.common.validator.group.UpdateGroup;
import com.ost.micro.modules.sys.dto.SysParamsDTO;
import com.ost.micro.modules.sys.excel.SysParamsExcel;
import com.ost.micro.modules.sys.service.SysParamsService;
import com.ost.micro.securitycommon.annotation.LogOperation;
import com.ost.micro.securitycommon.utils.ExcelUtils;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import springfox.documentation.annotations.ApiIgnore;
import javax.servlet.http.HttpServletResponse;
import java.util.List;
import java.util.Map;
/**
* 参数管理
*
* @author Mark sunlightcs@gmail.com
* @since 1.0.0
*/
@RestController
@RequestMapping("sys/params")
@Api(tags="参数管理")
public class SysParamsController {
@Autowired
private SysParamsService sysParamsService;
@GetMapping("page")
@ApiOperation("分页")
@ApiImplicitParams({
@ApiImplicitParam(name = Constant.PAGE, value = "当前页码,从1开始", paramType = "query", required = true, dataType="int") ,
@ApiImplicitParam(name = Constant.LIMIT, value = "每页显示记录数", paramType = "query",required = true, dataType="int") ,
@ApiImplicitParam(name = Constant.ORDER_FIELD, value = "排序字段", paramType = "query", dataType="String") ,
@ApiImplicitParam(name = Constant.ORDER, value = "排序方式,可选值(asc、desc)", paramType = "query", dataType="String") ,
@ApiImplicitParam(name = "paramCode", value = "参数编码", paramType = "query", dataType="String")
})
@RequiresPermissions("sys:params:page")
public Result<PageData<SysParamsDTO>> page(@ApiIgnore @RequestParam Map<String, Object> params){
PageData<SysParamsDTO> page = sysParamsService.page(params);
return new Result<PageData<SysParamsDTO>>().ok(page);
}
@GetMapping("{id}")
@ApiOperation("信息")
@RequiresPermissions("sys:params:info")
public Result<SysParamsDTO> get(@PathVariable("id") String id){
SysParamsDTO data = sysParamsService.get(id);
return new Result<SysParamsDTO>().ok(data);
}
@PostMapping
@ApiOperation("保存")
@LogOperation("保存")
@RequiresPermissions("sys:params:save")
public Result save(@RequestBody SysParamsDTO dto){
//效验数据
ValidatorUtils.validateEntity(dto, AddGroup.class, DefaultGroup.class);
sysParamsService.save(dto);
return new Result();
}
@PutMapping
@ApiOperation("修改")
@LogOperation("修改")
@RequiresPermissions("sys:params:update")
public Result update(@RequestBody SysParamsDTO dto){
//效验数据
ValidatorUtils.validateEntity(dto, UpdateGroup.class, DefaultGroup.class);
sysParamsService.update(dto);
return new Result();
}
@DeleteMapping
@ApiOperation("删除")
@LogOperation("删除")
@RequiresPermissions("sys:params:delete")
public Result delete(@RequestBody String[] ids){
//效验数据
AssertUtils.isArrayEmpty(ids, "id");
sysParamsService.delete(ids);
return new Result();
}
@GetMapping("export")
@ApiOperation("导出")
@LogOperation("导出")
@RequiresPermissions("sys:params:export")
@ApiImplicitParam(name = "paramCode", value = "参数编码", paramType = "query", dataType="String")
public void export(@ApiIgnore @RequestParam Map<String, Object> params, HttpServletResponse response) throws Exception {
List<SysParamsDTO> list = sysParamsService.list(params);
ExcelUtils.exportExcelToTarget(response, null, list, SysParamsExcel.class);
}
}
\ No newline at end of file
/**
* Copyright (c) 2018 人人开源 All rights reserved.
*
* https://www.renren.io
*
* 版权所有,侵权必究!
*/
package com.ost.micro.modules.sys.controller;
import com.ost.micro.common.constant.Constant;
import com.ost.micro.common.page.PageData;
import com.ost.micro.common.utils.Result;
import com.ost.micro.common.validator.AssertUtils;
import com.ost.micro.common.validator.ValidatorUtils;
import com.ost.micro.common.validator.group.AddGroup;
import com.ost.micro.common.validator.group.DefaultGroup;
import com.ost.micro.common.validator.group.UpdateGroup;
import com.ost.micro.core.utils.DateUtil;
import com.ost.micro.modules.sys.dto.SysRoleDTO;
import com.ost.micro.modules.sys.service.SysRoleDataScopeService;
import com.ost.micro.modules.sys.service.SysRoleMenuService;
import com.ost.micro.modules.sys.service.SysRoleService;
import com.ost.micro.securitycommon.annotation.LogOperation;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import springfox.documentation.annotations.ApiIgnore;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* 角色管理
*
* @author Mark sunlightcs@gmail.com
*/
@RestController
@RequestMapping("/sys/role")
@Api(tags="角色管理")
public class SysRoleController {
@Autowired
private SysRoleService sysRoleService;
@Autowired
private SysRoleMenuService sysRoleMenuService;
@Autowired
private SysRoleDataScopeService sysRoleDataScopeService;
@GetMapping("page")
@ApiOperation("分页")
@ApiImplicitParams({
@ApiImplicitParam(name = Constant.PAGE, value = "当前页码,从1开始", paramType = "query", required = true, dataType="int") ,
@ApiImplicitParam(name = Constant.LIMIT, value = "每页显示记录数", paramType = "query",required = true, dataType="int") ,
@ApiImplicitParam(name = Constant.ORDER_FIELD, value = "排序字段", paramType = "query", dataType="String") ,
@ApiImplicitParam(name = Constant.ORDER, value = "排序方式,可选值(asc、desc)", paramType = "query", dataType="String") ,
@ApiImplicitParam(name = "name", value = "角色名", paramType = "query", dataType="String")
})
@RequiresPermissions("sys:role:page")
public Result<PageData<SysRoleDTO>> page(@ApiIgnore @RequestParam Map<String, Object> params){
PageData<SysRoleDTO> page = sysRoleService.page(params);
return new Result<PageData<SysRoleDTO>>().ok(page);
}
@GetMapping("list")
@ApiOperation("列表")
@RequiresPermissions("sys:role:list")
public Result<List<SysRoleDTO>> list(){
List<SysRoleDTO> data = sysRoleService.list(new HashMap<>(1));
return new Result<List<SysRoleDTO>>().ok(data);
}
@GetMapping("{id}")
@ApiOperation("信息")
@RequiresPermissions("sys:role:info")
public Result<SysRoleDTO> get(@PathVariable("id") String id){
SysRoleDTO data = sysRoleService.get(id);
//查询角色对应的菜单
List<String> menuIdList = sysRoleMenuService.getMenuIdList(id);
data.setMenuIdList(menuIdList);
//查询角色对应的数据权限
List<String> deptIdList = sysRoleDataScopeService.getDeptIdList(id);
data.setDeptIdList(deptIdList);
return new Result<SysRoleDTO>().ok(data);
}
@PostMapping
@ApiOperation("保存")
@LogOperation("保存")
@RequiresPermissions("sys:role:save")
public Result save(@RequestBody SysRoleDTO dto){
//效验数据
dto.setRoleNum(DateUtil.getDateFormat(new Date(),"yyyyMMddHHmmss"));
ValidatorUtils.validateEntity(dto, AddGroup.class, DefaultGroup.class);
sysRoleService.save(dto);
return new Result();
}
@PutMapping
@ApiOperation("修改")
@LogOperation("修改")
@RequiresPermissions("sys:role:update")
public Result update(@RequestBody SysRoleDTO dto){
//效验数据
ValidatorUtils.validateEntity(dto, UpdateGroup.class, DefaultGroup.class);
sysRoleService.update(dto);
return new Result();
}
@DeleteMapping
@ApiOperation("删除")
@LogOperation("删除")
@RequiresPermissions("sys:role:delete")
public Result delete(@RequestBody String[] ids){
//效验数据
AssertUtils.isArrayEmpty(ids, "id");
sysRoleService.delete(ids);
return new Result();
}
}
\ No newline at end of file
/**
* Copyright (c) 2018 人人开源 All rights reserved.
*
* https://www.renren.io
*
* 版权所有,侵权必究!
*/
package com.ost.micro.modules.sys.controller;
import com.sun.management.OperatingSystemMXBean;
import com.ost.micro.common.utils.Result;
import com.ost.micro.modules.sys.dto.SystemDTO;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import java.lang.management.ManagementFactory;
import java.math.BigDecimal;
import java.math.RoundingMode;
/**
* 系统接口
*
* @author Mark sunlightcs@gmail.com
*/
@RestController
@Api(tags="系统接口")
public class SystemController {
@GetMapping("sys/info")
@ApiOperation("系统信息")
public Result<SystemDTO> info(){
OperatingSystemMXBean osmx = (OperatingSystemMXBean)ManagementFactory.getOperatingSystemMXBean();
SystemDTO dto = new SystemDTO();
dto.setSysTime(System.currentTimeMillis());
dto.setOsName(System.getProperty("os.name"));
dto.setOsArch(System.getProperty("os.arch"));
dto.setOsVersion(System.getProperty("os.version"));
dto.setUserLanguage(System.getProperty("user.language"));
dto.setUserDir(System.getProperty("user.dir"));
dto.setTotalPhysical(osmx.getTotalPhysicalMemorySize()/1024/1024);
dto.setFreePhysical(osmx.getFreePhysicalMemorySize()/1024/1024);
dto.setMemoryRate(BigDecimal.valueOf((1-osmx.getFreePhysicalMemorySize()*1.0/osmx.getTotalPhysicalMemorySize())*100).setScale(2, RoundingMode.HALF_UP));
dto.setProcessors(osmx.getAvailableProcessors());
dto.setJvmName(System.getProperty("java.vm.name"));
dto.setJavaVersion(System.getProperty("java.version"));
dto.setJavaHome(System.getProperty("java.home"));
dto.setJavaTotalMemory(Runtime.getRuntime().totalMemory()/1024/1024);
dto.setJavaFreeMemory(Runtime.getRuntime().freeMemory()/1024/1024);
dto.setJavaMaxMemory(Runtime.getRuntime().maxMemory()/1024/1024);
dto.setUserName(System.getProperty("user.name"));
dto.setSystemCpuLoad(BigDecimal.valueOf(osmx.getSystemCpuLoad()*100).setScale(2, RoundingMode.HALF_UP));
dto.setUserTimezone(System.getProperty("user.timezone"));
return new Result<SystemDTO>().ok(dto);
}
}
\ No newline at end of file
/**
* Copyright (c) 2018 人人开源 All rights reserved.
*
* https://www.renren.io
*
* 版权所有,侵权必究!
*/
package com.ost.micro.modules.sys.dao;
import com.ost.micro.common.dao.BaseDao;
import com.ost.micro.modules.sys.entity.SysDeptEntity;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
import java.util.Map;
/**
* 部门管理
*
* @author Mark sunlightcs@gmail.com
*/
@Mapper
public interface SysDeptDao extends BaseDao<SysDeptEntity> {
List<SysDeptEntity> getList(Map<String, Object> params);
SysDeptEntity getById(String id);
/**
* 获取所有部门的id、pid列表
*/
List<SysDeptEntity> getIdAndPidList();
/**
* 根据部门ID,获取所有子部门ID列表
* @param id 部门ID
*/
List<String> getSubDeptIdList(String id);
}
\ No newline at end of file
/**
* Copyright (c) 2018 人人开源 All rights reserved.
*
* https://www.renren.io
*
* 版权所有,侵权必究!
*/
package com.ost.micro.modules.sys.dao;
import com.ost.micro.common.dao.BaseDao;
import com.ost.micro.modules.sys.entity.SysDictEntity;
import org.apache.ibatis.annotations.Mapper;
/**
* 数据字典
*
* @author Mark sunlightcs@gmail.com
*/
@Mapper
public interface SysDictDao extends BaseDao<SysDictEntity> {
}
/**
* Copyright (c) 2018 人人开源 All rights reserved.
*
* https://www.renren.io
*
* 版权所有,侵权必究!
*/
package com.ost.micro.modules.sys.dao;
import com.ost.micro.common.dao.BaseDao;
import com.ost.micro.modules.sys.entity.SysLanguageEntity;
import org.apache.ibatis.annotations.Mapper;
/**
* 国际化
*
* @author Mark sunlightcs@gmail.com
*/
@Mapper
public interface SysLanguageDao extends BaseDao<SysLanguageEntity> {
SysLanguageEntity getLanguage(SysLanguageEntity entity);
void updateLanguage(SysLanguageEntity entity);
}
\ No newline at end of file
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment