`
fangzhouxing
  • 浏览: 211598 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

JBoss Seam (POJO without EJB) 后台 + ExtJS 前台完整例子(十一)

阅读更多

JBoss Seam (POJO without EJB) 后台 + ExtJS 前台完整例子(十一)


1.引言

随着internet的发展,业务过程、事务以及企业信息需要向更广泛的用户群公开。这一变化给应用程序和基础设施带来了重大的影响,其中最明显的影响就是应用程序安全方面。Seam框架提供了可选的安全性API,可以实现身份验证(authentication)和授权(authorization)功能。

本文主要介绍项目中安全性方面的初步实践,更深入的内容有待于进一步的开发经验的积累。

2.基本的安全性需求

本项目要求实现下列基本的安全性需求:
(1)可以让用户没有限制地使用登录页面和注册新用户页面。
(2)其它任何页面,必须先登录才能使用。
(3)远程外观类中通过Seam Remoting暴露的后台服务,除登录和新建用户外,只能被已经登录的用户调用。
(4)通过Servlet暴露的服务,只能被已经登录的用户调用。

3. 扩展 Identity 类

Seam框架内建了Identity组件类,提供安全性管理功能。本项目通过 com.divo.core.misc.ExtendedIdentity 扩展了Identity 类:

java 代码
  1. @Name("org.jboss.seam.security.identity")
  2. @Scope(SESSION)
  3. @Install(precedence = APPLICATION)
  4. @BypassInterceptors
  5. @Startup
  6. public class ExtendedIdentity extends Identity {
  7. @Override
  8. public boolean hasPermission(String name, String action, Object... arg) {
  9. return true;
  10. }
  11. @Override
  12. public void checkPermission(String name, String action, Object... arg) {
  13. if (!isLoggedIn()) {
  14. Events.instance().raiseEvent("org.jboss.seam.notLoggedIn");
  15. throw new NotLoggedInException();
  16. }
  17. }
  18. @Override
  19. public void checkRestriction(String expr) {
  20. if (!isLoggedIn()) {
  21. Events.instance().raiseEvent("org.jboss.seam.notLoggedIn");
  22. throw new NotLoggedInException();
  23. }
  24. }
  25. }

这篇文章所述,通过无依赖扩展,ExtendedIdentity 将代替内建的 Identity 组件。

4. 页面访问权限控制

页面访问权限控制在 page.xml 中设置:
xml 代码
  1. <exception class="org.jboss.seam.security.NotLoggedInException">
  2. <redirect view-id="/app/home.xhtml">
  3. <!---->redirect>
  4. <!---->exception>
  5. <page view-id="/app/sample/*">
  6. <restrict/>
  7. <!---->page>


其中的 exception 配置,使得异常 NotLoggedInException 抛出时,会自动跳转到登录首页。而 page 属性配置,使得用户没有登录而试图访问 /app/sample 目录(及其子目录)下的页面时,将受到限制。

显然,用户访问 /app/sample 目录以外的页面时,将不受限制。

所谓“受到限制”,实际上就是Seam框架会自动调用 ExtendedIdentity 组件的 checkRestriction 方法。如果判断用户没有登录,则抛出 NotLoggedInException 异常。

5. 登录功能与Seam集成

应用程序通过用户名和密码让合法用户登录,为了利用Seam框架提供的安全性设施,需要与Seam集成。

本项目的集成方法如下:

第1步:配置 components.xml

xml 代码
  1. <security:identity authenticate-method="#{userService.authenticate}"/>

第2步:在 UserService 类中,按通常方法实现 login 服务。

第3步:登录验证通过后,在 Identity 组件中填入当前登录用户的用户名和密码,并调用其 login 方法:

java 代码
  1. identity.setUsername(name);
  2. identity.setPassword(password);
  3. identity.login();


第4步:按照 components.xml 中的配置,在 UserService 类在实现 authenticate 方法。

java 代码
  1. public boolean authenticate() {
  2. return true;
  3. }

因为应用程序的登录验证已经在 login 方法中实现,所以 authenticate 方法仅仅是走走形式而已。

第5步:在 UserService 类中实现注销功能:

java 代码
  1. identity.logout();


6. 使用@Restrict元注解

@Restrict 元注解可以应用到类,也可以应用到类方法。@Restrict 元注解将引导 Seam 框架去执行
Identity.checkRestriction() 方法。

本项目中,要求在服务层组件添加 @Restrict 元注解。因为远程外观类和Servlet类都必须通过服务层
组件实现具体的功能,因此同时满足了通过Seam Remoting和Servlet暴露的后台服务对安全性的要求。

7. 进一步的扩展

本项目实现的安全性还是初步的,实际项目往往会考虑按角色对用户进行分组。每个角色规定相应的权限。
通过进一步扩展 ExtendedIdentity.checkRestriction() 的功能,可以实现基于角色的安全性控制。

8. 结语

Seam框架提供的安全性API和机制细致而周到,简化了开发,值得进行深入的学习和研究。

附:下面是本系列所有文章的完整列表:
(1)下载示例项目并安装运行
(2)建立Eclipse开发环境
(3)熟悉项目中与JSF相关内容
(4)重新认识JS
(5)ExtJS之表单(Form)
(6)ExtJS之布局(Layout)
(7)ExtJS之网格(Grid)
(8)Java后台和前台的通讯机制
(9)Seam框架简化Java开发
(10)分层架构设计
(11)安全性
(12)单元测试

3
0
分享到:
评论
10 楼 lihaigreat 2009-01-08  
thank u ,很有启发,还有其他的文章吗?
9 楼 Runningboy007 2008-04-28  
支持,楼主辛苦了
8 楼 dboylx 2008-03-28  
单元测试看不到。。。
7 楼 dboylx 2008-03-28  
赞~~~顶个,
6 楼 xwzhang 2008-03-27  
楼主辛苦了,赞~!
5 楼 programming 2008-02-20  
我不顶一下,心里还真过不去
4 楼 fangzhouxing 2008-02-19  
谢谢edmic指正,文章发表后不敢修改,一改很多代码片段的样式会变样。
3 楼 edmic 2008-02-14  
楼主辛苦了,学习中!

在本系列所有文章的完整列表中关于 单元测试 的链接有误,应为 http://fangzhouxing.iteye.com/blog/147608
2 楼 jacally 2008-01-07  
博主辛苦了,努力学习中.
1 楼 springhill 2007-12-11  
不能不说很精彩、很全面,很感谢,呵呵

相关推荐

Global site tag (gtag.js) - Google Analytics