【问题标题】:Setting Authorization for Java EE application为 Java EE 应用程序设置授权
【发布时间】:2017-07-14 08:57:04
【问题描述】:

我主要使用 JSP 和 Tomcat 作为我的服务器来构建这个应用程序。

我正在尝试设置授权级别,从而某些类别的用户可以执行某些操作(访问某些页面,例如创建新记录或搜索过去的记录),例如创建新用户只能由管理员完成。

我现在所做的是首先:

<%
    String user = request.getParameter("name");    
    String pwd = request.getParameter("password"); 

    String sql = "select * from members where name = ? and password = ?";

    int role = 0;

    // since execute returns an int of 1 or 0, we can use it for our if-else statement
    if (BaseDAO.check(sql, user, pwd) != 0) {
        session.setAttribute("user", user);
        role = BaseDAO.checkRole(sql, user, pwd);
        session.setAttribute("role", role);
        response.sendRedirect("frameMgr.jsp");
    } else {
        session.setAttribute("login", 0);
        response.sendRedirect("loginPage.jsp");
    }
%>

登录成功后,我会从数据库中提取角色的值并将其设置为会话属性。然后稍后在我的 createNewUser 页面上,我有这个来检查用户是否具有分配的角色

<% 
    int role = (Integer) session.getAttribute("role");
    // only allow people with admin role to create more accounts
    if (role != 5) {
        response.sendRedirect("frameContent.jsp"); //back to homepage
    }
%>

但是我意识到这种方法效率低下,因为我必须在每一页上进行检查,如果将来有更改,我将不得不逐页更改代码。 有没有一种方法可以单独控制一个页面上的所有授权级别?而不必对我所有的 jsp 文件都这样做

【问题讨论】:

    标签: java jsp jakarta-ee authorization


    【解决方案1】:

    你能做的最好的就是使用 HTTP filter。每个请求都将使用您的过滤器进行验证。当然,这只会阻止用户访问资源(页面/图像等),但它不能作为您的方法和用户交互的授权者。

    • @WebFilter("/*")各种资源
    • @WebFilter("/user/*")用户文件夹下的资源
    • @WebFilter("/admin/*")admin文件夹下的资源
    • @WebFilter("/what/ever/*")

    例子:

    @WebFilter("/user/*")
    public class UserFilter implements Filter {
    
    
        @Override
        public void init(FilterConfig filterConfig) throws ServletException {
    
        }
    
        @Override
        public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
            HttpServletRequest req = (HttpServletRequest) servletRequest;
            HttpServletResponse res = (HttpServletResponse) servletResponse;
    
            if (/*Check if user is logged*/) {
                filterChain.doFilter(servletRequest, servletResponse);
            } else {
                res.sendRedirect(req.getContextPath() + "/login.jsp");
            }
    
        }
    
        @Override
        public void destroy() {
    
        }
    }
    

    【讨论】:

    • 嗨,所以您建议我可以使用它来替换我需要在每个页面中编写的检查以控制用户可以访问的资源吗?例如,限制非管理员用户进入 createNewUser 页面。感谢您的帮助。
    猜你喜欢
    • 2016-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-27
    • 2022-01-21
    • 1970-01-01
    • 2010-11-09
    相关资源
    最近更新 更多