当前位置 : 主页 > 编程语言 > java >

自定义注解用于权限控制

来源:互联网 收集:自由互联 发布时间:2021-06-28
自定义注解用于权限控制.txt package com.wuliu.controller.tsj;import java.lang.annotation.ElementType;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;import java.lang.annotation.Target;/** * 自定义
自定义注解用于权限控制.txt
package com.wuliu.controller.tsj;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * 自定义注解(类似与spring security 的@PreAuthorize)用于权限控制
 * @author tsj : 2017年11月13日 上午11:59:36
 */
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Auth {

	String value() default "";
	String name() default "";
}

 

package com.wuliu.controller.tsj;

import java.io.PrintWriter;
import java.util.Set;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.http.HttpStatus;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
/**
 * 处理controller的@RequestMapping方法(这里的处理直接通过response处理,spring security先抛异常,然后再统一处理异常):
 * a.如果这个方法没有使用Auth注解,会认为没有作权限控制,任何人可以访问.
 * b.如果这个方法只标注了@Auth,如果用户没登录,会返回一个403,并提示用户登录.
 * c.如果这个方法标注了具体需要某种权限,如@Auth("authority"),就要求用户必须有这种权限,否则返回403,并提示用户没有权限,这里相当于实现授权,并且授权之前先认证
 * 
 * 验证权限
 * @author tsj : 2017年11月13日 上午11:07:39
 */
public class AuthInterceptor extends HandlerInterceptorAdapter {  
	
    public static final String SESSION_USERID = "kUSERID";  
    public static final String SESSION_AUTHS = "kAUTHS";  

	@Override
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
		boolean flag = true;
		if(handler instanceof HandlerMethod){
			Auth auth = ((HandlerMethod) handler).getMethod().getAnnotation(Auth.class);
			if(auth != null){
				// 说明方法有权限控制
				if(request.getSession().getAttribute(SESSION_USERID) == null){
					//没有登录
					response.setStatus(HttpStatus.FORBIDDEN.value());
					response.setContentType("text/html; charset=UTF-8");
					PrintWriter pw = response.getWriter();
					pw.write("{\"type\":\"nosignin\",\"msg\":\"请您先登录!!!\"}");
					pw.flush();
					pw.close();
					flag = false;
				}else{
					//用户已登陆
					//如果方法上仅仅是@Auth,表示登录就能访问
					if(!"".equals(auth.value())){
						//如果是@Auth("authority")这样有value值,就需要验证相应的权限
						
						Set
 
   auths = (Set
  
   ) request.getSession().getAttribute(SESSION_AUTHS); if(!auths.contains(auth.value())){ //没有权限 response.setStatus(HttpStatus.FORBIDDEN.value()); response.setContentType("text/html; charset=UTF-8"); PrintWriter pw = response.getWriter(); pw.write("{\"type\":\"nosignin\",\"msg\":\"对不起,您没有"+auth.name()+"权限!!!\"}"); pw.flush(); pw.close(); flag = false; } } } } } return flag; } }
  
 
网友评论