`

基于spring aop 权限管理系统原型

阅读更多

 

此权限管理系统把待访问的业务层方法做为权限管理中的资源,通过spring aop 对接口方法进行拦截,来实现权限的管理,可以实现细粒度的权限控制。
在上文体验了spring aop 一些特性,aop 接口:MethodBeforeAdvice, AfterReturningAdvice, ThrowsAdvice 实现这三个接口分别对方法执行前,后,执行中抛异常等情况进行的,我们要是想做overload 这样的操作时,要用MethodInterceptor 接口,此接口好在有返回值,
public Object invoke(
      MethodInvocation invocation) 
      throws Throwable
   {
//.
}
上文做法有些牵强业务逻辑还有throws PermissionDeniedException 感觉不爽,现在用MethodInterceptor 接口,来写这个demo,把权限与业务分开。
advice 如下:

public class PermissionCheckAroundAdvice implements MethodInterceptor {
    SecurityManager securityMgr = new SecurityManager();
    
    /**//**
     * @param securityMgr The securityMgr to set.
     */
    public void setSecurityMgr(SecurityManager securityMgr) {
        this.securityMgr = securityMgr;
    }
    public Object invoke(MethodInvocation invocation) throws Throwable {
        System.out.println("(被调用方法接口类名: "
                + invocation.getMethod().getDeclaringClass().getName() + ")");
        System.out.println("(被调用方法名:" + invocation.getMethod().getName()+ ")");
        String methodName = invocation.getMethod().getDeclaringClass()
                .getName() + "." + invocation.getMethod().getName();
        System.out.println("(被调用方法全名:" + methodName + ")");
        System.out.println("有否权限:(" + securityMgr.checkPermission(methodName)+ ")");
        if(securityMgr.checkPermission(methodName))
            return invocation.proceed();
         System.out.println("Goodbye! NO Permission!(by " + this.getClass().getName() + ")");
        return "--";
    }
}
服务层业务接口修改如下:

public interface Service {
    public String getBeanInfo();
}
服务层业务实现类如下:

public class ServiceBean implements Service {
    ResourceBean bean;
    /**//**
     * @param bean The bean to set.
     */
    public void setBean(ResourceBean bean) {
        this.bean = bean;
    }
    public String getBeanInfo(){
        String result="";
        
        result+= bean.getMethod1();
        result+= bean.getMethod2();
        result+= bean.getMethod3();
        return result;
    }
}
资源层,接口 ,类如下:

public interface Resource {
}

public interface ResourceBean extends Resource{
    public void theMethod();
    public String getMethod1();
    public String getMethod2();
    public String getMethod3();
}

public class ResourceBeanImpl implements ResourceBean,InitializingBean{
    public void theMethod(){
        System.out.println(this.getClass().getName()
                + "." + new Exception().getStackTrace()[0].getMethodName()
                + "()"
                + " says HELLO!");
    }
    public String getMethod1(){
        return "张三";
    }
    public String getMethod2(){
        return "李四";
    }
    public String getMethod3(){
        return "王五";
    }
    public void afterPropertiesSet() throws Exception {
        System.out.println("事件监听:类ResourceBeanImpl属性设置完毕");
        
    }
}
权限管理类:

public class User {
    List privilages = new java.util.ArrayList();
    String name;
    public User(){
    }
    
    /**//**
     * @param privilages The privilages to set.
     */
    public void setPrivilages(List privilages) {
        this.privilages = privilages;
    }
    public String getName(){
        return name;
    }
    public void setName(String name){
        this.name=name;
    }
    public boolean isPermission(String pri){
        java.util.Iterator it = privilages.iterator();
        String p = "";
        boolean pass=false;
        while(it.hasNext()){
            
            p=(String)it.next();
            System.out.println(p);
            if(p.equals(pri)){
                pass = true;
                break;
            }
        }
        return pass;
    }
}

public class SecurityManager {
    User user;
    public void setUser(User user){
        this.user = user;
    }
    public boolean checkPermission(String privilege){
        return checkPermission(user,privilege);
    }
    public boolean checkPermission(User user, String privilege){
        return user.isPermission(privilege);
    }
}

配置文件:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC  "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
  <!--CONFIG-->
  <bean id="bean" class="org.springframework.aop.framework.ProxyFactoryBean">
    <property name="proxyInterfaces">
      <value>com.jhalo.jsecurity.aop.ResourceBean</value>
    </property>
    <property name="target">
      <ref local="beanTarget"/>
    </property>
    <property name="interceptorNames">
      <list>
        <value>permissionAroundAdvisor</value>
      </list>
    </property>
  </bean>
  <bean id="service" class="org.springframework.aop.framework.ProxyFactoryBean">
    <property name="proxyInterfaces">
      <value>com.jhalo.jsecurity.aop.Service</value>
    </property>
    <property name="target">
      <ref local="serviceBean"/>
    </property>
    <property name="interceptorNames">
      <list>
        <value>permissionAroundAdvisor</value>
      </list>
    </property>
  </bean>
  <!--CLASS-->
  <bean id="resourceMgr" class="com.jhalo.jsecurity.aop.ResourceManager"/>
  <bean id="beanTarget" class="com.jhalo.jsecurity.aop.ResourceBeanImpl"/>
  <bean id="beanTarget2" class="com.jhalo.jsecurity.aop.ResourceBean2Impl"/>
  <bean id="user" class="com.jhalo.jsecurity.aop.User">
      <property name="name">
          <value>tester</value>
      </property>
      <property name="privilages">
        <list>
            <value>com.jhalo.jsecurity.aop.ResourceBean.getMethod3</value>
            <value>com.jhalo.jsecurity.aop.Service.getBeanInfo</value>
            <value>com.jhalo.jsecurity.aop.ResourceBean.getMethod1</value>
        </list>
    </property>
  </bean>
  <bean id="securityMgr" class="com.jhalo.jsecurity.aop.SecurityManager">
      <property name="user">
        <ref local="user"/>
      </property>
  </bean>
  
  <bean id="serviceBean" class="com.jhalo.jsecurity.aop.ServiceBean">
      <property name="bean">
        <!-- <ref local="beanTarget"/>-->
        <ref local="bean"/>
      </property>
  </bean>
  
  
  <!--ADVISOR-->
  <!--Note: An advisor assembles pointcut and advice-->
  <!--  -->
  <!-- permission around advisor -->
  <bean id="permissionAroundAdvisor" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">
        <property name="advice">
            <ref local="thePermissionAroundAdvice"/>
        </property>
        <property name="pattern">
            <value>.*</value>
        </property>
  </bean>
  <!--ADVICE-->
  <bean id="thePermissionCheckBeforeAdvice" class="com.jhalo.jsecurity.aop.PermissionCheckAdvice"/>
  <bean id="thePermissionThrowsAdvice" class="com.jhalo.jsecurity.aop.PermissionThrowsAdvice"/>
  <bean id="thePermissionAroundAdvice" class="com.jhalo.jsecurity.aop.PermissionCheckAroundAdvice">
      <property name="securityMgr">
        <ref local="securityMgr"/>
    </property>
  </bean>
</beans>
User 所拥有的权限是在spring 配置文件中手工配置的,在实际应用中不可行,可以从DB中取得。
测试类:

public class SpringAopTest {
    public static void main(String[] args) {
        //Read the configuration file
        ApplicationContext ctx
            = new FileSystemXmlApplicationContext("springconfig.xml");
String name = "";
Service sb = (Service)ctx.getBean("service");
//        System.out.println("---"+ctx.isSingleton("service")+"---");
        name = sb.getBeanInfo();
        System.out.println("test result::" +name);
      }
}

 

分享到:
评论

相关推荐

    基于spring_aop_权限管理系统原型

    基于spring_aop_权限管理系统原型

    基于spring mybatis和easyui开发的权限管理demo

    【标题】"基于Spring MyBatis和EasyUI的权限管理Demo"揭示了这是一个采用主流Java技术栈构建的权限管理系统原型。这个项目的核心是利用Spring框架的IoC(Inversion of Control)和AOP(Aspect Oriented Programming...

    基于SSM的员工管理系统

    6. **原型设计**:压缩包中的"员工管理系统原型设计"可能是系统的初步设计稿,包括界面布局、功能模块的划分以及交互流程的草图,是系统开发的起点,有助于开发者理解系统的整体架构和具体需求。 7. **可扩展性与可...

    java web基于SSH的小区物业管理系统

    【Java SSH 小区物业管理系统】是一个基于Java Web技术栈,采用Spring、Struts2和Hibernate(SSH)框架构建的应用程序。这个系统设计用于优化和自动化物业管理中的各种业务流程,如业主信息管理、缴费记录、报修服务...

    基于SpringMVC + Spring + Mybatis + Shiro + Bootstrap教务查询系统

    **基于SpringMVC + Spring + Mybatis + Shiro + Bootstrap 教务查询系统** 这是一个集成了多种技术的教务查询系统,旨在提供高效、安全且用户友好的界面,供教师和学生进行教学信息的查询与管理。下面将详细介绍每...

    权限控制系统

    本项目基于经典的SSH(Struts2、Spring、Hibernate)框架进行设计,结合HibernateDaoSupport模板和HibernateTemplate,旨在实现一套强大的、灵活的权限管理解决方案。 首先,Struts2作为MVC(模型-视图-控制器)...

    spring+mybatis+shiro的基本权限管理后台Demo

    【标题】"spring+mybatis+shiro的基本权限管理后台Demo"揭示了这是一个采用Java Web技术栈实现的权限管理系统原型,主要涉及Spring框架、MyBatis持久层框架以及Apache Shiro安全框架。这个Demo旨在展示如何整合这三...

    租房系统(springmvc+spring)

    4. 安全性:使用Spring Security或类似的工具进行权限管理和认证,保护用户数据安全。 5. 搜索和过滤:提供搜索框和筛选条件,帮助用户快速找到符合需求的房源。 【标签】"租房"表明这个项目专注于租房业务,因此在...

    校内点餐系统(spring、springMVC、mybatis、shiro)

    《校内点餐系统——基于Spring、SpringMVC、Mybatis和Shiro的实现》 在信息化时代,校园生活中的方方面面都在逐步实现数字化,其中,校内点餐系统的出现极大地便利了师生们的用餐体验。本项目名为“校内点餐系统”...

    北大青鸟代理商管理系统(Spring+Struts2+myBatis)

    【标题】"北大青鸟代理商管理系统(Spring+Struts2+myBatis)" 是一个基于Java技术的Web应用程序,采用主流的SSM(Spring、Struts2、MyBatis)框架进行开发。这个系统旨在实现对代理商的高效管理,提供全面的功能以...

    Spring 5.0.9 完整jar包

    通过XML配置或基于注解的方式,开发者可以声明bean及其依赖关系,Spring会自动创建并管理这些bean。此外,Spring还支持原型和单例两种bean的作用域,以及接口和实现类的自动装配。 2. **AOP(面向切面编程)**:...

    SpringProject-Spring框架代码

    Spring MVC 是 Spring 框架的一部分,用于构建基于模型-视图-控制器(Model-View-Controller, MVC)架构的 Web 应用。它提供了处理HTTP请求、数据绑定、验证、视图渲染等功能,使得Web应用的开发更加简洁高效。 **...

    基于java实现仿京东商城电商系统项目设计与实现源码

    依赖注入来管理各层,面向切面编程管理事务,日志和权限 MyBatis:持久层;访问数据库;基于jdbc的框架,主要用来操作数据库,并且将业务实体和数据表联系起来 1、Spring (1)基本概念 Spring是一个开源开发框架...

    基于WEB的网上选课系统

    - **原型设计**:基于需求分析的结果,设计出初步的系统原型,用于验证设计方案的可行性和用户界面的友好性。 - **系统设计**:在完成原型设计之后,进行系统的整体设计,包括各个模块的设计、数据库设计等。 - **...

    基于java实现仿京东商城电商系统项目设计与实现源码分享

    依赖注入来管理各层,面向切面编程管理事务,日志和权限 MyBatis:持久层;访问数据库;基于jdbc的框架,主要用来操作数据库,并且将业务实体和数据表联系起来 1、Spring (1)基本概念 Spring是一个开源开发框架...

    基于Java员工工作日志管理系统.zip

    《基于Java的员工工作日志管理系统详解》 在信息技术领域,开发一个员工工作日志管理系统是常见的需求,尤其是在企业管理中,对于员工的工作记录、任务跟踪以及绩效评估具有重要作用。本系统采用Java作为主要开发...

    Spring4.x++企业应用开发实战

    3. **Bean管理**:Spring容器负责创建、初始化、装配及管理Bean,包括单例、原型、请求、session等作用域的管理。 4. **数据访问**:Spring支持JDBC模板、Hibernate、MyBatis等多种ORM框架,简化数据库操作。Spring...

Global site tag (gtag.js) - Google Analytics