Java EE中的访问控制

登录N

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

我最初考虑使用a,filter但我不太确定其用法,因此是否有任何简单的编程方式可以实现相同目的?我是通过使用properties文件还是其他方式来实现?

我也想保持我的应用程序轻量级。因此,请提出相同的解决方案?提前致谢!

无情的

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

这是Java EE教程中有关编程安全性的示例

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的登录,注销和身份验证方法进行身份验证,然后将getUserPrincipal和isUserInRole用于ACL来在servlet中进行操作。然后,您需要在web.xml中添加到servlet的描述中,以引用在web.xml中的元素中声明的角色。这是来自Java EE的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教程提供的链接。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

控制ManagedExecutorServices / Java EE 7的线程数

来自分类Dev

如何在Java EE Batch / Jberet中访问分区属性

来自分类Dev

Java EE中的依赖注入

来自分类Dev

Java EE中的@Producer批注

来自分类Dev

Java EE中的@Producer批注

来自分类Dev

Java SE中的JPA与Java EE性能

来自分类Dev

Java SE中的JPA与Java EE性能

来自分类Dev

Java EE 8 MVC:如何使用控制器启动?

来自分类Dev

是否可以从Java EE Web应用程序访问AudioSystem?

来自分类Dev

Java EE中的HTML提交按钮处理

来自分类Dev

在Java EE中持续运行服务

来自分类Dev

在Java EE中安全存储SMTP凭证

来自分类Dev

Java EE 7中的request.login()?

来自分类Dev

在Java EE中安全存储SMTP凭证

来自分类Dev

Java EE中的分片并行化

来自分类Dev

Java EE-GUI中的实体管理

来自分类Dev

Web容器中的Java EE API

来自分类Dev

如何协调J2EE和Java EE数据库访问?

来自分类Dev

Java EE中的CDI-无法注入哪些Java类?

来自分类Dev

Java中的并行和事务处理(Java EE)

来自分类Dev

java.lang.NoClassDefFoundError:java-ee中的rcaller / RCaller

来自分类Dev

在Java中控制线程

来自分类Dev

从Java中的模板访问Flash

来自分类Dev

在Java中访问.xlsb文件

来自分类Dev

访问线程Java中的变量

来自分类Dev

覆盖Java中的访问器

来自分类Dev

JAR中的Java资源访问

来自分类Dev

同步访问Java中的地图

来自分类Dev

在Java中访问同步方法