`
julyboxer
  • 浏览: 219115 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

JSF的权限设计

    博客分类:
  • java
阅读更多
角色受限采访URL。
    由于JSF的流程在Servlet Filter之后, 所以不能使用Filter的层面获取到JSF的一些请求路径信息,即javax.faces.context.FacesContext.getCurrentInstance()应该是空的。
    这里可以使用javax.faces.event.PhaseListener来获取请求和输出路径信息。在face-config.xml配置好即可获取到请求和输出的页面路径。例如,用户当前处于公用页面A.jsf, 现在按链接想跳转到B.jsf; JSF首先会恢复A.jsf的视图,这时PhaseListener,验证合法就输出视图到B.jsf, 这时又会来到PhaseListener 恢复视图B.jsf, 可以将鉴权的代码添加到或BeforeParse, AfterParse方法里。
    ParseListener对h:outputLink或CommandLink是应该是可行的,因为只是对链接进行限制。 如果对于CommandButton可能是不行的,例如A.jsf 点击按钮action="#{bBean.bAction}",
    public String bAction() ...{
        //能够进入到方法内部,如果这里是很多逻辑操作,数据操作的话。。。。
        return "B_JSF";
        //只有在return之后ParseListener才能限制鉴权,那就晚了。而链接就不同,因为它没什么逻辑操作。
    }

    这种鉴权就要用到下面提到的第二种方法。

package web;

import java.io.IOException;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import javax.faces.event.PhaseEvent;
import javax.faces.event.PhaseId;
import javax.faces.event.PhaseListener;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

/** *//**
* @author zealvampire
* @version 1.0  2006-10-17
*/
public class SecurityPhaseListener implements PhaseListener ...{

    private static final long serialVersionUID = 6186106530012195240L;
  
    private static final Log log = LogFactory.getLog(SecurityPhaseListener.class);


    /**//* (non-Javadoc)
     * @see javax.faces.event.PhaseListener#afterPhase(javax.faces.event.PhaseEvent)
     */
    public void afterPhase(PhaseEvent event) ...{
      
        PhaseId phaseId = event.getPhaseId();
        if (phaseId == PhaseId.RESTORE_VIEW || phaseId == PhaseId.INVOKE_APPLICATION) ...{
            FacesContext currentContext = FacesContext.getCurrentInstance();
            String viewId= currentContext.getViewRoot().getViewId();
            //ViewId 就是我们需要的路径,类似URL
    }

    /**//* (non-Javadoc)
     * @see javax.faces.event.PhaseListener#beforePhase(javax.faces.event.PhaseEvent)
     */
    public void beforePhase(PhaseEvent event) ...{
    }

    /** *//**
     *  (non-Javadoc)
     * @see javax.faces.event.PhaseListener#getPhaseId()
     */
    public PhaseId getPhaseId() ...{
        return PhaseId.ANY_PHASE;
    }

}

face-config.xml
<faces-config>
    <lifecycle>
        <phase-listener>
           web.SecurityPhaseListener
        </phase-listener>
    </lifecycle>
</face-config>


2. 扑获JSF中用户要执行的Action
    例子,用户在A.jsf点击CommandButton action="#{bBean.bAction}" 要是我们能在这个动作执行之前扑获到它并进行鉴权的话, 那就Sofu了。
    这个我是看Myfaces源码以及看face-config.xml格式看到的, 里面有个ActionListener, 猜猜是什么东西? 是的,就像写Swing一样,用来处理消息和动作的。先看看Myfaces的默认实现。
/**//*
* Copyright 2004 The Apache Software Foundation.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
*      http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.myfaces.application;

import javax.faces.FacesException;
import javax.faces.application.Application;
import javax.faces.application.NavigationHandler;
import javax.faces.component.ActionSource;
import javax.faces.context.FacesContext;
import javax.faces.el.EvaluationException;
import javax.faces.el.MethodBinding;
import javax.faces.event.AbortProcessingException;
import javax.faces.event.ActionEvent;
import javax.faces.event.ActionListener;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;


/** *//**
* @author Manfred Geiler (latest modification by $Author: mbr $)
* @author Anton Koinov
* @version $Revision: 231425 $ $Date: 2005-08-11 07:49:45 -0400 (Thu, 11 Aug 2005) $
*/
public class ActionListenerImpl
    implements ActionListener
...{
    private static final Log log = LogFactory.getLog(ActionListenerImpl.class);

    public void processAction(ActionEvent actionEvent) throws AbortProcessingException
    ...{
        FacesContext facesContext = FacesContext.getCurrentInstance();
        Application application = facesContext.getApplication();

        ActionSource actionSource = (ActionSource)actionEvent.getComponent();
        MethodBinding methodBinding = actionSource.getAction();

        String fromAction;
        String outcome;
        if (methodBinding == null)
        ...{
            fromAction = null;
            outcome = null;
        }
        else
        ...{
            fromAction = methodBinding.getExpressionString();
            try
            ...{
                outcome = (String) methodBinding.invoke(facesContext, null);
            }
            catch (EvaluationException e)
            ...{
                Throwable cause = e.getCause();
                if (cause != null && cause instanceof AbortProcessingException)
                ...{
                    throw (AbortProcessingException)cause;
                }
                else
                ...{
                    throw new FacesException("Error calling action method of component with id " + actionEvent.getComponent().getClientId(facesContext), e);
                }
            }
            catch (RuntimeException e)
            ...{
                throw new FacesException("Error calling action method of component with id " + actionEvent.getComponent().getClientId(facesContext), e);
            }
        }

        NavigationHandler navigationHandler = application.getNavigationHandler();
        navigationHandler.handleNavigation(facesContext,
                                           fromAction,
                                           outcome);
        //Render Response if needed
        facesContext.renderResponse();

    }
}

    看到fromAction = methodBinding.getExpressionString();这个你就偷笑了吧,那确实,这个就是我们要的bBean.bAction 模仿这个类重新写一个类吧,。然后在face-config.xml配置一下。
  
<application>
        <variable-resolver>
            org.springframework.web.jsf.DelegatingVariableResolver
        </variable-resolver>
        <action-listener>OurOwnActionListenerImpl</action-listener>
    </application>

    ActionListener是一个接口,我想在其他JSF的实现,应该也是通过的吧。
分享到:
评论

相关推荐

    jsf 用户登陆界面

    创建一个名为`login.xhtml`的文件,用HTML和JSF组件来设计登录表单。例如: ```html 用户名:" /&gt; 密码:" /&gt; 登录" action="#{loginBean.login}" /&gt; ``` - 这里使用了`&lt;h:inputText&gt;`和`...

    EJB JSF开发员工信息系统

    4. **权限管理**:EJB处理角色和权限分配,JSF界面展示和修改权限。 5. **报表生成**:EJB计算统计信息,JSF展示图表或导出报表。 ### 优化与扩展 1. **安全性**:利用Java EE的安全机制,如JAAS(Java ...

    JSF-AV-rules.rar_JSF AV rule_JSF-AV_JSF-AV-rules_航空C++编程规范

    8. **安全性**:包括输入验证、权限管理、安全编程实践等,以防止潜在的安全漏洞。 9. **可靠性**:规范可能包含关于容错设计、故障恢复和冗余策略的指导,以确保系统的高可用性。 10. **维护性**:提倡代码的清晰...

    Jsf整合三大框架及Spring Security

    通过这样的整合,开发者可以构建出一个健壮、可扩展且易于维护的Web应用程序,利用JSF的组件模型,Spring的强大功能,Hibernate的数据管理,PrimeFaces的UI设计,以及Spring Security的安全保障,为企业级应用开发...

    jsf+hibernate+javabean完成对表的增删查改

    6. **设计JSF界面**:使用JSF的UI组件创建用户界面,将这些组件的数据绑定到Managed Bean的属性,从而实现数据的双向绑定。例如,使用`h:inputText`显示和编辑数据库记录,`h:commandButton`触发CRUD操作。 7. **...

    JSF+SSH开发应用实例

    3. **Struts框架**: Struts是基于MVC设计模式的Web应用框架,主要用于控制应用程序的流程。它通过Action类来处理用户的请求,并决定接下来的视图。在JSF+SSH集成中,Struts通常用作连接JSF和Spring的桥梁,处理HTTP...

    一个jsf企业级程序示例

    JavaScript Faces (JSF) 是Java平台上的一种用于构建用户界面的模型-视图-控制器(MVC)框架,专为创建企业级Web应用程序而设计。这个"一个jsf企业级程序示例"旨在向开发者展示如何有效地利用JSF来构建高效、可维护...

    jsf增删改查带数据库

    总结起来,"jsf增删改查带oracle数据库"是一个典型的Web开发应用场景,涉及到JSF框架的UI设计、数据绑定、事件处理,以及Oracle数据库的JDBC操作、SQL命令编写和MVC架构的应用。通过学习和实践这一主题,开发者可以...

    jsf实现增删改查的一个简单例子

    虽然它没有实现分页,但对于初学者来说,理解这个例子可以帮助他们更好地掌握JSF的UI设计、Managed Bean的使用以及通过Hibernate进行数据库操作的基本流程。对于进一步的学习,开发者可以尝试添加更多复杂的功能,如...

    jsf+spring+hibernate实例

    通过Spring的AOP,可以方便地进行日志记录、权限验证等横切关注点的处理。 **Hibernate** Hibernate是一个流行的Java ORM(对象关系映射)框架,它简化了数据库操作,让开发者可以用面向对象的方式处理数据库事务。...

    jsf 文件上传和下载

    2. **表单设计**:创建一个HTML或JSF表单,包含一个`&lt;input type="file"&gt;`元素,允许用户选择要上传的文件。例如: ```html ``` 这里使用了PrimeFaces的`&lt;p:fileUpload&gt;`组件,它简化了文件上传的处理。 3. *...

    图书管理系统-BookM_JSF_iBatis_Spring

    5. **系统架构**:《图书管理系统》采用MVC(Model-View-Controller)设计模式,模型层由iBatis处理数据库操作,视图层由JSF和ajax4jsf共同构建,控制器层则由Spring管理,这种架构保证了系统的可维护性、可扩展性和...

    JSF+primefaces 网盘实现代码前端

    - 权限管理:根据用户角色设置不同的访问权限,如读、写、执行等。 总结来说,这个"JSF+primefaces 网盘实现代码前端"项目将利用JSF的强大力量,结合PrimeFaces的丰富组件,以及HTML、CSS和JavaScript的基础技术,...

    JCatalog电子商务系统案例 jsf+spring+hibernate

    开发者可能会在其中学习到如何配置和使用这些框架,如何设计和实现业务逻辑,以及如何处理并发和安全性等问题。项目可能包含以下组件: 1. **前端界面**:由JSF组件构成,处理用户输入,展示商品信息,实现购物车和...

    精通JSF-基于EJB Hibernate Spring整合开发与项目实践-第15章代码

    8. **MVC模式在JSF中的实现**:解释JSF如何符合MVC设计模式,以及如何分离视图、模型和控制器。 9. **性能优化**:可能包括了JSF的缓存机制、EJB的懒加载策略、以及Spring的缓存支持等提高系统性能的方法。 10. **...

    jsf-facelets1.1.9

    该文件通常包含软件的许可证信息,详细说明了JSF Facelets 1.1.9的使用权限和限制。阅读此文件可以帮助开发者了解软件的授权条款,确保合法合规地使用该技术。 总的来说,JSF Facelets 1.1.9作为JSF生态系统的一...

    mastering jsf

    - **安全性和授权**:探讨如何保护JSF应用免受攻击并实现用户权限管理。 #### 四、案例分析 为了更好地理解和应用JSF的技术要点,本书还提供了多个实际案例,例如: - **登录表单**:构建一个包含用户名和密码...

    JSF实战

    3. **关机功能**:虽然不常见,但在特定场景下,JSF可以用来创建一个能够发送系统关机命令的Web应用,但这通常需要服务器端的特殊权限和API支持。 **四、源码分析** 提供的压缩包文件`mann_srcs.part06.rar`、`mann...

    JSF框架网上银行系统

    1. **用户认证与授权**: 网银系统必须具备强大的用户身份验证和权限管理功能,确保用户的安全登录和操作权限控制。 2. **账户管理**: 包括账户信息展示、余额查询、交易记录查看等。 3. **转账与支付**: 用户可以...

    JSF 2 + Spring 3 integration example

    - 通过配置 Spring Security 过滤器,可以拦截并处理用户的登录请求,同时在 JSF 页面上展示相应的权限控制。 5. **AOP 在 JSF 中的应用**: - Spring 的 AOP 功能可以在 JSF Managed Bean 的方法调用前后添加切...

Global site tag (gtag.js) - Google Analytics