Java EE中的访问控制

时间:2014-05-04 06:26:12

标签: jsp servlets acl dao pojo

我正在开发一个简单的Java EE应用程序,使用普通的jsp serlvets以及POJO类和DAO支持。这里实现访问控制的最佳策略是什么。

我最初想过使用filter,但我不太确定它的用法,所以有什么简单的编程方式我可以实现相同的吗?我的意思是通过使用properties文件或其他方法?

另外,我想保持我的应用轻量级。那么请建议相同的解决方案?提前谢谢!

2 个答案:

答案 0 :(得分:1)

如果您不打算使用某些API(例如spring securityapache shiro),那么您需要使用网络过滤器。

在您的过滤器实现中,如果您要授予访问权限,只需调用

即可
chain.doFilter(request, response); 

将正常处理请求,否则,使用

将用户重定向到另一个页面
response.sendRedirect(Url); 

是个不错的选择

答案 1 :(得分:1)

基本上,ACL是通过在会话bean类或其方法安全性方法上使用@DeclareRoles和@RolesAllowed注释在Java EE中实现的。您还可以在部署描述符(web.xml)中使用元素来描述您的角色和授权以实现decalrative安全性。

以下是来自Java EE tutorial的程序化安全性示例

package converter.ejb;

    import java.math.BigDecimal;
    import javax.ejb.Stateless;
    import java.security.Principal;
    import javax.annotation.Resource;
    import javax.ejb.SessionContext;
    import javax.annotation.security.DeclareRoles;
    import javax.annotation.security.RolesAllowed;

        @Stateless()
        @DeclareRoles("TutorialUser")
        public class ConverterBean{ 

               @Resource SessionContext ctx;
                private BigDecimal yenRate = new BigDecimal("89.5094");
                private BigDecimal euroRate = new BigDecimal("0.0081");

                @RolesAllowed("TutorialUser")
                 public BigDecimal dollarToYen(BigDecimal dollars) {
                    BigDecimal result = new BigDecimal("0.0");
                    Principal callerPrincipal = ctx.getCallerPrincipal();
                    if (ctx.isCallerInRole("TutorialUser")) {
                        result = dollars.multiply(yenRate);
                        return result.setScale(2, BigDecimal.ROUND_UP);
                    } else {
                        return result.setScale(2, BigDecimal.ROUND_UP);
                    }
                }

                @RolesAllowed("TutorialUser")
                public BigDecimal yenToEuro(BigDecimal yen) {
                    BigDecimal result = new BigDecimal("0.0");
                    Principal callerPrincipal = ctx.getCallerPrincipal();
                    if (ctx.isCallerInRole("TutorialUser")) {
                         result = yen.multiply(euroRate);
                         return result.setScale(2, BigDecimal.ROUND_UP);
                    } else {
                         return result.setScale(2, BigDecimal.ROUND_UP);
                    }
                }
            }

您也可以使用HttpServletRequest'在servlet中执行此操作。登录,注销和验证身份验证方法,然后使用getUserPrincipal和isUserInRole进行ACL。然后,您需要在web.xml中添加servlet的描述,以引用web.xml中元素中声明的角色。以下是来自Java EE turorial的ACL部分的示例。

package enterprise.programmatic_login;

import java.io.*;
import java.net.*;
import javax.annotation.security.DeclareRoles;
import javax.servlet.*;
import javax.servlet.http.*;

@DeclareRoles("javaee6user")
public class LoginServlet extends HttpServlet {

    /** 
     * Processes requests for both HTTP GET and POST methods.
     * @param request servlet request
     * @param response servlet response
     */
    protected void processRequest(HttpServletRequest request, 
                 HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        try {
            String userName = request.getParameter("txtUserName");
            String password = request.getParameter("txtPassword");

            out.println("Before Login" + "<br><br>");
            out.println("IsUserInRole?.." 
                        + request.isUserInRole("javaee6user")+"<br>");
            out.println("getRemoteUser?.." + request.getRemoteUser()+"<br>");
            out.println("getUserPrincipal?.." 
                        + request.getUserPrincipal()+"<br>");
            out.println("getAuthType?.." + request.getAuthType()+"<br><br>");

            try {
                request.login(userName, password); 
            } catch(ServletException ex) {
                out.println("Login Failed with a ServletException.." 
                    + ex.getMessage());
                return;
            }
            out.println("After Login..."+"<br><br>");
            out.println("IsUserInRole?.." 
                        + request.isUserInRole("javaee6user")+"<br>");
            out.println("getRemoteUser?.." + request.getRemoteUser()+"<br>");
            out.println("getUserPrincipal?.." 
                        + request.getUserPrincipal()+"<br>");
            out.println("getAuthType?.." + request.getAuthType()+"<br><br>");

            request.logout();
            out.println("After Logout..."+"<br><br>");
            out.println("IsUserInRole?.." 
                        + request.isUserInRole("javaee6user")+"<br>");
            out.println("getRemoteUser?.." + request.getRemoteUser()+"<br>");
            out.println("getUserPrincipal?.."
                        + request.getUserPrincipal()+"<br>");
            out.println("getAuthType?.." + request.getAuthType()+"<br>");
        } finally {
            out.close();
        }
    }

}

有关更完整的示例和说明,请参阅Java EE教程的提供链接。