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

时间:2018-01-26 19:05:41

标签: java web login roles

我需要为学校创建一个Web应用程序,我需要具有不同的角色,例如:

  • 学生
  • 教授
  • 管理

我需要在开头登录,然后在输入凭据后,应用程序需要重定向到主页。

这里的问题是:我该如何处理这些角色?我应该为每个角色都有一个命名空间吗?即:students / index.jsp,professors / index.jsp,admin / index.jsp或所有角色都有一个共同的命名空间?像home / index.jsp这样的东西?然后使用装饰器/复合模式让菜单根据角色有不同的选项?

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

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

感谢您的时间和帮助。

14 个答案:

答案 0 :(得分:10)

你绝对不希望为不同的角色拥有单独的页面(“命名空间”),因为这几乎不可避免地导致代码重复。

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

你绝对不应该尝试重新发明轮子来管理基于角色的权限,因为有经验证的框架用于此目的:正如其他人已经指出的那样,在Java世界中,Spring和Spring Security是通往去。

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

由于获得有效的Spring / Angular项目设置并非易事,我建议您使用JHipster application generator通过向导指导您完成整个过程(您只需回答一些问题 - 当被问及类型选择monolithic web application):然后根据现代建议创建一个基于角色的安全性的工作项目配置。

如果您想在现代Web应用程序中了解基于角色的正确访问控制,那么查看JHipster生成的应用程序中使用的解决方案是我认为最好和最快的解决方案:

  • 它使用Spring Security功能来限制Java中的调用 后端:在生成的项目中查找org.springframework.security.access.annotation.Secured注释的用法
  • 显示了一些显示/隐藏某些UI的自定义前端技巧 基于角色的部分,如下所示: <h1 *jhiHasAnyAuthority="'ROLE_ADMIN'">Hello, admin user</h1>,您可以轻松采用自己的用例。
  • 你可以在2分钟内完成一个工作项目:学习的理想选择(去寻求最简单的monolithic web application!)

答案 1 :(得分:1)

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

在我们的项目中,我们使用一个带有单个index.jsp文件的方法。这首先是因为它们有很多共同的逻辑。但无论如何,你都会做出决定。

此外,如果您正在使用Spring Security并且可以在项目开发过程中添加新角色,那么@PreAuthorize ("hasRole ('ROLE_USER')")方法将不会很好。因为如果您要向数据库添加新角色,则必须向项目添加大量代码,以授予此新角色所需的访问权限。因此,在这种情况下,最好通过权限授予访问权限。并在many to many&lt; - &gt;之间创建关系roles permissions

答案 2 :(得分:1)

我不确定我的解决方案是否可以解决您的问题。但就我而言,我这样做:

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

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

Production code

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

  • Admin无法查看,编辑学生成绩。
  • Student可以查看分数但无法修改。
  • Professor可以查看,修改,添加分数。

您可以执行以下操作:

作用

  • ROLE_SCORE_EDITOR
  • ROLE_SCORE_VIEWER

特权

  • OP_READ_SCORE
  • OP_CREATE_SCORE
  • OP_UPDATE_SCORE
  • OP_DELETE_SCORE ---&gt;可能不需要这个,但它足以作为一个例子。

角色 - 权限

ROLE_SCORE_EDITOR

  • OP_READ_SCORE
  • OP_CREATE_SCORE
  • OP_UPDATE_SCORE

ROLE_SCORE_VIEWER

  • OP_READ_SCORE

用户 - 角色

管理员(这真的取决于你,在我的情况下我应该把它留空)

教授

  • ROLE_SCORE_EDITOR

斯图登

  • ROLE_SCORE_VIEWER

然后在您的模板中,使用user.hasPrivilegeuser.hasRole保护您的观看次数。它会正常工作。

P / s:抱歉我的英语不好。如果您需要任何内容​​,请在下方发表评论或发表评论gist

答案 3 :(得分:1)

您可以创建不同的角色来访问不同的受限区域。例如,您可以拥有学生,教授和管理员角色。稍后,您可以根据角色允许或阻止对内容的访问。 Spring Security可能对你有好处。

答案 4 :(得分:0)

有不同的页面违反了DRY(不要重复自己)原则。 如果您想要一个简单的解决方案,请在您的网络应用中添加过滤器并在那里进行授权(委托给第三方应用)。您需要在组级别的jsp页面中添加条件,以便不必每次都更改它。

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

答案 5 :(得分:0)

我现在处于类似情况。我的项目需要身份验证和基于角色的授权。 Java应用程序有许多可用的解决方案。我们的团队决定使用Keycloak,这是一个额外的应用程序,您可以在其中处理大部分用户管理。它可以在单独的服务器上运行。但是,根据应用程序的范围,它可能有点过分。

我认为,您尚未实施任何身份验证。这部分是在我的情况下完成的,它主要是通过Keycloak + web服务器中的配置完成的。

通常,您可以在大多数现代Web服务器中使用Java EE安全性进行授权。这将允许您使用@RolesAllowed等注释来授予或拒绝访问权限,并且无论Keycloak如何都可以使用。 Examples。通过这种方式,您可以为所有不同的角色保留统一的结构,并且只在请求执行之前确定请求的合法性。

答案 6 :(得分:0)

你可以根据你可以分离

的方式创建一个名为role_user的表

不同的角色

答案 7 :(得分:0)

尝试使用spring框架和弹簧安全性开发您的Web应用程序 请参考以下示例 http://websystique.com/spring-security/spring-security-4-role-based-login-example/

答案 8 :(得分:0)

我相信你应该继续Spring Security。它为您提供了许多开箱即用的功能,配置和维护您的应用程序变得更加容易。此外,您将能够更专注于构建应用程序的逻辑,同时库为您处理身份验证和授权(简单的角色)。此外,它还有很多社区支持。

以下是一个入门示例:Spring security - hello world

从上面的例子中,让我展示一段代码,以更加重视我的主张:

@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();

    }

所以,只要您尝试访问管理页面下的/admin页面或任何网址,上述配置的功能就是/admin/profile/admin/home等,您将被要求自己进行身份验证(在您的情况下使用用户名和密码)。 spring security将检查用户名和密码是否正确。除此之外,它还将检查提供的用户名是否具有角色admin。如果两者(密码和角色)检查都成功,则只允许您访问该页面。

因此,只需几行代码,您就可以通过应用程序的角色管理来控制整个安全性。

虽然在示例帖子中,使用了硬编码的用户名,但插入数据库也很容易。但是这个例子是一个很好的入门方式,如果它适合您的用例,请自己查看。

答案 9 :(得分:0)

此问题有多种方法。例如,您可以使用过滤器对不同用户/角色的资源进行身份验证和授权。除此之外,Spring Security还提供内置机制来确保对Web资源的授权访问。除此之外,您可以在应用程序中创建管理面板,并且可以将不同的页面分配给不同的角色(但是,这种方法涉及更多的编程工作)。您还可以考虑在web.xml中创建安全性约束,并且可以将Web资源集合与不同的角色相关联。

答案 10 :(得分:0)

最佳方法是:Spring Security

但它需要时间和学习以正确的方式去做,所以在那之前我会做这样的事情:

  1. 假设您的数据库中有用户表。添加列名,例如 USER_RIGHTS
  2. 在您的应用中,此列是 用户模型类
  3. 的字段
  4. 创建一个检查此字段并按您的意愿处理角色的方法
  5. 例如,如果用户角色确定他们有权访问哪些页面,则这是一个简化的代码示例:

    在您的网页开头:

    <h:body>
    
    <f:metadata>
        <f:viewAction action="#{userService.checkIfLogged()}" />
        <f:viewAction action="#{userService.accessCheck('page 2')}" />
    </f:metadata>
    

    并在你的bean方法中:

    @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.
    

    希望这有用,我仍然推荐Spring框架的功能,但与此同时,这对我来说非常适合小型网络应用。

答案 11 :(得分:-1)

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

答案 12 :(得分:-2)

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

答案 13 :(得分:-2)

我建议您查看一下spring security https://projects.spring.io/spring-security/#quick-start