繁体   English   中英

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

[英]What is the best approach to create a role based web application?

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

  • 学生
  • 教授
  • 管理员

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

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

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

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

感谢您的时间和帮助。

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

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

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

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

由于获得一个有效的Spring / Angular项目设置并非易事 ,我建议您使用JHipster应用程序生成器 ,通过向导指导您完成整个过程(当您被问及类型选择monolithic web application时,您必须回答一些问题) 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 !)

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

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

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

生产代码

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

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

你可以这样做:

角色

  • ROLE_SCORE_EDITOR
  • ROLE_SCORE_VIEWER

特权

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

角色 - 权限

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:抱歉我的英语不好。 如果您需要任何东西,请在下面评论或评论我的要点

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

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

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

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

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

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

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

在我看来,你还没有实现任何身份验证。 这部分是在我的情况下完成的,它主要是通过Keycloak + web服务器中的配置完成的。

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

您可以根据可以隔离的名称创建基于role_user的表

不同的角色

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

我相信你应该继续使用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。 如果两者(密码和角色)检查都成功,则只允许您访问该页面。

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

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

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

最好的方法是: Spring Security

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

  1. 假设您的数据库中有一个表用户 添加列名称,例如user_rights
  2. 在您的应用程序中,此列是User模型类的字段
  3. 创建一个方法来检查此字段并根据需要处理角色

例如,如果用户角色确定他们有权访问哪些页面,则这是一个简化的代码示例:

在您的网页开头:

<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框架的功能,但同时这对我来说对于小型网络应用程序来说非常适合。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM