赛迪网 > IT技术 Java > 技术动态
  IT资讯搜索
 
IT产品搜索
[程序开发][网管世界][网络安全][数据库技术]
[操作系统][嘉宾聊天·在线访谈][活动集锦]
[精彩专题][Symantec专区][订阅IT技术周刊]
[开发论坛][网管论坛][安全论坛][数据库论坛]
[操作系统论坛][Sybase专区][IBM dW技术专区]
[病毒求助][病毒与漏洞播报][文档·源码下载]

Spring框架下实现基于组的用户权限管理

发布时间:2007.07.19 05:39     来源:赛迪网技术社区    作者:dxaw

在几乎所有的web应用中都需要对访问者(用户)进行权限管理, 因为我们希望某些页面只对特定的用户开放, 以及某些操作只有符合身份的用户才能进行。这之中涉及到了身份验证和权限管理. 只有单用户系统和多用户单权限系统才不需要权限管理。

在本文中, 使用了基于组的权限管理, 并在Spring框架下利用HandlerInterceptorAdapter和Hibernate进行实现。

User的结构是:

public class User {
 private int id;
 private String name;
 private String password;
 private Set<String> groups = new HashSet<String>();
}

UserGroup表:

user:intgroup:String使用联合主键, 在Java中没有对应的类。

Hibernate映射文件是:

<hibernate-mapping auto-import="true" default-lazy="false">
 <class name="net.ideawu.User" table="User">
 <cache usage="read-write" />
 <id name="id" column="id">
  <generator class="native"/>
 </id>
 <property name="name" column="name"/>
 <property name="password" column="password"/> 
 <set name="groups" table="UserGroup" cascade="save-update" lazy="false"> 
  <key column="user" />
  <element column="`group`" type="string" />
 </set>
 </class>
</hibernate-mapping>

一切的身份验证交给一个继承HandlerInterceptorAdapter的类来做:

import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
import org.springframework.web.util.UrlPathHelper;
import org.springframework.util.AntPathMatcher;
import org.springframework.util.PathMatcher;
...
public class AuthorizeInterceptor extends HandlerInterceptorAdapter { 
 private UrlPathHelper urlPathHelper = new UrlPathHelper(); 
 private PathMatcher pathMatcher = new AntPathMatcher(); 
 private Properties groupMappings;
 /** * Attach URL paths to group. */ 
 public void setGroupMappings(Properties groupMappings) { 
  this.groupMappings = groupMappings;
 }
 public boolean preHandle(HttpServletRequest request, HttpServletResponse response,
Object handler) throws Exception { 
  String url = urlPathHelper.getLookupPathForRequest(request);
  String group = lookupGroup(url);
  // 找出资源所需要的权限, 即组名 
  if(group == null){ 
   // 所请求的资源不需要保护. 
   return true; 
  }
  // 如果已经登录, 一个User实例被保存在session中.
  User loginUser = (User)request.getSession().getAttribute("loginUser"); 
  ModelAndView mav = new ModelAndView("system/authorizeError");
  if(loginUser == null){
   mav.addObject("errorMsg", "你还没有登录!");
   throw new ModelAndViewDefiningException(mav);
  }else{
   if(!loginUser.getGroups().contains(group)){ 
    mav.addObject("errorMsg", "授权失败! 你不在 <b>" + group + "</b> 组!");
    throw new ModelAndViewDefiningException(mav); 
   } return true; 
  }
 }
 /* * 查看 
 org.springframework.web.servlet.handler.AbstractUrlHandlerMapping.lookupHandler() 
 * Ant模式的最长子串匹配法. 
 */
 private String lookupGroup(String url){ 
  String group = groupMappings.getProperty(url); 
  if (group == null) {
   String bestPathMatch = null;
   for (Iterator it = this.groupMappings.keySet().iterator();it.hasNext();) {
    String registeredPath = (String) it.next();
    if (this.pathMatcher.match(registeredPath, url) && (bestPathMatch == null || 
bestPathMatch.length() <= registeredPath.length())) { 
     group = this.groupMappings.getProperty(registeredPath);
     bestPathMatch = registeredPath;
    }
   }
  }
  return group; 
 }
}

下面我们需要在Spring的应用上下文配置文件中设置:

<bean id="authorizeInterceptor" class="net.ideawu.AuthorizeInterceptor"> 
 <property name="groupMappings">
  <value>
   <!-- Attach URL paths to group -->
    /admin/*=admin
  </value>
 </property>
</bean>
<bean id="simpleUrlHandlerMapping" 
class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"> 
 <property name="interceptors"> 
  <list> 
  <ref bean="authorizeInterceptor" /> </list>
 </property>
 <property name="mappings"> 
  <value>
   /index.do=indexController /browse.do=browseController /admin/
removeArticle.do=removeArticleController 
  </value>
 </property>
</bean>

注意到"/admin/*=admin", 所以/admin目录下的所有资源只有在admin组的用户才能访问, 这样就不用担心普通访客删除文章了。使用这种方法, 你不需要在removeArticleController中作身份验证和权限管理, 一切都交给AuthorizeInterceptor。(责任编辑:龚勋)


[ 发表评论 ] 字体[  ] [ 打印 ] [ 进入博客 ] [ 进入论坛 ]  [ 推荐给朋友 ]
  相关文章
· 实例讲解Java语言利用搜索引擎收集网址 (07-17) · InfoQ:Spring 2.0 的新特性和应用实践 (07-13)
· 使用AJAX+J2EE实现一个网上会议室系统 (07-13) · Struts+Spring+Hibernate快速入门实例 (07-12)
· 总结Spring中XML配置的十二个最佳实践 (07-12) · Struts VS Spring:两种MVC框架的比较 (07-03)
· 用Spring AOP实现开发中松散耦合 (06-29) · Spring入门指引:理解Spring的打包方式 (06-29)
· Spring中反向控制和面向切面编程的应用 (06-28) · 使用Java来实现网络传输数据压缩的实例 (06-21)
  客户需求反馈表
* 姓  名:
更多资料  了解方案  认识厂商
* 单位名称:
* 联系电话:
* 电子邮件:
  赛迪推荐  
  手机·资费 ·新品·导购·评测·手机资费·宽带
手机搜索  诺基亚 N73 MOTO Z6
  IT产品 ·笔记本·台式机·服务器·打印·投影
IT产品搜索 
  IT技术 ·开发·网管·安全·数据库·操作系统
  信息化 ·热点·专题·访谈·周刊·方案案例
· 北京新规不能霸王硬上弓 网店牌照缓期执行
· 软件外包之变的新台阶: 提高全球交付能力
· ERP案例分析 SaaS带来冲击 IT服务商面临挑战
· 通方期货CRM解决方案 房地产行业CRM解决方案
  IT博客 ·曾剑秋·项立刚·Java学习·网管
  IT技术论坛 ·开发·网管·安全·数据库·系统