Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/394.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 创建基于角色的web应用程序的最佳方法是什么?_Java_Web_Login_Roles - Fatal编程技术网

Java 创建基于角色的web应用程序的最佳方法是什么?

Java 创建基于角色的web应用程序的最佳方法是什么?,java,web,login,roles,Java,Web,Login,Roles,我需要为学校创建一个web应用程序,我需要扮演不同的角色,例如: 学生 教授 管理员 我需要有一个在开始登录,然后在输入凭据后,应用程序需要重定向到主页 这里的问题是:我应该如何处理角色?我应该为每个角色设置名称空间吗?i、 e:students/index.jsp、professors/index.jsp、admin/index.jsp,还是所有角色都有一个公共名称空间?比如home/index.jsp?然后使用decorator/composite模式让菜单根据角色有不同的选项 对于这个

我需要为学校创建一个web应用程序,我需要扮演不同的角色,例如:

  • 学生
  • 教授
  • 管理员
我需要有一个在开始登录,然后在输入凭据后,应用程序需要重定向到主页

这里的问题是:我应该如何处理角色?我应该为每个角色设置名称空间吗?i、 e:students/index.jsp、professors/index.jsp、admin/index.jsp,还是所有角色都有一个公共名称空间?比如home/index.jsp?然后使用decorator/composite模式让菜单根据角色有不同的选项

对于这个问题,我知道我必须将用户和角色存储在各自的表中,这个问题更多地涉及如何处理演示/导航/权限角色以及如何创建webapp结构,即在webapp文件夹下有一个名为students的目录,另一个文件夹管理员,另一个是关于我上面提到的点(装饰或复合图案)

当然,我不是在制作这么小的应用程序,但我想简化我面临的问题,以便创建一个基于web的大角色应用程序,我相信这些是主要原则


谢谢你的时间和帮助

您可以在数据库中使用保存角色的字段,但您可以阅读有关ACL和RBAC的内容。

我建议您看看spring安全性。

好问题。实际上,它的扩展是完整的身份验证模块 对于您的小型案例,一个通用页面是最好的解决方案。根据角色,将显示所需的文本框或字段。 例如,如果角色为Student:subject,卷号将可用。但若教授登录到同一个页面,他可以看到其他字段,如数字、出勤率等。
最简单的解决方案是:创建一个主表,其中包含名称、Id、类型(有类型是否为student/Professor/Admin等),并使用此类型作为显示字段的决定性因素

你的问题没有单一的答案。一切都取决于项目的结构。如果您提到的角色之间有很多共同点,那么最好对所有角色使用一个index.jsp。然后您不必复制公共逻辑(
js
css
库、自定义公共脚本、视图和样式包含)。如果角色之间没有什么共同点,那么最好为每个角色分别创建index.jsp文件,因为单个index.jsp文件将在程序执行期间根据所选角色动态创建(我认为仍然可以通过缓存进行修复)

在我们的项目中,我们对单个index.jsp文件使用一种方法。这首先是因为他们有很多共同的逻辑。但无论如何,决定将由你来做


此外,如果您使用的是Spring安全性,并且可以在项目开发过程中添加新角色,那么
@PreAuthorize(“hasRole('ROLE_USER')”)
方法将不太好。因为如果要向数据库中添加新角色,则必须向项目中添加大量代码才能授予此新角色所需的访问权限。因此,在这种情况下,最好通过权限授予访问权限。并在
角色之间创建
多对多
关系
权限

您肯定不希望为不同的角色使用单独的页面(“名称空间”),因为这几乎不可避免地会导致代码重复

每个功能都应该有一个页面,并根据用户的角色限制访问。(例如,一些菜单项对学生不可见,但显示给教授和管理员。)

您绝对不应该尝试重新发明用于管理基于角色的权限的轮子,因为有经过战斗验证的框架可以实现这一目的:正如其他人已经指出的那样,在Java世界中,Spring和是一条路要走

我认为JSP技术正在老化,所以您应该开始学习

由于获得一个可工作的Spring/Angular项目设置并非易事,我建议您使用向导来指导您完成整个过程(您只需回答一些问题——当被问及类型选择
单片web应用程序时
):然后,它将创建一个工作项目配置,并按照现代建议使用基于角色的安全性

如果您想了解现代web应用程序中正确的基于角色的访问控制,请查看JHipster生成的应用程序中使用的解决方案,我相信这是最好、最快的解决方案:

  • 它使用Spring安全特性来限制Java中的调用 后端:在生成的项目中查找
    org.springframework.security.access.annotation.security
    注释的用法
  • 显示一些自定义前端技巧以显示/隐藏某些UI 基于角色的部件,如下所示:
    您好,管理员用户
    ,您可以轻松地将其应用到您自己的用例中
  • 您可以在2分钟内完成一个工作项目:非常适合学习(使用最简单的
    单片web应用程序
    !)

拥有不同的页面违反了干燥(不要重复)原则。 如果您想要一个简单的解决方案,请在您的web应用程序中添加过滤器,并在那里进行授权(委托给第三方应用程序)。您需要在jsp页面的组级别添加条件,这样就不必每次都更改


您还可以使用Spring安全性和jdbc身份验证。

我不确定我的解决方案能否解决您的问题。但就我而言,我的做法如下:

用户0..n--0..m角色

角色0..n---0..m权限

在您的情况下,您可能需要:

  • Admin
    无法查看、编辑学生成绩
  • 学生
    可以查看分数,但c
    @Override
        protected void configure(HttpSecurity http) throws Exception {
    
          http.authorizeRequests()
            .antMatchers("/admin/**").access("hasRole('ROLE_ADMIN')")
            .antMatchers("/dba/**").access("hasRole('ROLE_ADMIN') or hasRole('ROLE_DBA')")
            .and().formLogin();
    
        }
    
    <h:body>
    
    <f:metadata>
        <f:viewAction action="#{userService.checkIfLogged()}" />
        <f:viewAction action="#{userService.accessCheck('page 2')}" />
    </f:metadata>
    
    @Override
    @Transactional
    public String accessCheck(String page) {
        try {
           HttpSession sess = Util.getSession();
           String user = sess.getAttribute("username").toString();
           Session session = this.sessionFactory.getCurrentSession();
           User logged = (User) session.createQuery("select u from User u where 
                         u.username = :logged").setParameter("logged", 
                                                user).uniqueResult();
           if (page.equals("page 1")) {
            if (logged.getRights().equals("simple")) {
                return "profile?faces-redirect=true";
            } 
            else {
                return "#";
            }
        }   ... etc.