页面树结构
转至元数据结尾
转至元数据起始

我们在开发项目上的扩展包时,通常会增加一些新的html、jsp页面,甚至是增加一个新的模块。默认情况下,这些新增加的页面资源,在未登录到 Smartbi 的情况下,用户通过在浏览器地址栏输入对应的页面地址(URL),就可以直接访问。有些时候这算是权限漏洞,如果希望用户不登录就不能访问这些页面资源,该怎么做呢。请参考如下文档。

 

1、我们通过 filter 的方式,对指定页面资源设置过滤器。未登录就访问,直接给出错误提示。因此第一步,我们需要在自己的扩展包项目中增加一个 javax.servlet.Filter 类。可以参考如下示例代码。

package dishui.bookshelf.filter;
 
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.log4j.Logger;
import smartbi.SmartbiException;
import smartbi.freequery.FreeQueryErrorCode;
import smartbi.state.IState;
 
public class UserIsLoggedFilter implements javax.servlet.Filter {
 
	private static final Logger log = Logger.getLogger(UserIsLoggedFilter.class);
 
	public void destroy() {
	}
 
	public void doFilter(ServletRequest servletrequest, ServletResponse servletresponse, FilterChain filterchain) throws IOException, ServletException {
		HttpServletRequest httpRequest = (HttpServletRequest) servletrequest;
		HttpServletResponse httpResponse = (HttpServletResponse) servletresponse;
		servletrequest.setCharacterEncoding("UTF-8");
		try {
			IState state = (IState) httpRequest.getSession().getAttribute("state");
			boolean isLogged = state != null && state.getUser() != null;
			if (!isLogged) {
				throw new SmartbiException(FreeQueryErrorCode.CLIENT_USER_NOT_LOGIN);
			}
		} catch (SmartbiException ce) {
			log.error("当前用户未登录,无法访问该页面", ce);
			String jsonStr = "<html><body><div>";
			jsonStr += "<script>alert('用户未登录,无法访问该页面');</script>";
			jsonStr += "<br/>retCode:" + ce.getErrorCode().name();
			jsonStr += "<br/>result:" + ce.getMsg();
			jsonStr += "<br/>detail:" + ce.getDetail();
			jsonStr += "<br/>stackTrace:" + ce.getStackTraceInfo().replace("at ", "<br/>at ");
			jsonStr += "</div></body></html>";
			httpResponse.setContentType("text/html; charset=UTF-8");
			httpResponse.getOutputStream().write(jsonStr.getBytes("UTF-8"));
			return;
		}
		filterchain.doFilter(httpRequest, httpResponse);
	}
 
	public void init(FilterConfig filterconfig) throws ServletException {
	}
}

 

2、在扩展包配置 /web/META-INF/extension.xml 文件中增加 <filter> 和 <filter-mapping> 设置。示例代码如下,完整的extension.xml从这里下载

	<filter>
		<filter-name>UserIsLoggedInCheckedFilter</filter-name>
		<filter-class>dishui.bookshelf.filter.UserIsLoggedFilter</filter-class>
	</filter>
	<filter-mapping>
		<filter-name>UserIsLoggedInCheckedFilter</filter-name>
		<url-pattern>/vision/test/*</url-pattern>
	</filter-mapping>

 

3、参考“扩展包部署”文档,部署上述扩展包。

4、在未登录的情况下,打开浏览器,地址栏直接输入指定的 <url-pattern> 下的资源,系统会提示“用户未登录,无法访问该页面”。

 

 

5、如果登录之后,再访问就一切正常了。

示例工程代码

ForceLoginValidation.rar

  • 无标签