熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java開源技術 >> 正文

Spring框架下實現基於組的用戶權限管理

2013-11-23 20:40:25  來源: Java開源技術 
在幾乎所有的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映射文件是:

<hibernatemapping autoimport=true defaultlazy=false
 <class name=netideawuUser table=User
 <cache usage=readwrite />
 <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=saveupdate lazy=false
  <key column=user />
  <element column=`group` type=string />
 </set>
 </class>
</hibernatemapping> 

  一切的身份驗證交給一個繼承HandlerInterceptorAdapter的類來做:


   import orgspringframeworkwebservlethandlerHandlerInterceptorAdapter;
import orgspringframeworkwebutilUrlPathHelper;
import orgspringframeworkutilAntPathMatcher;
import orgspringframeworkutilPathMatcher;

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) {
  thisgroupMappings = groupMappings;
 }
 public boolean preHandle(HttpServletRequest request HttpServletResponse response Object handler) throws Exception {
  String url = urlPathHelpergetLookupPathForRequest(request);
  String group = lookupGroup(url);
  // 找出資源所需要的權限 即組名
  if(group == null){
   // 所請求的資源不需要保護
   return true;
  }
  // 如果已經登錄 一個User實例被保存在session中
  User loginUser = (User)requestgetSession()getAttribute(loginUser);
  ModelAndView mav = new ModelAndView(system/authorizeError);
  if(loginUser == null){
   mavaddObject(errorMsg 你還沒有登錄!);
   throw new ModelAndViewDefiningException(mav);
  }else{
   if(!loginUsergetGroups(ntains(group)){
    mavaddObject(errorMsg 授權失敗! 你不在 <b> + group + </b> 組!);
    throw new ModelAndViewDefiningException(mav);
   } return true;
  }
 }
 /* * 查看
 orgspringframeworkwebservlethandlerAbstractUrlHandlerMappinglookupHandler()
 * Ant模式的最長子串匹配法
 */
 private String lookupGroup(String url){
  String group = groupMappingsgetProperty(url);
  if (group == null) {
   String bestPathMatch = null;
   for (Iterator it = thisgroupMappingskeySet(erator();ithasNext();) {
    String registeredPath = (String) itnext();
    if (thispathMatchermatch(registeredPath url) && (bestPathMatch == null || bestPathMatchlength() <= registeredPathlength())) {
     group = thisgroupMappingsgetProperty(registeredPath);
     bestPathMatch = registeredPath;
    }
   }
  }
  return group;
 }

  下面我們需要在Spring的應用上下文配置文件中設置:

<bean id=authorizeInterceptor class=netideawuAuthorizeInterceptor
 <property name=groupMappings
  <value>
   <! Attach URL paths to group
    /admin/*=admin
  </value>
 </property>
</bean>
<bean id=simpleUrlHandlerMapping class=orgspringframeworkwebservlethandlerSimpleUrlHandlerMapping
 <property name=interceptors
  <list>
  <ref bean=authorizeInterceptor /> </list>
 </property>
 <property name=mappings
  <value>
   /indexdo=indexController /browsedo=browseController /admin/removeArticledo=removeArticleController
  </value>
 </property>
</bean> 

  注意到/admin/*=admin 所以/admin目錄下的所有資源只有在admin組的用戶才能訪問 這樣就不用擔心普通訪客刪除文章了使用這種方法 你不需要在removeArticleController中作身份驗證和權限管理 一切都交給AuthorizeInterceptor


From:http://tw.wingwit.com/Article/program/Java/ky/201311/28877.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.