自定义注解 java 权限控制_SpringMVC给控制器添加自定义注解控制访问权限详解

场景描述:现在需要对部分Controller或者Controller里面的服务方法进行权限拦截。如果存在我们自定义的注解,通过自定义注解提取所需的权限值,然后对比session中的权限判断当前用户是否具有对该控制器或控制器方法的访问权限。如果没有相关权限则终止控制器方法执行直接返回。有两种方式对这种情况进行处理。

方式一:使用SpringAOP中的环绕Around

方式二:使用Spring web拦截器

定义注解

@Retention(RetentionPolicy.RUNTIME)

@Target({ElementType.METHOD,ElementType.TYPE})

@Documented

//最高优先级

@Order(Ordered.HIGHEST_PRECEDENCE)

public @interface RoleControl {

/**

*

* 角色类型,以便决定是否具有相关权限

*/

String value() default "user";

}

在Controller中使用

@RoleControl("ADMIN")

@Controller

public class LoginController {

@Autowired

private UserService uService;

@Autowired

private GlobalConfigService gcService;

@RoleControl("")

@RequestMapping("/login")

public String login(HttpServletRequest request,HttpServletResponse resp, @ModelAttribute("user") UserDto uDto) {

return ""

}

方式一:使用SpringAOP中的环绕Around

@Component

@Aspect

public class RoleControlAspect {

/**类上注解情形 */

//@Pointcut("@within(net.xby1993.springmvc.annotation.RoleControl)")

@Pointcut("execution(* net.xby1993.springmvc.controller..*.*(..)) && @within(net.xby1993.springmvc.annotation.RoleControl)")

public void aspect(){

}

/**方法上注解情形 */

@Pointcut("execution(* net.xby1993.springmvc.controller..*.*(..)) && @annotation(net.xby1993.springmvc.annotation.RoleControl)")

public void aspect2(){

}

/**aop实际拦截两种情形*/

@Around("aspect() || aspect2()")

public Object doBefore(ProceedingJoinPoint point) {

HttpServletRequest request = ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getRequest();

HttpSession session=request.getSession();

Object target = point.getTarget();

String method = point.getSignature().getName();

Class> classz = target.getClass();

Method m = ((MethodSignature) point.getSignature()).getMethod();

try {

if (classz!=null && m != null ) {

boolean isClzAnnotation= classz.isAnnotationPresent(RoleControl.class);

boolean isMethondAnnotation=m.isAnnotationPresent(RoleControl.class);

RoleControl rc=null;

//如果方法和类声明中同时存在这个注解,那么方法中的会覆盖类中的设定。

if(isMethondAnnotation){

rc=m.getAnnotation(RoleControl.class);

}else if(isClzAnnotation){

rc=classz.getAnnotation(RoleControl.class);

}

String value=rc.value();

Object obj=session.getAttribute(GeneUtil.SESSION_USERTYPE_KEY);

String curUserType=obj==null?"":obj.toString();

//进行角色访问的权限控制,只有当前用户是需要的角色才予以访问。

boolean isEquals=StringUtils.checkEquals(value, curUserType);

if(isEquals){

try {

return point.proceed();

} catch (Throwable e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

}

}catch(Exception e){

}

return null;

}

}

方式二:使用拦截器,推荐

import java.lang.reflect.Method;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import javax.servlet.http.HttpSession;

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

import org.springframework.web.method.HandlerMethod;

import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;

import net.xby1993.springmvc.annotation.RoleControl;

import net.xby1993.springmvc.util.GeneUtil;

import net.xby1993.springmvc.util.PathUtil;

import net.xby1993.springmvc.util.StringUtils;

public class GlobalInterceptor extends HandlerInterceptorAdapter{

private static Logger log=LoggerFactory.getLogger(LoginInterceptor.class);

@Override

public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)

throws Exception {

HttpSession s=request.getSession();

s.setAttribute("host", PathUtil.getHost());

s.setAttribute("siteName", GeneUtil.SITE_NAME);

//角色权限控制访问

return roleControl(request,response,handler);

}

/**角色权限控制访问*/

private boolean roleControl(HttpServletRequest request,HttpServletResponse response, Object handler){

HttpSession session=request.getSession();

System.out.println(handler.getClass().getName());

if(handler instanceof HandlerMethod){

HandlerMethod hm=(HandlerMethod)handler;

Object target=hm.getBean();

Class> clazz=hm.getBeanType();

Method m=hm.getMethod();

try {

if (clazz!=null && m != null ) {

boolean isClzAnnotation= clazz.isAnnotationPresent(RoleControl.class);

boolean isMethondAnnotation=m.isAnnotationPresent(RoleControl.class);

RoleControl rc=null;

//如果方法和类声明中同时存在这个注解,那么方法中的会覆盖类中的设定。

if(isMethondAnnotation){

rc=m.getAnnotation(RoleControl.class);

}else if(isClzAnnotation){

rc=clazz.getAnnotation(RoleControl.class);

}

String value=rc.value();

Object obj=session.getAttribute(GeneUtil.SESSION_USERTYPE_KEY);

String curUserType=obj==null?"":obj.toString();

//进行角色访问的权限控制,只有当前用户是需要的角色才予以访问。

boolean isEquals=StringUtils.checkEquals(value, curUserType);

if(!isEquals){

//401未授权访问

response.setStatus(401);

return false;

}

}

}catch(Exception e){

}

}

return true;

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值