关闭

Spring Aop +自定义注解实现用户权限控制

标签: springaop
80人阅读 评论(0) 收藏 举报
分类:

项目结构:
这里写图片描述

pom.xml:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>com</groupId>
  <artifactId>SpringAop</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>jar</packaging>

  <name>SpringAop</name>
  <url>http://maven.apache.org</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.10</version>
      <scope>test</scope>
    </dependency>

     <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context</artifactId>
      <version>4.0.2.RELEASE</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-test</artifactId>
      <version>4.0.2.RELEASE</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.springframework/spring-aop -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-aop</artifactId>
    <version>4.0.2.RELEASE</version>
</dependency>

    <dependency> 
    <groupId>org.aspectj</groupId> 
    <artifactId>aspectjweaver</artifactId> 
    <version>1.6.12</version> 
</dependency> 

<dependency>
    <groupId>cglib</groupId>
    <artifactId>cglib</artifactId>
    <version>2.2.2</version>
</dependency>
  </dependencies>

  <build>
   <plugins>
          <plugin>
             <groupId>org.apache.maven.plugins</groupId>
             <artifactId>maven-compiler-plugin</artifactId>
           <version>3.1</version>
           <configuration>
              <target>1.8</target>
           <source>1.8</source>
           </configuration>
          </plugin>
          </plugins>
          </build>
</project>

自定义注解:

package com.Quanxian;
import java.lang.annotation.*;

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface PrivilegeInfo {


    String value() default "";

}

注解解析器:

package com.Quanxian;

import java.lang.reflect.Method;
/**
 * 注解处理器
 * @author P1311529
 * 这个解析器的主要功能,是解析目标方法上如果有PrivilegeInfo注解,那么解析出这个注解中的value值(权限的值)
 *
 */
public class PrivilegeAnnotationParse {
     public static String parse(Class c1 ,String c1methodName)throws Exception{
         String methodAccess ="";

         Method method =c1.getMethod(c1methodName);
         if(method.isAnnotationPresent(PrivilegeInfo.class)){
             PrivilegeInfo privilegeInfo=method.getAnnotation(PrivilegeInfo.class);
             methodAccess =privilegeInfo.value();
            // System.err.println(methodAccess);
         }
         return methodAccess;
     }
}

获取用户权限名:

package com.Quanxian;

public class FirmPrivilege {

     /**
     * 用户权限的名称
     */
    private String value;

    public String getValue() {
        return value;
    }

    public void setValue(String value) {
        this.value = value;
    }

    public FirmPrivilege(String value) {
        this.value = value;
    }

    public FirmPrivilege() {
    }
}

service 以及实现类:

package com.Quanxian.service;

public interface FirmService {


        /**
         * 在需要权限的目标方法上,使用PrivilegeInfo注解,配置权限为save
         */
        public void save();
        /**
         * 在需要权限的目标方法上,使用PrivilegeInfo注解,配置权限为update
         */
        public void update();
        /**
         * 不需要权限的目标方法上,则不添加PrivilegeInfo注解
         * 在切面中,默认用户拥有权限
         */
        public void get();

}
package com.Quanxian.serviceImpl;

import com.Quanxian.PrivilegeInfo;
import com.Quanxian.service.FirmService;

public class FirmServiceImpl implements FirmService{
     /**
     * 在需要权限的目标方法上,使用PrivilegeInfo注解,配置权限
     */
    @Override
    @PrivilegeInfo("save")
    public void save() {
        System.out.println("FirmServiceImpl.save()");

    }

    /**
     * 在需要权限的目标方法上,使用PrivilegeInfo注解,配置权限
     */
    @Override
    @PrivilegeInfo("update")
    public void update() {
        System.out.println("FirmServiceImpl.update()");

    }

    /**
     * 不需要权限的目标方法上,则不添加PrivilegeInfo注解
     * 在切面中,默认用户拥有权限
     */
    @Override
    public void get() {
        System.out.println("FirmServiceImpl.get()");

    }
}

切面类:

package com.Quanxian;

import java.util.List;

import org.aspectj.lang.ProceedingJoinPoint;

public class PrivilegeAspect {
  private List<FirmPrivilege> privileges;

public List<FirmPrivilege> getPrivileges() {
    return privileges;
}

public void setPrivileges(List<FirmPrivilege> privileges) {
    this.privileges = privileges;
}

/**
 * aop中的环绕通知
 * 在这个方法中检查用户的权限和目标方法的需要的权限是否匹配
 * 如果匹配则调用目标方法,不匹配则不调用
 * @param joinPoint 连接点
 * @throws Throwable
 */
  public void isAccessMethod(ProceedingJoinPoint joinPoint)throws Throwable{

      /**
       * 1.获取访问目标方法应该具备的权限
       *  为解析目标方法的PrivilegeInfo注解,根据我们定义的解析器,需要得到:目标类的class形式 方法的名称
       */
      Class targetClass =joinPoint.getTarget().getClass();
      String methodName=joinPoint.getSignature().getName();
      System.out.println(targetClass+ "  " +methodName);
    //得到该方法的访问权限
      String methodAccess =PrivilegeAnnotationParse.parse(targetClass, methodName);
      boolean isAccessed =false;
      /*
       * 2.遍历用户的权限,看是否拥有目标方法对应的权限
       */
        System.out.println("privileges :"+privileges);
      for(FirmPrivilege firmPrivilege :privileges){

          /*
           * 如果目标方法没有使用PrivilegeInfo注解,则解析出来的权限字符串就为空字符串
           * 则默认用户拥有这个权限
           */
          if("".equals(methodAccess)){
              isAccessed =true;
              break;
          }
          /*
           * 用户原有权限列表中有的权限与目标方法上PrivilegeInfo注解配置的权限进行匹配
           */
          if(firmPrivilege.getValue() !=null && 
                  firmPrivilege.getValue().equalsIgnoreCase(methodAccess)){
             // System.out.println("not null ------------");
              isAccessed =true;
              break;
          }
          /*
             * 3.如果用户拥有权限,则调用目标方法 ,如果没有,则不调用目标方法,只给出提示
             */
      }
          if(isAccessed){
              joinPoint.proceed();//调用目标方法
            //  System.out.println("调用目标方法");
          }else{
              System.out.println("你没有权限");
          }

  }

}

xml文件配置切面:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:aop="http://www.springframework.org/schema/aop"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xmlns:jee="http://www.springframework.org/schema/jee"
    xmlns:jdbc="http://www.springframework.org/schema/jdbc"
    xmlns:jpa="http://www.springframework.org/schema/data/jpa"
    xmlns:batch="http://www.springframework.org/schema/batch"
    xmlns:mvc="http://www.springframework.org/schema/mvc"
    xsi:schemaLocation="http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-4.0.xsd
        http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-4.0.xsd
        http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
        http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd
        http://www.springframework.org/schema/data/jpa http://www.springframework.org/schema/data/jpa/spring-jpa.xsd
        http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
        http://www.springframework.org/schema/batch http://www.springframework.org/schema/batch/spring-batch.xsd
        http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-4.1.7.xsd">

           <aop:aspect id="QuanxianAspect" ref="privilegeAspect">
              <aop:pointcut id="perform" expression="execution(* com.Quanxian.serviceImpl.FirmServiceImpl.*(..))"/>
               <aop:around method="isAccessMethod" pointcut-ref="perform"/>
           </aop:aspect>
        </aop:config>
        <bean id="firmService" class="com.Quanxian.serviceImpl.FirmServiceImpl"/>
        <bean id="privilegeAspect" class="com.Quanxian.PrivilegeAspect"/>

        </beans>

Tets:

package com.Quanxain;

import java.util.ArrayList;
import java.util.List;

import org.junit.Before;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.Quanxian.FirmPrivilege;
import com.Quanxian.PrivilegeAspect;
import com.Quanxian.service.FirmService;

public class TestQuanxian {

    private FirmService firmService;
    @Before
    public void beFore1(){
        ApplicationContext ac=new ClassPathXmlApplicationContext("springaop.xml");
         firmService = (FirmService)ac.getBean("firmService");
        PrivilegeAspect privilegeAspect=(PrivilegeAspect) ac.getBean("privilegeAspect");

        List<FirmPrivilege> privileges=new ArrayList<FirmPrivilege>();
        privileges.add(new FirmPrivilege("update"));
        privilegeAspect.setPrivileges(privileges);
    }

    @Test
    public void Test1(){
        firmService.save();
        firmService.update();
        firmService.get();
    }


}

result:

Oct 10, 2017 9:28:58 AM org.springframework.context.support.ClassPathXmlApplicationContext prepareRefresh
INFO: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@6996db8: startup date [Tue Oct 10 09:28:58 CST 2017]; root of context hierarchy
Oct 10, 2017 9:28:58 AM org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
INFO: Loading XML bean definitions from class path resource [springaop.xml]
class com.Quanxian.serviceImpl.FirmServiceImpl  save
privileges :[com.Quanxian.FirmPrivilege@4b5a5ed1]
你没有权限
class com.Quanxian.serviceImpl.FirmServiceImpl  update
privileges :[com.Quanxian.FirmPrivilege@4b5a5ed1]
FirmServiceImpl.update()
class com.Quanxian.serviceImpl.FirmServiceImpl  get
privileges :[com.Quanxian.FirmPrivilege@4b5a5ed1]
FirmServiceImpl.get()

privileges :[com.Quanxian.FirmPrivilege@4b5a5ed1] 其实就是你给用户加的update权限 为什么要用List 因为可能需要给用户加多个权限

参考博客:http://blog.csdn.net/minhellic/article/details/51919690

0
0
查看评论

spring AOP + 自定义注解实现权限控制小例子

今天看了一下黑马程序员的视频,上面讲到一个使用spring AOP + 自定义注解的方式来实现权限控制的一个小例子,个人觉得还是可以借鉴,整理出来与大家分享。需求:service层有一些方法,这些方法需要不同的权限才能访问。实现方案:自定义一个PrivilegeInfo的注解,使用这个注解为serv...
  • Minhellic
  • Minhellic
  • 2016-07-15 17:29
  • 9184

Spring AOP自定义注解实现权限控制

在学习Java Spring框架中,学习到AOP的过程中,有一个很难理解的问题就是:自定义注解,然后解析注解实现权限控制。           权限控制:因为在一些项目中,service层的一些方法需要不同...
  • xzp_12345
  • xzp_12345
  • 2017-09-19 18:54
  • 356

springAOP进行自定义注解,用于方法的处理

本文采用的spring boot进行配置 maven 引入                             org.springframework.bo...
  • u011191463
  • u011191463
  • 2017-08-31 15:50
  • 373

使用自定义注解+Spring AOP 实现日志记录

使用自定义注解+Spring切面 实现日志记录在平常的项目编程中,我们会经常使用到日志,用来记录各种事件.但是,有些日志记录套路实在是太像了,我们不得不要写很多遍.比如在Spring中,我们要使用日志记录每个controller的访问和结束时间,该怎么办呢.下面是我认为比较简单的一种方法: 自定义...
  • itguangit
  • itguangit
  • 2017-12-09 11:01
  • 218

Spring AOP 自定义注解的实现

原文: http://www.cnblogs.com/shipengzhi/articles/2716004.html 二、Spring AOP 自定义注解的实现 在Maven中加入以下以依赖: Spring AOP + AspectJ by shipengzhi --&...
  • liuzhen917
  • liuzhen917
  • 2016-02-02 10:27
  • 2968

自定义注解和aop结合使用---自定义日志记录的实现

关于aop和自定义注解的知识点本文不做过多阐述,相关资料可去网上查看这篇文章就讲解的很详细http://www.cnblogs.com/shipengzhi/articles/2716004.html这里主要写的是个人在学习aop和自定义注解时做的一个小demo,主要实现自定义日志记录的功能。1、在...
  • poisions
  • poisions
  • 2016-03-14 17:33
  • 1487

springAOP与自定义注解实现细粒度权限控制管理

IOC与AOP无疑是spring的核心,提供了非常强大的功能,这两个思想为我们开发带来了巨大的方便。 这里我们aop简单实现一些权限控制,用到的aop提供的环绕通知,至于spring提供了那些通知,大家可以自行百度。 <!-- ...
  • s8460049
  • s8460049
  • 2016-08-11 14:46
  • 4289

Spring AOP自定义注解 身份验证

最近碰到APP开发权限验证的问题 用过滤器不能解决某些无需验证的方法 所以最终选择用AOP 解决 代码如下定义一个权限注解 package com.thinkgem.jeesite.common.annotation; import java.lang.annotation.ElementType...
  • ZaiYiNiDeZaiYi
  • ZaiYiNiDeZaiYi
  • 2016-12-28 09:24
  • 2060

基于Spring的AOP实现自定义annotation操作日志

引入项目需要的AOP包 <!--aop--> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aop</ar...
  • qq_24486393
  • qq_24486393
  • 2016-08-13 21:54
  • 2329

Spring AOP+自定义注解实现缓存

Spring AOP+自定义注解实现缓存
  • thjnemo
  • thjnemo
  • 2015-04-07 14:00
  • 2784
    个人资料
    • 访问:28637次
    • 积分:1306
    • 等级:
    • 排名:千里之外
    • 原创:80篇
    • 转载:41篇
    • 译文:13篇
    • 评论:0条
    最新评论