diff --git a/ice-common/ice-common-core/pom.xml b/ice-common/ice-common-core/pom.xml new file mode 100644 index 0000000000000000000000000000000000000000..878847ab171dd89699da6cf03cc17a87be6c5989 --- /dev/null +++ b/ice-common/ice-common-core/pom.xml @@ -0,0 +1,54 @@ + + + 4.0.0 + + com.icedevcloud + ice-common + 0.0.1-SNAPSHOT + + + ice-common-core + 0.0.1-SNAPSHOT + jar + + ice-common-core + + + + cn.hutool + hutool-all + + + + org.springframework.boot + spring-boot-starter-data-redis + + + + org.springframework.cloud + spring-cloud-starter-openfeign + + + + org.springframework.security.oauth.boot + spring-security-oauth2-autoconfigure + + + + com.baomidou + mybatis-plus-annotation + + + + io.swagger + swagger-annotations + + + + javax.servlet + javax.servlet-api + + + + diff --git a/ice-common/ice-common-core/src/main/java/com/icedevcloud/common/mybatis/entity/BaseEntity.java b/ice-common/ice-common-core/src/main/java/com/icedevcloud/common/mybatis/entity/BaseEntity.java new file mode 100644 index 0000000000000000000000000000000000000000..c8ce91e4d585a844dbabcdd147034105cdf4908e --- /dev/null +++ b/ice-common/ice-common-core/src/main/java/com/icedevcloud/common/mybatis/entity/BaseEntity.java @@ -0,0 +1,37 @@ +package com.icedevcloud.common.mybatis.entity; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.time.LocalDateTime; + +@Data +public class BaseEntity implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * ID + */ + @JsonSerialize(using= ToStringSerializer.class) + private Long id; + + /** + * 创建时间 + */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") // TODO 修改常量 + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") // TODO 修改常量 + private LocalDateTime gmtCreate; + + /** + * 更新时间 + */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") // TODO 修改常量 + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") // TODO 修改常量 + private LocalDateTime gmtModified; + +} diff --git a/ice-common/ice-common-core/src/main/java/com/icedevcloud/common/security/component/RAccessDeniedHandler.java b/ice-common/ice-common-core/src/main/java/com/icedevcloud/common/security/component/RAccessDeniedHandler.java new file mode 100644 index 0000000000000000000000000000000000000000..7c878cbb3779d16b1a8cd6e366ae512c34987733 --- /dev/null +++ b/ice-common/ice-common-core/src/main/java/com/icedevcloud/common/security/component/RAccessDeniedHandler.java @@ -0,0 +1,45 @@ +package com.icedevcloud.common.security.component; + +import com.icedevcloud.common.core.api.R; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.security.access.AccessDeniedException; +import org.springframework.security.oauth2.common.exceptions.OAuth2Exception; +import org.springframework.security.oauth2.provider.error.*; +import org.springframework.security.web.access.AccessDeniedHandler; +import org.springframework.web.context.request.ServletWebRequest; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +/** + * 自定义访问拒绝 + */ +public class RAccessDeniedHandler extends AbstractOAuth2SecurityExceptionHandler implements AccessDeniedHandler { + + private WebResponseExceptionTranslator exceptionTranslator = new DefaultWebResponseExceptionTranslator(); + + private OAuth2ExceptionRenderer exceptionRenderer = new DefaultOAuth2ExceptionRenderer(); + + @Override + public void handle(HttpServletRequest request, HttpServletResponse response, AccessDeniedException authException) throws IOException, ServletException { + try { + ResponseEntity translate = exceptionTranslator.translate(authException); + R objectR = new R<>(); + objectR.setCode(translate.getStatusCodeValue()); + objectR.setData(translate.getBody()); + objectR.setMessage(translate.getBody().getMessage()); + ResponseEntity responseEntity = enhanceResponse(translate, authException); + HttpHeaders headers = responseEntity.getHeaders(); + HttpStatus statusCode = responseEntity.getStatusCode(); + ResponseEntity> rResponseEntity = new ResponseEntity>(objectR, headers, statusCode); + exceptionRenderer.handleHttpEntityResponse(rResponseEntity, new ServletWebRequest(request, response)); + } catch (Exception e) { + e.printStackTrace(); + } + } + +} diff --git a/ice-common/ice-common-core/src/main/java/com/icedevcloud/common/security/component/RAuthenticationEntryPoint.java b/ice-common/ice-common-core/src/main/java/com/icedevcloud/common/security/component/RAuthenticationEntryPoint.java new file mode 100644 index 0000000000000000000000000000000000000000..7c09b4b0922a84ea44c89b945d971571ae16bed8 --- /dev/null +++ b/ice-common/ice-common-core/src/main/java/com/icedevcloud/common/security/component/RAuthenticationEntryPoint.java @@ -0,0 +1,45 @@ +package com.icedevcloud.common.security.component; + +import com.icedevcloud.common.core.api.R; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.security.core.AuthenticationException; +import org.springframework.security.oauth2.common.exceptions.OAuth2Exception; +import org.springframework.security.oauth2.provider.error.*; +import org.springframework.security.web.AuthenticationEntryPoint; +import org.springframework.web.context.request.ServletWebRequest; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +/** + * 自定义未认证处理 + */ +public class RAuthenticationEntryPoint extends AbstractOAuth2SecurityExceptionHandler implements AuthenticationEntryPoint { + + private WebResponseExceptionTranslator exceptionTranslator = new DefaultWebResponseExceptionTranslator(); + + private OAuth2ExceptionRenderer exceptionRenderer = new DefaultOAuth2ExceptionRenderer(); + + @Override + public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException authException) throws IOException, ServletException { + try { + ResponseEntity translate = exceptionTranslator.translate(authException); + R objectR = new R<>(); + objectR.setCode(translate.getStatusCodeValue()); + objectR.setData(translate.getBody()); + objectR.setMessage(translate.getBody().getMessage()); + ResponseEntity responseEntity = enhanceResponse(translate, authException); + HttpHeaders headers = responseEntity.getHeaders(); + HttpStatus statusCode = responseEntity.getStatusCode(); + ResponseEntity> rResponseEntity = new ResponseEntity>(objectR, headers, statusCode); + exceptionRenderer.handleHttpEntityResponse(rResponseEntity, new ServletWebRequest(request, response)); + } catch (Exception e) { + e.printStackTrace(); + } + } + +} diff --git a/ice-common/ice-common-core/src/main/java/com/icedevcloud/common/security/dto/UserDetailsDto.java b/ice-common/ice-common-core/src/main/java/com/icedevcloud/common/security/dto/UserDetailsDto.java new file mode 100644 index 0000000000000000000000000000000000000000..ccf6dd3d2bf76613e2525e26dc75846c079a551f --- /dev/null +++ b/ice-common/ice-common-core/src/main/java/com/icedevcloud/common/security/dto/UserDetailsDto.java @@ -0,0 +1,22 @@ +package com.icedevcloud.common.security.dto; + +import lombok.Data; +import org.springframework.security.core.GrantedAuthority; +import org.springframework.security.core.userdetails.User; + +import java.io.Serializable; +import java.util.Collection; + +@Data +public class UserDetailsDto extends User implements Serializable { + + private static final long serialVersionUID = 1L; + + private Long id; + + public UserDetailsDto(Long id, String username, String password, boolean enabled, boolean accountNonExpired, boolean credentialsNonExpired, boolean accountNonLocked, Collection authorities) { + super(username, password, enabled, accountNonExpired, credentialsNonExpired, accountNonLocked, authorities); + this.id = id; + } + +} diff --git a/ice-common/ice-common-core/src/main/java/com/icedevcloud/common/security/util/SecurityUtils.java b/ice-common/ice-common-core/src/main/java/com/icedevcloud/common/security/util/SecurityUtils.java new file mode 100644 index 0000000000000000000000000000000000000000..6ecf3533fb6466c3a0226e92083162726a1e27e8 --- /dev/null +++ b/ice-common/ice-common-core/src/main/java/com/icedevcloud/common/security/util/SecurityUtils.java @@ -0,0 +1,36 @@ +package com.icedevcloud.common.security.util; + +import com.icedevcloud.common.security.dto.UserDetailsDto; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.context.SecurityContextHolder; + +/** + * Security 工具类获取用户信息 + * + * @author XiaoBingBy + * @date 2019-01-14 23:14 + * @since 1.0 + */ +public class SecurityUtils { + + /** + * 获取 Authentication + * + * @return + */ + public static Authentication getAuthentication() { + return SecurityContextHolder.getContext().getAuthentication(); + } + + /** + * 获取 UserDetailsDto + * + * @return + */ + public static UserDetailsDto getUserDetails() { + Authentication authentication = getAuthentication(); + UserDetailsDto principal = (UserDetailsDto) authentication.getPrincipal(); + return principal; + } + +}