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



    主站蜘蛛池模板: 情人伊人久久综合亚洲| 亚洲一区二区三区不卡在线播放| 久久国产精品免费专区| 亚洲日韩中文字幕| 免费播放春色aⅴ视频| 亚欧免费一级毛片| 亚洲乱亚洲乱妇24p| 亚洲色欲久久久综合网| 亚洲人成电影网站免费| jzzjzz免费观看大片免费| 亚洲无砖砖区免费| 久久久无码精品亚洲日韩软件 | 亚洲国产黄在线观看| 一级毛片免费视频| 国产偷国产偷亚洲高清在线| 久久亚洲精品人成综合网| 国产大片免费观看中文字幕| 久久狠狠躁免费观看2020| 国产成人亚洲综合在线| 精品日韩亚洲AV无码一区二区三区| 免费一看一级毛片全播放| 午夜精品射精入后重之免费观看| 激情小说亚洲图片| 亚洲国产成人资源在线软件| 久久精品亚洲乱码伦伦中文| 成人免费在线观看网站| 久久久久国色av免费看| 国产亚洲女在线线精品| 亚洲图片中文字幕| 国产成人精品日本亚洲网站| 四虎免费久久影院| 毛片基地免费观看| 中文字幕免费观看| 日韩电影免费在线观看网站| 国产成人综合亚洲绿色| 国产精品亚洲片在线va| 精品亚洲成a人片在线观看| 亚洲国产第一站精品蜜芽| 亚洲精品成人网久久久久久| 日韩精品视频免费网址| 青青草a免费线观a|