设置Java EE应用程序的授权

时间:2017-07-14 08:57:04

标签: java jsp java-ee authorization

我正在使用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文件上执行此操作

1 个答案:

答案 0 :(得分:1)

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

  • @WebFilter("/*")每个资源
  • @WebFilter("/user/*")用户文件夹下的资源
  • @WebFilter("/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() {

    }
}