<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    云自無心水自閑

    天平山上白云泉,云自無心水自閑。何必奔沖山下去,更添波浪向人間!
    posts - 288, comments - 524, trackbacks - 0, articles - 6
      BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理
    Tapestry中并沒有類似于Spring Security這樣的專門的權限框架。對此Tapestry的作者Lewis認為主要是用戶對于權限的要求實在太多變化了。他認為很難抽象出一個通用的權限框架來滿足所有的用戶,所以他干脆就不費事去做這件事了。但其實我們很容易就能利用Tapestry已有的工具來完成類似于SpringSecurity的功能。
    本文主要介紹如何實現類似于SpringSecurity的jsp tag的功能。在Tapestry中,利用Components實現這一點非常容易。
    其基本原理是Tapestry5中一個頁面或者組件的渲染生成過程是基于一個狀態機和隊列完成的。這樣,渲染生成過程就被細分成了很多個小模塊,我們可以非常容易地覆寫這些小模塊。具體內容詳見官方文檔:http://tapestry.apache.org/tapestry5.1/guide/rendering.html。如果權限校驗不通過,我們就可以控制不顯示組件的內容。
    我們這里就是主要依賴這個過程來實現在頁面這一層面對權限進行校驗和控制。
    代碼主要包含兩大部分,一個組件和一個用于權限控制的服務。
    參考了Tapestry-Spring-Security的實現,我也將組件命名為IfRole(當然,我們也可以和Tapestry-Spring-Security一樣,也再生成一個IfLoggedIn組件)。權限控制的服務我命名為:AuthenticationService。
    主要的實現思路:
    將AuthenticationService申明為SessionState變量。這樣這個變量就可以在所有的頁面和組件之間很方便地共享了。一般情況下,是在登錄頁面對AuthenticationService進行賦值,而在退出頁面清空AuthenticationService這個變量。
    代碼(這部分代碼完全根據應用的需求進自行更改):
    AuthenticationService的代碼:
    public class AuthenticationService {
        
    private List<String> privilegeList;
        
    // privilegeList 的getter and setter

        
    public boolean checkPermission(String ifNotGranted, String ifAllGranted,
                String ifAnyGranted) 
    {
            
    if (((null == ifAllGranted) || "".equals(ifAllGranted))
                    
    && ((null == ifAnyGranted) || "".equals(ifAnyGranted))
                    
    && ((null == ifNotGranted) || "".equals(ifNotGranted))) {
                
    return false;
            }


            
    if ((null != ifNotGranted) && !"".equals(ifNotGranted)) {
                StringTokenizer st 
    = new StringTokenizer(ifNotGranted, ",");
                
    while (st.hasMoreTokens()) {
                    String value 
    = st.nextToken();
                    
    if (privilegeList.contains(value)) {
                        
    return false;
                    }

                }

            }


            
    if ((null != ifAllGranted) && !"".equals(ifAllGranted)) {
                StringTokenizer st 
    = new StringTokenizer(ifAllGranted, ",");
                
    while (st.hasMoreTokens()) {
                    String value 
    = st.nextToken();
                    
    if (!privilegeList.contains(value)) {
                        
    return false;
                    }

                }

            }


            
    if ((null != ifAnyGranted) && !"".equals(ifAnyGranted)) {
                StringTokenizer st 
    = new StringTokenizer(ifAnyGranted, ",");
                
    while (st.hasMoreTokens()) {
                    String value 
    = st.nextToken();
                    
    if (privilegeList.contains(value)) {
                        
    return true;
                    }

                }

                
    return false;
            }


            
    return true;
        }

    }

    IfRole的代碼(這個類需要放在Components目錄下):
    public class IfRole {
        
    /**
         * A comma-separated list of roles is supplied to one or more of the
         * following parameters. If none are supplied, the default behavior is to
         * forbid access. Behavior should be self-explanatory.
         
    */

        @Parameter(required 
    = false, defaultPrefix = "literal")
        
    private String ifAllGranted;

        @Parameter(required 
    = false, defaultPrefix = "literal")
        
    private String ifAnyGranted;

        @Parameter(required 
    = false, defaultPrefix = "literal")
        
    private String ifNotGranted;

        
    /**
         * An alternate {
    @link Block} to render if the test parameter is false. The default, null, means
         * render nothing in that situation.
         
    */

        @Parameter(name 
    = "else")
        
    private Block elseBlock;

        
    private boolean test;
       
        @SessionState
        
    private AuthenticationService auth;

        
    private boolean checkPermission() {
            
    return auth.checkPermission(ifNotGranted, ifAllGranted, ifAnyGranted);
        }

       
        
    void setupRender() {
            test 
    = checkPermission();
        }


        
    /**
         * Returns null if the test method returns true, which allows normal
         * rendering (of the body). If the test parameter is false, returns the else
         * parameter (this may also be null).
         
    */

        Object beginRender() 
    {
            
    return test ? null : elseBlock;
        }


        
    /**
         * If the test method returns true, then the body is rendered, otherwise not. The component does
         * not have a template or do any other rendering besides its body.
         
    */

        
    boolean beforeRenderBody() {
            
    return test;
        }

       
    }


    示例:
    1. 在登錄頁面:
    @SessionState
    private Authentication auth;

    ......

    // if user name and password is valid:
    auth.setPrivliegeList(.....);


    2. 在需要權限控制的頁面模板中:
    <t:ifRole ifAllGranted="admin">
            administrator can see this block
    </t:ifRole>



    主站蜘蛛池模板: 亚洲精品少妇30p| 亚洲影视自拍揄拍愉拍| 久久永久免费人妻精品下载| 亚洲一级特黄大片无码毛片 | 亚洲精品免费网站| 亚洲av无码一区二区三区在线播放 | 国产特黄一级一片免费| 亚洲AV日韩精品久久久久久久 | 欧美最猛性xxxxx免费| 人禽伦免费交视频播放| 久久久久亚洲AV无码网站| 四虎在线免费播放| 免费人成网站在线观看不卡| 国产精品亚洲片在线va| 亚洲自偷自偷图片| 啦啦啦在线免费视频| 久久精品一区二区免费看| 欧美色欧美亚洲另类二区| 91大神亚洲影视在线| 亚洲天堂免费在线视频| 成人无遮挡裸免费视频在线观看 | 国产精品亚洲片在线花蝴蝶| 亚洲a一级免费视频| 免费大片在线观看网站| 日韩在线不卡免费视频一区| 日韩免费码中文在线观看| 国产色在线|亚洲| 亚洲电影一区二区| 亚洲乱码中文字幕手机在线| 国产麻豆视频免费观看| 免费在线看黄的网站| 国产精品亚洲片在线花蝴蝶| 亚洲一区二区三区免费在线观看| 亚洲午夜国产精品无码| 国产裸模视频免费区无码| 免费可以看黄的视频s色| 国产啪精品视频网站免费尤物| 精品亚洲国产成人av| 自拍日韩亚洲一区在线| 亚洲午夜精品久久久久久人妖| 亚洲中文字幕第一页在线|