自定义注解用于权限控制.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;/** * 自定义
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; } }
