1. 定义一个注解
@Inherited
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD})
public @interface LoginInfo {
int[] role();
}
2. 先看在Cotroller层中注解的应用
@LoginInfo(role = {StatusConstants.CITY_ROLE})
比如定义了几个Role角色;
虽然用户表还是用权限表来返回一个权限的数组比较好;
然后 一般用2的次方来决定角色;2的0次方开始
也就是角色定义 用
public static final int ADMIN_ROLE= 1; public static final int PROVINCE_ROLE= 2; public static final int CITY_ROLE= 4;
大体上定义了三个角色;
3. 看切面的定义
QA: 如何获得切面的方法;
MethodSignature ms = (MethodSignature) point.getSignature();
Method method = ms.getMethod();
LoginInfo loginInfo = method.getAnnotation(LoginInfo.class);
@Aspect
@Component
@Slf4j
public class InfoAscept {
@Pointcut(value = "@annotation(com.situdata.situciticpru.common.annotion.LoginInfo)")
public void infoCut(){}
@Before("infoCut()")
public void before(JoinPoint point){
ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
MethodSignature ms = (MethodSignature) point.getSignature();
Method method = ms.getMethod();
LoginInfo loginInfo = method.getAnnotation(LoginInfo.class);
int[] roles = loginInfo.role(); //接口中定义的role列表
HttpServletRequest request = servletRequestAttributes.getRequest();
String authToken = request.getHeader("Token");
if(StringUtils.isBlank(authToken)){
throw new ResultException(RespCode.ERROR_2909, ""); //登录超时
}
Map<String,String> map = new HashMap<>();
if(StringUtils.equals("xx",authToken)){
validRole(new int[]{StatusConstants.ADMIN_ROLE}, roles);
map.put("name","系统管理员");
map.put("role",String.valueOf(StatusConstants.ADMIN_ROLE));
map.put("username",StatusConstants.ACCOUNT_ADMIN);
}else if(StringUtils.equals("xxx",authToken)){
validRole(new int[]{StatusConstants.PROVINCE_ROLE}, roles);
map.put("name","省管理员");
map.put("role",String.valueOf(StatusConstants.PROVINCE_ROLE));
map.put("username",StatusConstants.ACCOUNT_PROVINCE);
}else if(StringUtils.equals("xxxx",authToken)){
validRole(new int[]{StatusConstants.CITY_ROLE}, roles);
map.put("name","市管理员");
map.put("role",String.valueOf(StatusConstants.CITY_ROLE));
map.put("username",StatusConstants.ACCOUNT_CITY);
}else {
throw new ResultException(RespCode.ERROR_2909, "");
}
SituThreadLocal.setUserInfo(map);
}
private void validRole(int[] hasRoles, int[] roles) {
if(null == roles || roles.length == 0){
return;
}
boolean hasRole = false;
outterLoop: for (int m : hasRoles) {
for (int n : roles) {
if(m == n) {
hasRole = true;
break outterLoop;
}
}
}
if (!hasRole) throw new ResultException(RespCode.ERROR_2910, "");
}
}
这就是很简单的一个登录切面方法;
直接就根据token来判断角色,然后返回给前端不同的角色和名字;
4. 关于otterLoop跳出
可以直接跳出外层循环;
不推荐使用;