Java源码示例:org.apache.shiro.web.filter.mgt.FilterChainManager
示例1
@Override
protected AbstractShiroFilter createInstance() throws Exception {
LOGGER.debug("Creating Shiro Filter instance.");
SecurityManager securityManager = this.getSecurityManager();
String msg;
if (securityManager == null) {
msg = "SecurityManager property must be set.";
throw new BeanInitializationException(msg);
} else if (!(securityManager instanceof WebSecurityManager)) {
msg = "The security manager does not implement the WebSecurityManager interface.";
throw new BeanInitializationException(msg);
} else {
FilterChainManager manager = this.createFilterChainManager();
RestPathMatchingFilterChainResolver chainResolver = new RestPathMatchingFilterChainResolver();
chainResolver.setFilterChainManager(manager);
return new RestShiroFilterFactoryBean.SpringShiroFilter((WebSecurityManager)securityManager, chainResolver);
}
}
示例2
@Inject
public OneFilterChainResolver(
Set<FilterChainConfigurator> filterChainConfigurators,
BasicAuthenticationFilter basicAuthenticationFilter,
BearerAuthenticationFilter bearerAuthenticationFilter) {
super();
FilterChainManager filterChainManager = getFilterChainManager();
filterChainManager.addFilter("authcBasic", basicAuthenticationFilter);
filterChainManager.addFilter("authcBearer", bearerAuthenticationFilter);
for (FilterChainConfigurator configurator: filterChainConfigurators)
configurator.configure(filterChainManager);
filterChainManager.createChain("/**", "authcBasic, authcBearer");
}
示例3
private void configureSecurity() {
contributeFromPackage(Realm.class, AbstractAuthorizingRealm.class);
bind(RememberMeManager.class).to(OneRememberMeManager.class);
bind(WebSecurityManager.class).to(OneWebSecurityManager.class);
bind(FilterChainResolver.class).to(OneFilterChainResolver.class);
bind(BasicAuthenticationFilter.class);
bind(BearerAuthenticationFilter.class);
bind(PasswordService.class).to(OnePasswordService.class);
bind(ShiroFilter.class);
install(new ShiroAopModule());
contribute(FilterChainConfigurator.class, new FilterChainConfigurator() {
@Override
public void configure(FilterChainManager filterChainManager) {
filterChainManager.createChain("/**/info/refs", "noSessionCreation, authcBasic, authcBearer");
filterChainManager.createChain("/**/git-upload-pack", "noSessionCreation, authcBasic, authcBearer");
filterChainManager.createChain("/**/git-receive-pack", "noSessionCreation, authcBasic, authcBearer");
}
});
contributeFromPackage(Authenticator.class, Authenticator.class);
}
示例4
private void configureRestServices() {
bind(ResourceConfig.class).toProvider(ResourceConfigProvider.class).in(Singleton.class);
bind(ServletContainer.class).to(DefaultServletContainer.class);
contribute(FilterChainConfigurator.class, new FilterChainConfigurator() {
@Override
public void configure(FilterChainManager filterChainManager) {
filterChainManager.createChain("/rest/**", "noSessionCreation, authcBasic");
}
});
contribute(JerseyConfigurator.class, new JerseyConfigurator() {
@Override
public void configure(ResourceConfig resourceConfig) {
resourceConfig.packages(RestConstants.class.getPackage().getName());
}
});
}
示例5
@Override
protected AbstractShiroFilter createInstance() throws Exception {
SecurityManager securityManager = getSecurityManager();
if (securityManager == null){
throw new BeanInitializationException("SecurityManager property must be set.");
}
if (!(securityManager instanceof WebSecurityManager)){
throw new BeanInitializationException("The security manager does not implement the WebSecurityManager interface.");
}
PathMatchingFilterChainResolver chainResolver = new PathMatchingFilterChainResolver();
FilterChainManager chainManager = createFilterChainManager();
chainResolver.setFilterChainManager(chainManager);
return new MySpringShiroFilter((WebSecurityManager)securityManager, chainResolver);
}
示例6
@Override
protected void configureShiroWeb() {
bindRealm().to(EmptyRealm.class); // not used in practice, just here to keep Shiro module happy
bindSingleton(SessionFactory.class, NexusSessionFactory.class);
bindSingleton(SessionStorageEvaluator.class, NexusSessionStorageEvaluator.class);
bindSingleton(SubjectDAO.class, NexusSubjectDAO.class);
// configure our preferred security components
bindSingleton(SessionDAO.class, NexusSessionDAO.class);
bindSingleton(Authenticator.class, FirstSuccessfulModularRealmAuthenticator.class);
bindSingleton(Authorizer.class, ExceptionCatchingModularRealmAuthorizer.class);
bindSingleton(FilterChainManager.class, DynamicFilterChainManager.class);
// path matching resolver has several constructors so we need to point Guice to the appropriate one
bind(FilterChainResolver.class).toConstructor(ctor(PathMatchingFilterChainResolver.class)).asEagerSingleton();
// bindings used by external modules
expose(FilterChainResolver.class);
expose(FilterChainManager.class);
}
示例7
/**
* Follow the Maximum Matching Principle <br/>
* {@link org.springframework.web.servlet.handler.AbstractUrlHandlerMapping#lookupHandler}
*/
@Override
public FilterChain getChain(ServletRequest request, ServletResponse response, FilterChain originalChain) {
FilterChainManager chainManager = getFilterChainManager();
state(chainManager.hasChains(), "Shiro filter chain must be implemented");
// Current request URI
String requestURI = getPathWithinApplication(request);
// Candidate matching pattern list.
List<String> candidateMatchingPatterns = new ArrayList<>(4);
/*
* the 'chain names' in this implementation are actually path patterns
* defined by the user. We just use them as the chain name for the
* FilterChainManager's requirements
*/
for (String registeredPattern : chainManager.getChainNames()) {
if (pathMatches(registeredPattern, requestURI)) {
log.trace("Matched path pattern:[{}] for requestURI:[{}]. Utilizing corresponding filter chain...",
registeredPattern, requestURI);
candidateMatchingPatterns.add(registeredPattern);
}
}
Collections.sort(candidateMatchingPatterns, new AntPatternComparator(requestURI));
String bestMatch = candidateMatchingPatterns.get(0); // Best
return chainManager.proxy(originalChain, bestMatch);
}
示例8
@Override
public FilterChain getChain(ServletRequest request, ServletResponse response, FilterChain originalChain) {
FilterChainManager filterChainManager = getFilterChainManager();
if (!filterChainManager.hasChains()) {
return null;
}
String requestURI = getPathWithinApplication(request);
// the 'chain names' in this implementation are actually path patterns defined by the user. We just use them
// as the chain name for the FilterChainManager's requirements
for (String pathPattern : filterChainManager.getChainNames()) {
String[] pathPatternArray = pathPattern.split("==");
boolean httpMethodMatchFlag = true;
if (pathPatternArray.length > 1) {
httpMethodMatchFlag = pathPatternArray[1].equals(WebHelper.getRequestHTTPMethod());
}
// 只用过滤器链的 URL 部分与请求的 URL 进行匹配
if (pathMatches(pathPatternArray[0], requestURI) && httpMethodMatchFlag) {
if (log.isTraceEnabled()) {
log.trace("Matched path pattern [" + pathPattern + "] for requestURI [" + requestURI + "]. " +
"Utilizing corresponding filter chain...");
}
return filterChainManager.proxy(originalChain, pathPattern);
}
}
return null;
}
示例9
/**
* description TODO 重写filterChain匹配
*
* @param request 1
* @param response 2
* @param originalChain 3
* @return javax.servlet.FilterChain
*/
@Override
public FilterChain getChain(ServletRequest request, ServletResponse response, FilterChain originalChain) {
FilterChainManager filterChainManager = this.getFilterChainManager();
if (!filterChainManager.hasChains()) {
return null;
} else {
String requestURI = this.getPathWithinApplication(request);
if (requestURI != null && requestURI.endsWith(DEFAULT_PATH_SEPARATOR)) {
requestURI = requestURI.substring(0, requestURI.length() - 1);
}
Iterator var6 = filterChainManager.getChainNames().iterator();
String pathPattern;
boolean flag = true;
String[] strings = null;
do {
if (!var6.hasNext()) {
return null;
}
pathPattern = (String)var6.next();
strings = pathPattern.split("==");
if (strings.length == NUM_2) {
// 分割出url+httpMethod,判断httpMethod和request请求的method是否一致,不一致直接false
if (WebUtils.toHttp(request).getMethod().toUpperCase().equals(strings[1].toUpperCase())) {
flag = false;
} else {
flag = true;
}
} else {
flag = false;
}
pathPattern = strings[0];
if (pathPattern != null && pathPattern.endsWith(DEFAULT_PATH_SEPARATOR)) {
pathPattern = pathPattern.substring(0, pathPattern.length() -1);
}
} while(!this.pathMatches(pathPattern, requestURI) || flag);
if (LOGGER.isTraceEnabled()) {
LOGGER.trace("Matched path pattern [" + pathPattern + "] for requestURI [" + requestURI + "]. Utilizing corresponding filter chain...");
}
if (strings.length == NUM_2) {
pathPattern = pathPattern.concat("==").concat(WebUtils.toHttp(request).getMethod().toUpperCase());
}
return filterChainManager.proxy(originalChain, pathPattern);
}
}
示例10
@Bean
public FilterChainManager filterChainManager() {
return new IamFilterChainManager();
}
示例11
@Bean
public IamShiroFilterFactoryBean iamFilterFactoryBean(AbstractIamProperties<? extends ParamProperties> config,
DefaultWebSecurityManager securityManager, FilterChainManager chainManager) {
/*
* Note: The purpose of using Iam Shiro FilterFactory Bean is to use Iam
* Path Matching Filter Chain Resolver, while Iam Path Matching Filter
* Chain Resolver mainly implements the servlet/filter matching
* specification of getChain () method for default enhancements (because
* Shiro does not implement it, this causes serious problems)
*/
IamShiroFilterFactoryBean iamFilter = new IamShiroFilterFactoryBean(chainManager);
iamFilter.setSecurityManager(securityManager);
/*
* IAM server login page.(shiro default by "/login.jsp")
*/
iamFilter.setLoginUrl(config.getLoginUri());
// Default login success callback URL.
iamFilter.setSuccessUrl(config.getSuccessUri());
// IAM server 403 page URL
iamFilter.setUnauthorizedUrl(config.getUnauthorizedUri());
// Register define filters.
Map<String, Filter> filters = new LinkedHashMap<>();
// Register define filter mapping.
Map<String, String> filterChain = new LinkedHashMap<>();
actx.getBeansWithAnnotation(IamFilter.class).values().stream().forEach(filter -> {
String filterName = null, uriPertten = null;
if (filter instanceof NameableFilter) {
filterName = (String) invokeMethod(findMethod(filter.getClass(), "getName"), filter);
}
if (filter instanceof IamAuthenticationFilter) {
uriPertten = ((IamAuthenticationFilter) filter).getUriMapping();
}
notNull(filterName, "'filterName' must not be null");
notNull(uriPertten, "'uriPertten' must not be null");
if (filters.putIfAbsent(filterName, (Filter) filter) != null) {
throw new IllegalStateException(format("Already filter. [%s]", filterName));
}
if (filterChain.putIfAbsent(uriPertten, filterName) != null) {
throw new IllegalStateException(format("Already filter mapping. [%s] = %s", uriPertten, filterName));
}
});
// Filter chain definition register
iamFilter.setFilters(filters);
// Add external filter chain configuration
config.getFilterChain().forEach((uriPertten, filterName) -> {
if (filterChain.putIfAbsent(uriPertten, filterName) != null) {
throw new IllegalStateException(format("Already filter mapping. [%s] = %s", uriPertten, filterName));
}
});
// Filter chain mappings register
iamFilter.setFilterChainDefinitionMap(filterChain);
return iamFilter;
}
示例12
public IamShiroFilterFactoryBean(FilterChainManager chainManager) {
Assert.notNull(chainManager, "chainManager is null, please check configure");
this.chainManager = chainManager;
}
示例13
void configure(FilterChainManager filterChainManager);