diff --git a/core/src/main/java/com/usthe/sureness/DefaultSurenessConfig.java b/core/src/main/java/com/usthe/sureness/DefaultSurenessConfig.java index f80f3cc76bb8cea5123909469beb3501124f0940..b772ec5edd54752955dba5794a3b9cab41c3e9e4 100644 --- a/core/src/main/java/com/usthe/sureness/DefaultSurenessConfig.java +++ b/core/src/main/java/com/usthe/sureness/DefaultSurenessConfig.java @@ -79,15 +79,15 @@ public class DefaultSurenessConfig { if (SUPPORT_JAX_RS.equals(supportContainer)) { subjectCreates = Arrays.asList( new NoneSubjectJaxRsCreator(), + new DigestSubjectJaxRsCreator(), new BasicSubjectJaxRsCreator(), - new JwtSubjectJaxRsCreator(), - new DigestSubjectJaxRsCreator()); + new JwtSubjectJaxRsCreator()); } else { subjectCreates = Arrays.asList( new NoneSubjectServletCreator(), + new DigestSubjectServletCreator(), new BasicSubjectServletCreator(), - new JwtSubjectServletCreator(), - new DigestSubjectServletCreator()); + new JwtSubjectServletCreator()); } subjectFactory.registerSubjectCreator(subjectCreates); if (logger.isDebugEnabled()) { diff --git a/core/src/main/java/com/usthe/sureness/matcher/PathTreeProvider.java b/core/src/main/java/com/usthe/sureness/matcher/PathTreeProvider.java index 32e55a1a9d723e30ad6409c8f10f5c356d6a9c59..9fe11ceed32bdb6cd39feaa0538e17a13d6e99d5 100644 --- a/core/src/main/java/com/usthe/sureness/matcher/PathTreeProvider.java +++ b/core/src/main/java/com/usthe/sureness/matcher/PathTreeProvider.java @@ -1,6 +1,7 @@ package com.usthe.sureness.matcher; import java.util.Set; +import java.util.concurrent.atomic.AtomicReference; /** * path tree resource data provider @@ -9,6 +10,23 @@ import java.util.Set; */ public interface PathTreeProvider { + /** + * web server context path set, default is null + * Please sync with your server context path settings here + * eg: springboot context path is: server.servlet.context-path = v2 + * tomcat context path is: + */ + AtomicReference contextPathRef = new AtomicReference(); + + /** + * set context path + * Please sync with your server context path settings here + * @param contextPath context path + */ + default void setContextPath(String contextPath) { + contextPathRef.set(contextPath); + } + /** * Interface for loading URL resources. * Can load data from database, text load data, etc. diff --git a/core/src/main/java/com/usthe/sureness/mgt/SurenessSecurityManager.java b/core/src/main/java/com/usthe/sureness/mgt/SurenessSecurityManager.java index 7d6ba5c2b5fcc09a7ab0497b0607343e6ac55b2d..cc76b030416606d924b726c24a4688e987cee08e 100644 --- a/core/src/main/java/com/usthe/sureness/mgt/SurenessSecurityManager.java +++ b/core/src/main/java/com/usthe/sureness/mgt/SurenessSecurityManager.java @@ -58,14 +58,14 @@ public class SurenessSecurityManager implements SecurityManager { } @Override - public SubjectSum checkIn(Subject token) throws BaseSurenessException { + public SubjectSum checkIn(Subject subject) throws BaseSurenessException { // Determine whether the requested resource is a filtered resource // if yes, pass directly - if (pathRoleMatcher.isExcludedResource(token)) { + if (pathRoleMatcher.isExcludedResource(subject)) { return null; } - pathRoleMatcher.matchRole(token); - return processorManager.process(token); + pathRoleMatcher.matchRole(subject); + return processorManager.process(subject); } @Override diff --git a/core/src/main/java/com/usthe/sureness/provider/annotation/AnnotationLoader.java b/core/src/main/java/com/usthe/sureness/provider/annotation/AnnotationLoader.java index 641c2f6696e51052dc7f1a744a989365f62090c8..49048d1c68e7686673a3ec9b445f1fb7794f749d 100644 --- a/core/src/main/java/com/usthe/sureness/provider/annotation/AnnotationLoader.java +++ b/core/src/main/java/com/usthe/sureness/provider/annotation/AnnotationLoader.java @@ -2,6 +2,7 @@ package com.usthe.sureness.provider.annotation; import com.usthe.sureness.matcher.PathTreeProvider; import com.usthe.sureness.util.ClassScanner; +import com.usthe.sureness.util.SurenessCommonUtil; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -76,7 +77,7 @@ public class AnnotationLoader implements PathTreeProvider { } } } - return resource; + return SurenessCommonUtil.attachContextPath(contextPathRef.get(), resource); } @Override @@ -99,7 +100,7 @@ public class AnnotationLoader implements PathTreeProvider { } } } - return resource; + return SurenessCommonUtil.attachContextPath(contextPathRef.get(), resource); } public List getScanPackages() { diff --git a/core/src/main/java/com/usthe/sureness/provider/ducument/DocumentResourceDefaultProvider.java b/core/src/main/java/com/usthe/sureness/provider/ducument/DocumentResourceDefaultProvider.java index f9d18effe25d628c65380b56c5d4b5d387e044e8..f51878fd81d52d0825f9a41166d821d77b8a14ea 100644 --- a/core/src/main/java/com/usthe/sureness/provider/ducument/DocumentResourceDefaultProvider.java +++ b/core/src/main/java/com/usthe/sureness/provider/ducument/DocumentResourceDefaultProvider.java @@ -5,6 +5,7 @@ import com.usthe.sureness.matcher.SurenessLoadDataException; import com.usthe.sureness.provider.DefaultAccount; import com.usthe.sureness.provider.SurenessAccount; import com.usthe.sureness.provider.SurenessAccountProvider; +import com.usthe.sureness.util.SurenessCommonUtil; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -41,10 +42,13 @@ public class DocumentResourceDefaultProvider implements PathTreeProvider, Surene entity = DocumentResourceAccess.loadConfig(); } List resource = entity.getResourceRole(); + Set resourceSet; if (resource != null) { - return new HashSet<>(entity.getResourceRole()); + resourceSet = new HashSet<>(resource); + } else { + resourceSet = new HashSet<>(); } - return new HashSet<>(); + return SurenessCommonUtil.attachContextPath(contextPathRef.get(), resourceSet); } catch (IOException e) { logger.error("load config data from yaml file error: ", e); throw new SurenessLoadDataException(e.getMessage()); @@ -58,14 +62,17 @@ public class DocumentResourceDefaultProvider implements PathTreeProvider, Surene entity = DocumentResourceAccess.loadConfig(); } List resource = entity.getExcludedResource(); + Set resourceSet; if (resource != null) { - return new HashSet<>(resource); + resourceSet = new HashSet<>(resource); + } else { + resourceSet = new HashSet<>(); } + return SurenessCommonUtil.attachContextPath(contextPathRef.get(), resourceSet); } catch (IOException e) { logger.error("load config data from yaml file error: ", e); throw new SurenessLoadDataException(e.getMessage()); } - return new HashSet<>(); } @Override diff --git a/core/src/main/java/com/usthe/sureness/util/SurenessCommonUtil.java b/core/src/main/java/com/usthe/sureness/util/SurenessCommonUtil.java index 9424dd3f0097140a2981ea067c860475473c3ad0..f4b578c9475fd35fd2d563f281b2c2f4a5bb1474 100644 --- a/core/src/main/java/com/usthe/sureness/util/SurenessCommonUtil.java +++ b/core/src/main/java/com/usthe/sureness/util/SurenessCommonUtil.java @@ -1,9 +1,8 @@ package com.usthe.sureness.util; - -import javax.servlet.http.HttpServletRequest; -import javax.ws.rs.container.ContainerRequestContext; import java.util.Random; +import java.util.Set; +import java.util.stream.Collectors; /** * common util @@ -19,31 +18,10 @@ public class SurenessCommonUtil { private static final String IPHONE = "iPhone"; private static final String WINDOWS = "Windows"; private static final String CHROME = "Chrome"; + private static final String PATH_SPLIT = "/"; private static final String RANDOM_CHAR = "abcdefghijklmnopqrstuvwxyz0123456789"; - /** - * Deprecated, suggest use findUserAgent(String userAgent) - * @param request HttpServletRequest - * @return userAgent - */ - @Deprecated - public static String findUserAgent(HttpServletRequest request) { - String userAgent = request.getHeader(USER_AGENT); - return findUserAgent(userAgent); - } - - /** - * Deprecated, suggest use findUserAgent(String userAgent) - * @param request ContainerRequestContext - * @return userAgent - */ - @Deprecated - public static String findUserAgent(ContainerRequestContext request) { - String userAgent = request.getHeaderString(USER_AGENT); - return findUserAgent(userAgent); - } - /** * match the userAgent * @param userAgent string from request @@ -88,4 +66,31 @@ public class SurenessCommonUtil { } return sb.toString(); } + + /** + * Splice the contextPath to the head of the each uriResource + * @param contextPath context path eg: "/v2" + * @param uriResource set of uriResource eg: "/school/book===get===[role1]" + * @return set of uriResource eg: "/v2/school/book===get===[role1]" + */ + public static Set attachContextPath(String contextPath, Set uriResource) { + if (contextPath == null || "".equals(contextPath) || uriResource == null || uriResource.isEmpty()) { + return uriResource; + } + // format context path + contextPath = contextPath.toLowerCase().trim(); + contextPath = contextPath.replace("//", "/"); + if (!contextPath.startsWith(PATH_SPLIT)) { + contextPath = PATH_SPLIT.concat(contextPath); + } + if (contextPath.endsWith(PATH_SPLIT)) { + contextPath = contextPath.substring(0, contextPath.length() - 1); + } + final String finalContextPath = contextPath; + return uriResource.stream().map(resource -> + resource.startsWith(PATH_SPLIT) + ? finalContextPath.concat(resource) + : finalContextPath.concat(PATH_SPLIT).concat(resource) + ).collect(Collectors.toSet()); + } } diff --git a/sample-tom/src/main/java/com/usthe/sureness/sample/tom/sureness/provider/ResourceProvider.java b/sample-tom/src/main/java/com/usthe/sureness/sample/tom/sureness/provider/ResourceProvider.java index e5ff3c31356017672e3f9bf5d6e85edf43132c4e..636bf9b6d2bb6fe84a1e13bb3bc75e3537ce3ecc 100644 --- a/sample-tom/src/main/java/com/usthe/sureness/sample/tom/sureness/provider/ResourceProvider.java +++ b/sample-tom/src/main/java/com/usthe/sureness/sample/tom/sureness/provider/ResourceProvider.java @@ -2,6 +2,7 @@ package com.usthe.sureness.sample.tom.sureness.provider; import com.usthe.sureness.matcher.PathTreeProvider; import com.usthe.sureness.sample.tom.service.ResourceService; +import com.usthe.sureness.util.SurenessCommonUtil; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @@ -21,13 +22,13 @@ public class ResourceProvider implements PathTreeProvider { @Override public Set providePathData() { - return resourceService.getAllEnableResourcePath(); + return SurenessCommonUtil.attachContextPath(contextPathRef.get(), resourceService.getAllEnableResourcePath()); } @Override public Set provideExcludedResource() { - return resourceService.getAllDisableResourcePath(); + return SurenessCommonUtil.attachContextPath(contextPathRef.get(), resourceService.getAllDisableResourcePath()); } }