我需要为学校创建一个Web应用程序,我需要具有不同的角色,例如:
我需要在开头登录,然后在输入凭据后,应用程序需要重定向到主页。
这里的问题是:我该如何处理这些角色?我应该为每个角色都有一个命名空间吗?即:students / index.jsp,professors / index.jsp,admin / index.jsp或所有角色都有一个共同的命名空间?像home / index.jsp这样的东西?然后使用装饰器/复合模式让菜单根据角色有不同的选项?
对于这个问题,我知道我必须存储用户和角色,每个都在自己的表中,这个问题与处理演示文稿/导航/权限角色以及如何创建webapp结构有关,即有一个目录在webapp文件夹下,名为学生,另一个文件夹管理员,另一个学生和我上面提到的点(装饰者或复合图案)
当然,我不是在制作这么小的应用程序,但我想简化我面临的问题,以便创建一个基于Web的大型应用程序,我相信这些是主要原则。
感谢您的时间和帮助。
答案 0 :(得分:10)
你绝对不希望为不同的角色拥有单独的页面(“命名空间”),因为这几乎不可避免地导致代码重复。
您应该拥有每个功能的页面,并根据用户的角色限制访问。 (例如,某些菜单项对学生不可见,但为教授和管理员显示。)
你绝对不应该尝试重新发明轮子来管理基于角色的权限,因为有经验证的框架用于此目的:正如其他人已经指出的那样,在Java世界中,Spring和Spring Security是通往去。
我认为JSP作为技术正在老化,所以你应该开始学习Angular。
由于获得有效的Spring / Angular项目设置并非易事,我建议您使用JHipster application generator通过向导指导您完成整个过程(您只需回答一些问题 - 当被问及类型选择monolithic web application
):然后根据现代建议创建一个基于角色的安全性的工作项目配置。
如果您想在现代Web应用程序中了解基于角色的正确访问控制,那么查看JHipster生成的应用程序中使用的解决方案是我认为最好和最快的解决方案:
org.springframework.security.access.annotation.Secured
注释的用法<h1 *jhiHasAnyAuthority="'ROLE_ADMIN'">Hello, admin user</h1>
,您可以轻松采用自己的用例。monolithic web application
!)答案 1 :(得分:1)
您的问题没有单一的答案。一切都取决于项目的结构。如果您提到的角色之间存在许多共同点,那么最好对所有角色使用单个index.jsp。然后,您不必复制通用逻辑(js
和css
库,自定义通用脚本,视图和样式包含)。如果角色之间几乎没有共同点,那么最好为每个角色分别使用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特权
在您的情况下,您可能需要:
Admin
无法查看,编辑学生成绩。Student
可以查看分数但无法修改。Professor
可以查看,修改,添加分数。您可以执行以下操作:
然后在您的模板中,使用user.hasPrivilege
或user.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
但它需要时间和学习以正确的方式去做,所以在那之前我会做这样的事情:
例如,如果用户角色确定他们有权访问哪些页面,则这是一个简化的代码示例:
在您的网页开头:
<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