标签:检查 范式 需求 事件驱动 语言 注解 补充 inter alt
控制层 -> 服务层 -> 持久层
模块划分
分离功能性需求和非功能性需求
下载地址:点击前往
该类主要用来设定用户和获取用户
package cn.test.demo.base_demo.security; /** * @author 王杨帅 * @create 2018-04-29 17:15 * @desc 模拟用户登录,该类可以设定用户和获取用户 **/ public class CurrentSetHolder { private final static ThreadLocal<String> holder = new ThreadLocal<>(); /** * 获取用户 * @return */ public static String get() { return holder.get() == null ? "unknown" : holder.get(); } /** * 设定用户 * @param user */ public static void set(String user) { holder.set(user); } }
该类主要用于判断当前用户是否是“admin”用户
package cn.test.demo.base_demo.service; import cn.test.demo.base_demo.security.CurrentSetHolder; import org.springframework.stereotype.Component; /** * @author 王杨帅 * @create 2018-04-29 17:19 * @desc 权限校验服务类 **/ @Component public class AuthService { /** * 权限检查,如果用户不是 “admin" 就会报错 */ public void checkAccess() { String user = CurrentSetHolder.get(); if (!"admin".equals(user)) { throw new RuntimeException("operation not allow."); } } }
该类主要实现对Product的一些操作
在调用ProductService的insert方法前对用户进行设定
下载地址:点击前往
package cn.test.demo.base_demo.entity; /** * @author 王杨帅 * @create 2018-04-29 17:11 * @desc 商品实体类 **/ public class Product { private Integer id; private String name; public Product() { } public Product(Integer id, String name) { this.id = id; this.name = name; } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public String toString() { return "Product{" + "id=" + id + ", name=‘" + name + ‘\‘‘ + ‘}‘; } }
package cn.test.demo.base_demo.security; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) public @interface AdminOnly { }
该类主要用来设置用户和获取用户
package cn.test.demo.base_demo.security; /** * @author 王杨帅 * @create 2018-04-29 17:15 * @desc 模拟用户登录,该类可以设定用户和获取用户 **/ public class CurrentSetHolder { private final static ThreadLocal<String> holder = new ThreadLocal<>(); /** * 获取用户 * @return */ public static String get() { return holder.get() == null ? "unknown" : holder.get(); } /** * 设定用户 * @param user */ public static void set(String user) { holder.set(user); } }
该类主要对所有使用了@AdminOnly注解的方法进行权限校验
package cn.test.demo.base_demo.security; import cn.test.demo.base_demo.service.AuthService; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; import org.aspectj.lang.annotation.Pointcut; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; /** * @author 王杨帅 * @create 2018-04-29 17:37 * @desc 权限检查的AOP类 **/ @Aspect @Component public class SecurityAspect { @Autowired AuthService authService; @Pointcut("@annotation(AdminOnly)") public void adminOnly(){ } @Before("adminOnly()") public void check(){ authService.checkAccess(); } }
该类的delete方法用了@AdminOnly注解,所以delete方法会进行权限校验
productService.delete(id) 方法中有权限验证,如果不是“admin"用户就会报错【利用AOP实现的】
SpringAOP01 利用AOP实现权限验证、利用权限验证服务实现权限验证
标签:检查 范式 需求 事件驱动 语言 注解 补充 inter alt
原文地址:https://www.cnblogs.com/zhangyu317/p/11183701.html