|
@@ -0,0 +1,85 @@
|
|
|
|
+package com.ruoyi.framework.shiro.web;
|
|
|
|
+
|
|
|
|
+import org.apache.shiro.spring.web.ShiroFilterFactoryBean;
|
|
|
|
+import org.apache.shiro.web.filter.InvalidRequestFilter;
|
|
|
|
+import org.apache.shiro.web.filter.mgt.DefaultFilter;
|
|
|
|
+import org.apache.shiro.web.filter.mgt.FilterChainManager;
|
|
|
|
+import org.apache.shiro.web.filter.mgt.FilterChainResolver;
|
|
|
|
+import org.apache.shiro.web.filter.mgt.PathMatchingFilterChainResolver;
|
|
|
|
+import org.apache.shiro.web.mgt.WebSecurityManager;
|
|
|
|
+import org.apache.shiro.web.servlet.AbstractShiroFilter;
|
|
|
|
+import org.apache.shiro.mgt.SecurityManager;
|
|
|
|
+import org.springframework.beans.factory.BeanInitializationException;
|
|
|
|
+import javax.servlet.Filter;
|
|
|
|
+import java.util.Map;
|
|
|
|
+
|
|
|
|
+/**
|
|
|
|
+ * 自定义ShiroFilterFactoryBean解决资源中文路径问题
|
|
|
|
+ *
|
|
|
|
+ * @author ruoyi
|
|
|
|
+ */
|
|
|
|
+public class CustomShiroFilterFactoryBean extends ShiroFilterFactoryBean
|
|
|
|
+{
|
|
|
|
+ @Override
|
|
|
|
+ public Class<MySpringShiroFilter> getObjectType()
|
|
|
|
+ {
|
|
|
|
+ return MySpringShiroFilter.class;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ @Override
|
|
|
|
+ protected AbstractShiroFilter createInstance() throws Exception
|
|
|
|
+ {
|
|
|
|
+
|
|
|
|
+ SecurityManager securityManager = getSecurityManager();
|
|
|
|
+ if (securityManager == null)
|
|
|
|
+ {
|
|
|
|
+ String msg = "SecurityManager property must be set.";
|
|
|
|
+ throw new BeanInitializationException(msg);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if (!(securityManager instanceof WebSecurityManager))
|
|
|
|
+ {
|
|
|
|
+ String msg = "The security manager does not implement the WebSecurityManager interface.";
|
|
|
|
+ throw new BeanInitializationException(msg);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ FilterChainManager manager = createFilterChainManager();
|
|
|
|
+ // Expose the constructed FilterChainManager by first wrapping it in a
|
|
|
|
+ // FilterChainResolver implementation. The AbstractShiroFilter implementations
|
|
|
|
+ // do not know about FilterChainManagers - only resolvers:
|
|
|
|
+ PathMatchingFilterChainResolver chainResolver = new PathMatchingFilterChainResolver();
|
|
|
|
+ chainResolver.setFilterChainManager(manager);
|
|
|
|
+
|
|
|
|
+ Map<String, Filter> filterMap = manager.getFilters();
|
|
|
|
+ Filter invalidRequestFilter = filterMap.get(DefaultFilter.invalidRequest.name());
|
|
|
|
+ if (invalidRequestFilter instanceof InvalidRequestFilter)
|
|
|
|
+ {
|
|
|
|
+ // 此处是关键,设置false跳过URL携带中文400,servletPath中文校验bug
|
|
|
|
+ ((InvalidRequestFilter) invalidRequestFilter).setBlockNonAscii(false);
|
|
|
|
+ }
|
|
|
|
+ // Now create a concrete ShiroFilter instance and apply the acquired SecurityManager and built
|
|
|
|
+ // FilterChainResolver. It doesn't matter that the instance is an anonymous inner class
|
|
|
|
+ // here - we're just using it because it is a concrete AbstractShiroFilter instance that accepts
|
|
|
|
+ // injection of the SecurityManager and FilterChainResolver:
|
|
|
|
+ return new MySpringShiroFilter((WebSecurityManager) securityManager, chainResolver);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ private static final class MySpringShiroFilter extends AbstractShiroFilter
|
|
|
|
+ {
|
|
|
|
+ protected MySpringShiroFilter(WebSecurityManager webSecurityManager, FilterChainResolver resolver)
|
|
|
|
+ {
|
|
|
|
+ if (webSecurityManager == null)
|
|
|
|
+ {
|
|
|
|
+ throw new IllegalArgumentException("WebSecurityManager property cannot be null.");
|
|
|
|
+ }
|
|
|
|
+ else
|
|
|
|
+ {
|
|
|
|
+ this.setSecurityManager(webSecurityManager);
|
|
|
|
+ if (resolver != null)
|
|
|
|
+ {
|
|
|
|
+ this.setFilterChainResolver(resolver);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+}
|