目录
首先自己做一个简单的增删改查。
角色权限控制
角色权限控制使用一个表,将角色信息(admin、manager、nomarl)存入用户信息表中;
或者
使用RABC权限模型,直接创建5个表(用户表、用户角色关联表、角色表、角色权限关联表、权限表),来进行编写代码;
1.创建权限校验的包以及类,目录结构如下
2.AuthCheck注解类代码
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface HasRole {
String[] value();
}
3.PermissionAOP类代码
import com.example.aop.core.annotation.HasRole;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import java.util.stream.Stream;
@Aspect
@Component
public class RoleAOP {
//使用环绕通知
@Around("@annotation(com.example.aop.core.annotation.HasRole)")
public Object around(ProceedingJoinPoint joinPoint) throws Throwable {
//拿到存在session中的角色信息
ServletRequestAttributes requestAttributes= (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
assert requestAttributes != null;
String role = (String) requestAttributes.getRequest().getSession().getAttribute("role");
//拿到方法注解中的值
HasRole annotation = ((MethodSignature) joinPoint.getSignature()).getMethod().getAnnotation(HasRole.class);//此处的参数是annotation包下的注解类
String[] value = annotation.value();
//进行比较,将注解中的角色信息和session中的角色信息比较
boolean flag = Stream.of(value).anyMatch(role::contains);//将注解中拿到的值写入流进行比较,anyMatch是只要匹配成功数组中的一个值,结果为true
//boolean flag = Stream.of(value).allMatch(role::contains);//session和注解中的要全部精准匹配成功
//可以打印输出流信息
//Stream.of(value).forEach(e -> System.out.println(e));
if (!flag){
//抛出一个异常,自定义异常类,异常为:权限不足
}
return joinPoint.proceed(joinPoint.getArgs());//此处要抛出一个异常,否则proceed会报错
}
}
4.最后在controller层方法上添加注解
@hasRole("admin)
操作权限控制
使用RABC权限模型,就需要创建5个表(用户表、用户角色关联表、角色表、角色权限关联表、权限表);
在登陆的时候,将权限信息和角色信息通过登录的用户信息从数据库中查询出角色和权限(List<Role>和List<Permission>类型数据),存入session中;
目录结构也如同角色权限控制一样;
创建HasPermission注解类,书写代码与步骤3类似;
创建PermissionAOP类,进行权限的判定和比较,书写代码与步骤4类似;
最后在controller层方法中添加注解
@HasPermission("user:add")
操作权限和角色权限结合精准控制权限
使用RABC权限模型,就需要创建5个表(用户表、用户角色关联表、角色表、角色权限关联表、权限表);
上述两者结合,目录结构如下,其中的HasPermission注解类和PermissionAOP切面不提供代码。书写方式同上角色权限代码。
然后在controller层的方法中添加两个注解。
@HasPermission("user:add")
@hasRole("admin)
注意:
然后在上述步骤4的PermissionAOP类代码中通过下面这句代码获取到存在session中的权限(List<String>类型);
List<String> permissions = (List<String>) requestAttributes
.getRequest()
.getSession()
.getAttribute("permissions");