乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      Spring框架下實現(xiàn)基于組的用戶權(quán)限管理

       WindySky 2009-03-20
      在幾乎所有的web應(yīng)用中都需要對訪問者(用戶)進(jìn)行權(quán)限管理, 因為我們希望某些頁面只對特定的用戶開放, 以及某些操作只有符合身份的用戶才能進(jìn)行。這之中涉及到了身份驗證和權(quán)限管理. 只有單用戶系統(tǒng)和多用戶單權(quán)限系統(tǒng)才不需要權(quán)限管理。

        在本文中, 使用了基于組的權(quán)限管理, 并在Spring框架下利用HandlerInterceptorAdapter和Hibernate進(jìn)行實現(xiàn)。

        User的結(jié)構(gòu)是:

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

        UserGroup表:

        user:intgroup:String使用聯(lián)合主鍵, 在Java中沒有對應(yīng)的類。

        Hibernate映射文件是:

      <hibernate-mapping auto-import="true" default-lazy="false">
      ?。糲lass name="net.ideawu.User" table="User">
       <cache usage="read-write" />
      ?。糹d name="id" column="id">
       ?。糶enerator class="native"/>
      ?。?id>
       <property name="name" column="name"/>
      ?。紁roperty name="password" column="password"/>
      ?。約et name="groups" table="UserGroup" cascade="save-update" lazy="false">
       ?。糼ey 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);
        // 找出資源所需要的權(quán)限, 即組名
        if(group == null){
         // 所請求的資源不需要保護(hù).
         return true;
        }
        // 如果已經(jīng)登錄, 一個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", "授權(quán)失敗! 你不在 <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的應(yīng)用上下文配置文件中設(shè)置:

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

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

        本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多