diff --git a/udf-starter-auth/src/main/java/org/itkk/udf/auth/AuthConfig.java b/udf-starter-auth/src/main/java/org/itkk/udf/auth/AuthConfig.java index cad9dd4..1cd0a8f 100644 --- a/udf-starter-auth/src/main/java/org/itkk/udf/auth/AuthConfig.java +++ b/udf-starter-auth/src/main/java/org/itkk/udf/auth/AuthConfig.java @@ -1,5 +1,8 @@ package org.itkk.udf.auth; +import org.itkk.udf.auth.component.DefUserAuthenticationService; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; /** @@ -8,4 +11,15 @@ import org.springframework.context.annotation.Configuration; @Configuration public class AuthConfig { + /** + * defUserAuthenticationService + * + * @return IUserAuthenticationService + */ + @Bean + @ConditionalOnMissingBean(IUserAuthenticationService.class) + public IUserAuthenticationService defUserAuthenticationService() { + return new DefUserAuthenticationService(); + } + } diff --git a/udf-starter-auth/src/main/java/org/itkk/udf/auth/AuthProperties.java b/udf-starter-auth/src/main/java/org/itkk/udf/auth/AuthProperties.java new file mode 100644 index 0000000..8b6d2e2 --- /dev/null +++ b/udf-starter-auth/src/main/java/org/itkk/udf/auth/AuthProperties.java @@ -0,0 +1,45 @@ +package org.itkk.udf.auth; + +import lombok.Data; +import org.itkk.udf.auth.meta.ExcludeServiceMeta; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +import java.util.HashMap; +import java.util.Map; + +/** + * AuthProperties + */ +@Component +@Data +@ConfigurationProperties(prefix = "org.itkk.auth.properties") +public class AuthProperties { + + /** + * 是否单例登录 + */ + private boolean singletonLogin = false; + + /** + * 用户服务排除 + */ + private Map userExcludeService; + + /** + * 客户端服务排除 + */ + private Map clientExcludeServiceMeta; + + /** + * 构造方法 + */ + public AuthProperties() { + userExcludeService = new HashMap<>(); + ExcludeServiceMeta authentication = new ExcludeServiceMeta(); + authentication.setMethod(Constant.USER_AUTHENTICATION_METHOD); + authentication.setUrl(Constant.USER_AUTHENTICATION_URL); + userExcludeService.put("AUTH_USER_1", authentication); + } + +} diff --git a/udf-starter-auth/src/main/java/org/itkk/udf/auth/Constant.java b/udf-starter-auth/src/main/java/org/itkk/udf/auth/Constant.java index 45be9ad..3c788d8 100644 --- a/udf-starter-auth/src/main/java/org/itkk/udf/auth/Constant.java +++ b/udf-starter-auth/src/main/java/org/itkk/udf/auth/Constant.java @@ -14,7 +14,17 @@ package org.itkk.udf.auth; public class Constant { /** - * 描述 : 头信息(rms应用名称) + * 描述 : 用户鉴权url + */ + public static final String USER_AUTHENTICATION_URL = "/service/user"; + + /** + * 描述 : 用户鉴权http方法 + */ + public static final String USER_AUTHENTICATION_METHOD = "POST"; + + /** + * 描述 : 头信息(用户类型) */ public static final String HEADER_USER_TYPE = "userType"; @@ -33,7 +43,6 @@ public class Constant { */ public static final int ORDER_RMS = 10002; - /** * 描述 : 私有化构造函数 */ diff --git a/udf-starter-auth/src/main/java/org/itkk/udf/auth/IUserAuthenticationService.java b/udf-starter-auth/src/main/java/org/itkk/udf/auth/IUserAuthenticationService.java new file mode 100644 index 0000000..01c345f --- /dev/null +++ b/udf-starter-auth/src/main/java/org/itkk/udf/auth/IUserAuthenticationService.java @@ -0,0 +1,16 @@ +package org.itkk.udf.auth; + +import org.itkk.udf.auth.domain.UserAuthenticationModel; +import org.itkk.udf.auth.domain.UserAuthenticationResult; + +public interface IUserAuthenticationService { + + /** + * 用户鉴权 + * + * @param model 用户鉴权输入模型 + * @return 用户鉴权响应模型 + */ + UserAuthenticationResult authentication(UserAuthenticationModel model); + +} diff --git a/udf-starter-auth/src/main/java/org/itkk/udf/auth/component/DefUserAuthenticationService.java b/udf-starter-auth/src/main/java/org/itkk/udf/auth/component/DefUserAuthenticationService.java new file mode 100644 index 0000000..e38ef05 --- /dev/null +++ b/udf-starter-auth/src/main/java/org/itkk/udf/auth/component/DefUserAuthenticationService.java @@ -0,0 +1,16 @@ +package org.itkk.udf.auth.component; + + +import org.itkk.udf.auth.IUserAuthenticationService; +import org.itkk.udf.auth.domain.UserAuthenticationModel; +import org.itkk.udf.auth.domain.UserAuthenticationResult; + +/** + * DefUserAuthenticationService + */ +public class DefUserAuthenticationService implements IUserAuthenticationService { + @Override + public UserAuthenticationResult authentication(UserAuthenticationModel model) { + return null; + } +} diff --git a/udf-starter-auth/src/main/java/org/itkk/udf/auth/domain/UserAuthenticationModel.java b/udf-starter-auth/src/main/java/org/itkk/udf/auth/domain/UserAuthenticationModel.java new file mode 100644 index 0000000..8e25fff --- /dev/null +++ b/udf-starter-auth/src/main/java/org/itkk/udf/auth/domain/UserAuthenticationModel.java @@ -0,0 +1,40 @@ +package org.itkk.udf.auth.domain; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.hibernate.validator.constraints.NotBlank; +import org.springframework.validation.annotation.Validated; + +import java.io.Serializable; + +@ApiModel(description = "用户鉴权输入模型") +@Data +@Validated +public class UserAuthenticationModel implements Serializable { + + /** + * 描述 : ID + */ + private static final long serialVersionUID = 1L; + + /** + * 用户名 + */ + @ApiModelProperty(value = "用户名", required = true, dataType = "string") + @NotBlank + private String userName; + + /** + * 密码 + */ + @ApiModelProperty(value = "密码", required = true, dataType = "string") + @NotBlank + private String password; + + /** + * 强制登录(只在禁止同时登录的模式下有效) + */ + @ApiModelProperty(value = "强制登录(只在禁止同时登录的模式下有效)", required = false, dataType = "boolean") + private boolean forced = false; +} diff --git a/udf-starter-auth/src/main/java/org/itkk/udf/auth/domain/UserAuthenticationResult.java b/udf-starter-auth/src/main/java/org/itkk/udf/auth/domain/UserAuthenticationResult.java new file mode 100644 index 0000000..59a75b0 --- /dev/null +++ b/udf-starter-auth/src/main/java/org/itkk/udf/auth/domain/UserAuthenticationResult.java @@ -0,0 +1,15 @@ +package org.itkk.udf.auth.domain; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@ApiModel(description = "用户鉴权响应模型") +@Data +public class UserAuthenticationResult { + /** + * 授权token + */ + @ApiModelProperty(value = "授权token", required = true, dataType = "string") + private String accessToken; +} diff --git a/udf-starter-auth/src/main/java/org/itkk/udf/auth/filter/AbstractBaseZuulFilter.java b/udf-starter-auth/src/main/java/org/itkk/udf/auth/filter/AbstractBaseZuulFilter.java index 7071bca..e51ae97 100644 --- a/udf-starter-auth/src/main/java/org/itkk/udf/auth/filter/AbstractBaseZuulFilter.java +++ b/udf-starter-auth/src/main/java/org/itkk/udf/auth/filter/AbstractBaseZuulFilter.java @@ -2,12 +2,18 @@ package org.itkk.udf.auth.filter; import com.netflix.zuul.ZuulFilter; import com.netflix.zuul.context.RequestContext; +import org.apache.commons.collections4.MapUtils; import org.apache.commons.lang3.StringUtils; +import org.itkk.udf.auth.AuthProperties; import org.itkk.udf.auth.Constant; import org.itkk.udf.auth.UserType; +import org.itkk.udf.auth.meta.ExcludeServiceMeta; import org.itkk.udf.core.exception.AuthException; +import org.springframework.beans.factory.annotation.Autowired; import javax.servlet.http.HttpServletRequest; +import java.util.Iterator; +import java.util.Map; import static com.netflix.zuul.context.RequestContext.getCurrentContext; @@ -15,6 +21,42 @@ import static com.netflix.zuul.context.RequestContext.getCurrentContext; * AbstractBaseZuulFilter */ public abstract class AbstractBaseZuulFilter extends ZuulFilter { + + /** + * authProperties + */ + @Autowired + private AuthProperties authProperties; + + /** + * 判断排除 + * + * @param targetUserType 目标用户类型 + * @return 是否匹配 + */ + public boolean checkExclude(UserType targetUserType) { + //获得request + RequestContext ctx = getCurrentContext(); + HttpServletRequest request = ctx.getRequest(); + //获得url和method + String url = request.getRequestURI(); + String method = request.getMethod(); + //获得排除列表 + Map map = targetUserType.equals(UserType.USER) ? authProperties.getUserExcludeService() : targetUserType.equals(UserType.CLIENT) ? authProperties.getClientExcludeServiceMeta() : null; + //判空 & 遍历 & 匹配排除规则 + if (MapUtils.isNotEmpty(map)) { + Iterator keys = map.keySet().iterator(); + while (keys.hasNext()) { + ExcludeServiceMeta item = map.get(keys.next()); + if (item.getUrl().equals(url) && item.getMethod().equals(method)) { + return false; + } + } + } + //返回 + return true; + } + /** * 判断用户类型 * diff --git a/udf-starter-auth/src/main/java/org/itkk/udf/auth/filter/client/ClientIdentityFilter.java b/udf-starter-auth/src/main/java/org/itkk/udf/auth/filter/client/ClientIdentityFilter.java index 8bc12e1..3965fcf 100644 --- a/udf-starter-auth/src/main/java/org/itkk/udf/auth/filter/client/ClientIdentityFilter.java +++ b/udf-starter-auth/src/main/java/org/itkk/udf/auth/filter/client/ClientIdentityFilter.java @@ -24,7 +24,7 @@ public class ClientIdentityFilter extends AbstractBaseZuulFilter { @Override public boolean shouldFilter() { - return this.checkUserType(UserType.CLIENT); + return this.checkUserType(UserType.CLIENT) && this.checkExclude(UserType.CLIENT); } @Override diff --git a/udf-starter-auth/src/main/java/org/itkk/udf/auth/filter/client/ClientPurviewFilter.java b/udf-starter-auth/src/main/java/org/itkk/udf/auth/filter/client/ClientPurviewFilter.java index 3cfe050..35eee0d 100644 --- a/udf-starter-auth/src/main/java/org/itkk/udf/auth/filter/client/ClientPurviewFilter.java +++ b/udf-starter-auth/src/main/java/org/itkk/udf/auth/filter/client/ClientPurviewFilter.java @@ -24,7 +24,7 @@ public class ClientPurviewFilter extends AbstractBaseZuulFilter { @Override public boolean shouldFilter() { - return this.checkUserType(UserType.CLIENT); + return this.checkUserType(UserType.CLIENT) && this.checkExclude(UserType.CLIENT); } @Override diff --git a/udf-starter-auth/src/main/java/org/itkk/udf/auth/filter/user/UserIdentityFilter.java b/udf-starter-auth/src/main/java/org/itkk/udf/auth/filter/user/UserIdentityFilter.java index 506f245..51c2810 100644 --- a/udf-starter-auth/src/main/java/org/itkk/udf/auth/filter/user/UserIdentityFilter.java +++ b/udf-starter-auth/src/main/java/org/itkk/udf/auth/filter/user/UserIdentityFilter.java @@ -24,7 +24,7 @@ public class UserIdentityFilter extends AbstractBaseZuulFilter { @Override public boolean shouldFilter() { - return this.checkUserType(UserType.USER); + return this.checkUserType(UserType.USER) && this.checkExclude(UserType.USER); } @Override diff --git a/udf-starter-auth/src/main/java/org/itkk/udf/auth/filter/user/UserPurviewFilter.java b/udf-starter-auth/src/main/java/org/itkk/udf/auth/filter/user/UserPurviewFilter.java index ad786da..0fc2401 100644 --- a/udf-starter-auth/src/main/java/org/itkk/udf/auth/filter/user/UserPurviewFilter.java +++ b/udf-starter-auth/src/main/java/org/itkk/udf/auth/filter/user/UserPurviewFilter.java @@ -24,7 +24,7 @@ public class UserPurviewFilter extends AbstractBaseZuulFilter { @Override public boolean shouldFilter() { - return this.checkUserType(UserType.USER); + return this.checkUserType(UserType.USER) && this.checkExclude(UserType.USER); } @Override diff --git a/udf-starter-auth/src/main/java/org/itkk/udf/auth/meta/ExcludeServiceMeta.java b/udf-starter-auth/src/main/java/org/itkk/udf/auth/meta/ExcludeServiceMeta.java new file mode 100644 index 0000000..37528ab --- /dev/null +++ b/udf-starter-auth/src/main/java/org/itkk/udf/auth/meta/ExcludeServiceMeta.java @@ -0,0 +1,19 @@ +package org.itkk.udf.auth.meta; + +import lombok.Data; + +/** + * ExcludeServiceMeta + */ +@Data +public class ExcludeServiceMeta { + /** + * url + */ + private String url; + + /** + * 请求方法 + */ + private String method; +} diff --git a/udf-starter-auth/src/main/java/org/itkk/udf/auth/web/IUserAuthenticationController.java b/udf-starter-auth/src/main/java/org/itkk/udf/auth/web/IUserAuthenticationController.java new file mode 100644 index 0000000..5fc9fa7 --- /dev/null +++ b/udf-starter-auth/src/main/java/org/itkk/udf/auth/web/IUserAuthenticationController.java @@ -0,0 +1,30 @@ +package org.itkk.udf.auth.web; + +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.itkk.udf.auth.Constant; +import org.itkk.udf.auth.domain.UserAuthenticationModel; +import org.itkk.udf.auth.domain.UserAuthenticationResult; +import org.itkk.udf.core.RestResponse; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; + +/** + * IUserAuthenticationController + */ +@Api(value = "用户鉴权服务", consumes = "application/json", produces = "application/json", protocols = "http") +@RequestMapping(value = Constant.USER_AUTHENTICATION_URL) +public interface IUserAuthenticationController { //NOSONAR + + /** + * 用户鉴权 + * + * @param model 用户鉴权输入模型 + * @return 用户鉴权响应模型 + */ + @ApiOperation(value = "AUTH_USER_1", notes = "用户鉴权") + @PostMapping + RestResponse authentication(@RequestBody UserAuthenticationModel model); + +} diff --git a/udf-starter-auth/src/main/java/org/itkk/udf/auth/web/UserAuthenticationController.java b/udf-starter-auth/src/main/java/org/itkk/udf/auth/web/UserAuthenticationController.java new file mode 100644 index 0000000..4215d7a --- /dev/null +++ b/udf-starter-auth/src/main/java/org/itkk/udf/auth/web/UserAuthenticationController.java @@ -0,0 +1,26 @@ +package org.itkk.udf.auth.web; + +import org.itkk.udf.auth.IUserAuthenticationService; +import org.itkk.udf.auth.domain.UserAuthenticationModel; +import org.itkk.udf.auth.domain.UserAuthenticationResult; +import org.itkk.udf.core.RestResponse; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RestController; + +/** + * UserAuthenticationController + */ +@RestController +public class UserAuthenticationController implements IUserAuthenticationController { + /** + * userAuthenticationService + */ + @Autowired + private IUserAuthenticationService userAuthenticationService; + + @Override + public RestResponse authentication(@RequestBody UserAuthenticationModel model) { + return new RestResponse<>(userAuthenticationService.authentication(model)); + } +}