我们在开发项目上的扩展包时,通常会增加一些新的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、如果登录之后,再访问就一切正常了。