J2EE+Flex的菜單及權限控制實踐
最近學習了下Flex,我一直是搞J2EE的。所以想整合試著開發,J2EE+Flex在網上查了些資料,有好幾種方法。我這里使用的是blazeds,Flex通過RemoteObject調用Java的后臺方法。我個人覺得這樣的一個***的好處就是不再需要struts這樣之類的框架了,可以直接使用spring中的bean。要使用spring就必須先說下spring的整合問題,其實這個網上也有,只要就是一個SpringFactory類,這個類要實現FlexFactory接口,然后在WEB-INF/flex/services-config.xml中注冊改factory。代碼如下:
- < factories>
- < factory id="springContext" class="com.wangmeng.flex.SpringFactory">< /FACTORY>
- < /FACTORIES>
這樣配置好以后在WEB-INF/flex/remote-config.xml中只要把factory的名字寫成和上面配置對應的名字如:springContext,source的值配置為spring中bean的id就可以了。例如:
- < destination id="userLoginService">
- < properties>
- < factory>springContext< /FACTORY>
- userLoginService< /SOURCE>
- < /PROPERTIES>
- < /DESTINATION>
具體SpringFactory類的源代碼網上也有。
下面我說下我構思的控制菜單及權限的方法:首先要控制肯定要有用戶登錄的環節,這里具體怎么實現都可以,當時登陸后要將用戶的信息保存在session中,一遍在檢查權限是使用。獲取request,session都是通過flex.messaging.FlexContext提供的靜態方法
首先說菜單的控制,當用戶打開首頁,客戶端遠程調用加載菜單信息,當然這是沒有登陸,只有一些公開的菜單可以看見,用戶登錄后可以再重新加載菜單,這是系統會根據用戶的特權等級決定要返回的菜單列表(這里菜單的返回的數據來源你可以自己決定,可以放在數據庫里也可以是其他的)。
當然,只是這樣控制肯定不夠安全,那就是后面要說的對用spring中bean調用的控制:
要控制spring中的bean不被越權調用當然要從前面的SpringFactory類著手啦,我們需要在每次調用bean之前通過bean的名字檢查該用戶是否有權調用,如果有權調用就返回該bean,如果沒有權限就拋出一個沒有權限的ServiceException類。還是具體看下我的實現代碼吧,也許不是很優美,但是功能大致都實現了。
- package com.wangmeng.flex;
- import java.util.HashMap;
- import java.util.List;
- import javax.servlet.http.HttpSession;
- import org.springframework.context.ApplicationContext;
- import org.springframework.web.context.support.WebApplicationContextUtils;
- import org.springframework.beans.BeansException;
- import org.springframework.beans.factory.NoSuchBeanDefinitionException;
- import com.wangmeng.web.data.SysPrivilege;
- import com.wangmeng.web.data.User;
- import com.wangmeng.web.service.privilege.PrivilegeService;
- import flex.messaging.FactoryInstance;
- import flex.messaging.FlexFactory;
- import flex.messaging.config.ConfigMap;
- import flex.messaging.services.ServiceException;
- public class SpringFactory implements FlexFactory {
- private static final String SOURCE = "source";
- private static HashMap beanMap = new HashMap();//存放權限檢查項
- //在factory初始化是裝在權限信息
- public void initialize(String id, ConfigMap configMap) {
- ApplicationContext appContext = WebApplicationContextUtils
- .getWebApplicationContext(flex.messaging.FlexContext
- .getServletConfig().getServletContext());
- PrivilegeService priviService = (PrivilegeService) appContext
- .getBean("sysPrivilegeService");
- List priviList = priviService.listAll();
- for (Object obj : priviList) {
- SysPrivilege privi = (SysPrivilege) obj;
- String name = privi.getServiceName();
- beanMap.put(name, privi);
- }
- }
- public FactoryInstance createFactoryInstance(String id, ConfigMap properties) {
- SpringFactoryInstance instance = new SpringFactoryInstance(this, id,
- properties);
- instance.setSource(properties.getPropertyAsString(SOURCE, instance
- .getId()));
- return instance;
- }
- public Object lookup(FactoryInstance inst) {
- SpringFactoryInstance factoryInstance = (SpringFactoryInstance) inst;
- return factoryInstance.lookup();
- }
- static class SpringFactoryInstance extends FactoryInstance {
- SpringFactoryInstance(SpringFactory factory, String id,
- ConfigMap properties) {
- super(factory, id, properties);
- }
- public String toString() {
- return "SpringFactory instance for id=" + getId() + " source="
- + getSource() + " scope=" + getScope();
- }
- //在每次查找spring bean之前檢查權限。
- public Object lookup() {
- String beanName = getSource();
- SysPrivilege privi = (SysPrivilege) beanMap.get(beanName);
- boolean hasRight = false;
- if (privi==null||privi.getLevel() <= 0) {
- hasRight = true;
- } else {
- HttpSession session = flex.messaging.FlexContext
- .getHttpRequest().getSession();
- User user = (User) session.getAttribute("user");
- if (user != null && user.getPrivilege() >= privi.getLevel()) {
- hasRight = true;
- } else {
- hasRight = false;
- }
- }
- if (hasRight) {
- ApplicationContext appContext = WebApplicationContextUtils
- .getWebApplicationContext(flex.messaging.FlexContext
- .getServletConfig().getServletContext());
- try {
- return appContext.getBean(beanName);
- } catch (NoSuchBeanDefinitionException nexc) {
- ServiceException e = new ServiceException();
- String msg = "Spring service named '" + beanName
- + "' does not exist.";
- e.setMessage(msg);
- e.setRootCause(nexc);
- e.setDetails(msg);
- e.setCode("Server.Processing");
- throw e;
- } catch (BeansException bexc) {
- ServiceException e = new ServiceException();
- String msg = "Unable to create Spring service named '"
- + beanName + "' ";
- e.setMessage(msg);
- e.setRootCause(bexc);
- e.setDetails(msg);
- e.setCode("Server.Processing");
- throw e;
- }
- }else{
- ServiceException e = new ServiceException();
- String msg = "你沒有足夠的權限調用'"
- + beanName + "' ";
- e.setMessage(msg);
- e.setRootCause(null);
- e.setDetails(msg);
- e.setCode("Server.Processing");
- throw e;
- }
- }
- }
- }
代碼不是很難,稍微看下我想應該沒有問題。這就是我的構思,如果真的要應用還有許多細節要考慮,至少一個大致的框架完成了。
【編輯推薦】