JSF:认证和授权,最好的前进方式

标签 jsf jakarta-ee authentication jsf-2 authorization

我花了一整天的时间在Google上搜索,并在这里寻找各种问题,以期为实现身份验证和授权提供最佳的解决方案。我现在提出了解决方案的一部分,但希望有人可以填补空白。我意识到下面有很多文字,但是请忍受我:O)

背景

我继承了部分完成的CRM应用程序,该应用程序当前使用JSF 2.0,JavaEE 6,JPA和PostgreSQL数据库。不幸的是,最初以他们无穷的智慧开始构建此Web应用程序的人决定最好将身份验证/授权放到最后-我现在必须把它放进去。

该应用程序实质上分为三层- View ,托管bean和DAO。这意味着托管Bean特别“胖”,因为它们包含所有业务逻辑,验证和导航逻辑。

身份验证/授权要求

  • 基于表单的身份验证,针对PostgreSQL数据库中存储的凭据进行验证。
  • 唯一可公开访问(匿名用户)的页面是登录页面。
  • 我需要基于用户角色来阻止对应用程序某些区域的访问。例如,只有具有“管理员”角色的用户才能访问创建/编辑用户页面。
  • 我还需要能够限制对页面某些区域的访问。例如,具有“销售代表”角色的用户应该能够查看客户详细信息,但是仅当该用户具有“客户服务”角色时,才显示“保存/编辑”按钮。

  • 我在的位置

    我计划要做的第一件事就是遵循这个User Authentication and Authorization using JAAS and Servlet 3.0 Login示例。我相信这将满足我的前3个要求。

    为了显示/隐藏页面上的保存按钮等,我可以使用this SO answer中描述的技术。这将部分解决需求4,但是我认为我仍然需要确保操作方法和(或)受管bean本身的安全。例如,我希望能够在客户bean的save()方法中添加注释或其他内容,以确保只有具有“客户服务”角色的用户才能调用它-这就是我开始遇到问题的地方。

    我猜一个选择是做与我打算在 View 中做的事情类似的事情,并使用facesContext检查当前用户是否“在角色中”。我并不热衷于此,因为它只会使我的代码困惑,而宁愿使用注释。但是,如果我沿着这条路线走,我将如何返回http 403状态?

    javax.annotation.security。*批注似乎非常适合以声明方式定义对应用程序区域的访问,但是据我所知,只能将它们添加到EJB中。这意味着我需要将所有业务逻辑从当前驻留的托管bean移到新的EJB。我认为这将把业务逻辑分成自己的一组类(代理,服务或您选择调用的任何类)会有更多好处。这将是一个很大的重构,但是缺少单元测试或集成测试将无济于事。我不确定访问控制的职责是否也应该在这个新的服务级别上-我认为应该在托管bean上。

    其他替代品

    在研究过程中,我发现很多人提到诸如Spring和Seam之类的框架。我在Seam方面的经验有限,我认为它非常适合该项目,并且据我记忆,我相信它可以解决我遇到的授权问题,但是现在引入它为时已晚。 。

    我也看到过Shiro在各个地方都提到过。看过10 minute tutorial似乎很合适,尤其是与Deluan Quintao's taglib结合使用时,但是我找不到任何教程或示例来说明如何将其与JSF Web应用程序集成。

    我经常遇到的另一个替代方案是实现自定义解决方案,这对我来说似乎很疯狂!

    摘要

    总而言之,我真的很希望获得一些指导,以指导我是否在实现身份验证和授权方面走上了正确的道路,以及如何填写保护单个方法和/或托管Bean(或至少是保护Bean)的缺失部分。他们委托(delegate)给的代码)和/或如何手动返回HTTP状态403。

    最佳答案

    您是否尝试过使用Spring Security进行任何操作-最新版本3

    http://janistoolbox.typepad.com/blog/2010/03/j2ee-security-java-serverfaces-jsf-spring-security.html

    http://ocpsoft.org/java/jsf-java/spring-security-what-happens-after-you-log-in/

    Spring 安全性是一个全面的安全性框架,而不是使用请求过滤器或使用JAAS,它将解决您的大多数安全性问题。
    您可以使用它来使用db领域对用户进行身份验证,对其进行授权并根据提供的身份验证信息进行必要的重定向。

    您可以确保已编写的方法
    http://blog.solidcraft.eu/2011/03/spring-security-by-example-securing.html

    @PreAuthorize(“hasRole('ROLE_XXX')”)是

    使页面的某些元素安全。

    //内容

    更多阅读和示例
    http://static.springsource.org/spring-security/site/petclinic-tutorial.html

    关于JSF:认证和授权,最好的前进方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10554654/

    相关文章:

    java - JSF 页面无法使用 Openshift 在 Internet Explorer 中查看,但可以在本地主机和 Chrome 上查看

    java - ajax 请求的 JSF 性能问题

    java - 如何在 Spring MVC 应用程序中使用数据表?

    java - Java EE 应用程序如何在没有任何 main 方法的情况下开始执行以及控制权如何转移到不同的类

    jakarta-ee - 应用程序客户端通过远程接口(interface)访问 Glassfish 上的 EJB。我可以通过本地界面完成吗?

    asp.net-mvc - 是否可以使用 ASP.NET MVC 创建登录系统但不使用成员资格提供程序?

    java - 在 JSF 中下载 PDF 返回空白页

    java - 如何将 Quartz 与 EJB3 一起使用?

    php - 如何将内存中的用户提供者注入(inject)到服务中?

    http - 使用 Curl 下载 Redmine 甘特图 PNG?