未验证 提交 8106f70f 编写于 作者: sinat_25235033's avatar sinat_25235033 提交者: GitHub

Feature context path (#42)

* support context path setting
上级 3d3a35c2
......@@ -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()) {
......
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: <context path="v2">
*/
AtomicReference<String> contextPathRef = new AtomicReference<String>();
/**
* 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.
......
......@@ -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
......
......@@ -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<String> getScanPackages() {
......
......@@ -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<String> resource = entity.getResourceRole();
Set<String> 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<String> resource = entity.getExcludedResource();
Set<String> 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
......
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<String> attachContextPath(String contextPath, Set<String> 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());
}
}
......@@ -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<String> providePathData() {
return resourceService.getAllEnableResourcePath();
return SurenessCommonUtil.attachContextPath(contextPathRef.get(), resourceService.getAllEnableResourcePath());
}
@Override
public Set<String> provideExcludedResource() {
return resourceService.getAllDisableResourcePath();
return SurenessCommonUtil.attachContextPath(contextPathRef.get(), resourceService.getAllDisableResourcePath());
}
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册