Java 创建基于角色的web应用程序的最佳方法是什么?
我需要为学校创建一个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模式让菜单根据角色有不同的选项 对于这个
- 学生
- 教授
- 管理员
谢谢你的时间和帮助 您可以在数据库中使用保存角色的字段,但您可以阅读有关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应用程序
您还可以使用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.