>Java >java지도 시간 >Java의 Spring AOP는 사용자 권한 확인을 구현합니다.

Java의 Spring AOP는 사용자 권한 확인을 구현합니다.

高洛峰
高洛峰원래의
2017-02-03 13:19:221766검색

모든 프로젝트에는 권한 관리 시스템이 있습니다

단순한 기업 웹사이트이든 매우 복잡한 플랫폼 수준 프로젝트이든 사용자 로그인 및 권한 관리 로직의 필수 비즈니스가 포함됩니다. 어떤 사람들은 기업 웹사이트에서 어떤 권한을 관리해야 합니까? 좋습니다. 귀하의 페이지는 정적 페이지라고 할 수 있습니다. 그렇더라도 백그라운드 관리 및 로그인 기능은 분명히 있을 것입니다.

모든 프로젝트는 거의 동일한 비즈니스 로직을 가지게 되는데, 이를 보편적인 시스템으로 만들 수 있을까요?

AOP는 사용자 권한 검증을 구현합니다

실제 프로젝트에서 AOP가 사용하는 시나리오에는 주로 권한 관리(Authority Management), 트랜잭션 관리(Transaction Management), 보안 관리(Security), 로그 관리가 포함됩니다. ( 로깅) 및 디버깅 관리(Debugging) 등

따라서 AOP를 사용하여 권한 확인을 직접 구현할 수 있습니다. 프로젝트에서 권한을 관리하는 방법과 관리 세분성 수준은 전적으로 프로젝트 요구 사항에 따라 다르므로 여기서는 전혀 논의하지 않습니다.

먼저 아이디어에 대해 이야기해 보겠습니다. 필요할 때 사용자 정의 주석과 인터셉터를 사용하여 일부 권한 인증을 수행합니다. 여기에 여전히 포함된 것은 enum(열거), 주석(사용자 정의 주석) 및 인터셉터 관련 지식입니다. 더 이상 고민하지 말고 바로 코드 작성을 시작하겠습니다.

코드 놀이 시작

** 1. AuthorityType.java 열거형 클래스를 생성합니다

public enum AuthorityType {
 
  // 登录和权限都验证 默认
  Validate,
 
  // 不验证
  NoValidate,
 
  // 不验证权限
  NoAuthority;
}

이 열거형 클래스의 역할은 여전히 ​​사용자 정의 주석을 재미있게 사용하도록 만드는 것입니다. 아직도 그것을 원해요.

2. 새로운 Authority.java 사용자 정의 주석 클래스를 생성합니다

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
 
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
@Documented
public @interface Authority {
  // 默认验证
  AuthorityType value() default AuthorityType.Validate;
 
}

3. 또 다른 AuthorityAnnotationInterceptor.java 클래스를 생성합니다

/**
 * 权限认证拦截器
 *
 */
public class AuthorityAnnotationInterceptor extends HandlerInterceptorAdapter {
  @Override
  public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
    throws Exception {
 
  if (handler instanceof HandlerMethod) {
    HandlerMethod hm = (HandlerMethod) handler;
 
    Class<?> clazz = hm.getBeanType();
    Method m = hm.getMethod();
    try {
      if (clazz != null && m != null) {
        boolean isClzAnnotation = clazz.isAnnotationPresent(Authority.class);
        boolean isMethondAnnotation = m.isAnnotationPresent(Authority.class);
        Authority authority = null;
        // 如果方法和类声明中同时存在这个注解,那么方法中的会覆盖类中的设定。
        if (isMethondAnnotation) {
          authority = m.getAnnotation(Authority.class);
        } else if (isClzAnnotation) {
          authority = clazz.getAnnotation(Authority.class);
        }
        int code = -1;
        String msg = "";
        if (authority != null) {
          if (AuthorityType.NoValidate == authority.value()) {
            // 标记为不验证,放行
            return true;
          } else if (AuthorityType.NoAuthority == authority.value()) {
            // 不验证权限,验证是否登录
            // TODO:
            return true;
          } else {
            // 验证登录及权限
            // TODO:
 
            code = 1;
            msg = "验证成功!";
            return true;
          }
        }
 
        // //跳转
        // String url = "";
        // response.getWriter().write("<script>top.location.href=&#39;"
        // + url + "&#39;</script>");
        // return false;
 
        // 未通过验证,返回提示json
        Map<String, Object> responseMap = new HashMap<String, Object>();
        responseMap.put("code", code);
        responseMap.put("msg", msg);
        responseMap.put("params", "");
        responseMap.put("rows", "");
        String json = new Gson().toJson(responseMap);
        response.setCharacterEncoding("UTF-8");
        response.setContentType("application/json; charset=utf-8");
        response.getWriter().write(json);
        return false;
      }
    } catch (Exception e) {
    }
  }
  return false;
  } 
}

이 클래스의 목적은 Authority 태그가 표시된 메소드 및 클래스에 대한 권한 인증을 수행하는 것입니다. 저희 업무상 필요에 맞게 전체 인증, 로그인 인증만, 인증 없음 3가지로 나누어 보았습니다.

여기서 반환 값은 JSON 문자열일 수도 있고, 원하는 효과를 얻기 위해 해당 페이지로 이동할 수도 있습니다.

4. 인터셉터 구성

<mvc:interceptors>
  <!-- 权限认证拦截器 -->
  <mvc:interceptor>
    <mvc:mapping path="/**"/>
    <bean class="cn.mayongfa.interceptor.AuthorityAnnotationInterceptor"></bean>
  </mvc:interceptor>
</mvc:interceptors>

/WebContent/WEB-INF/springMVC-servlet.xml 파일 아래에 ad6669fcacaee0dbae1311edd5eb66da 노드를 구성하면 됩니다. 여기서 가로챌 특정 URL을 구성할 수 있습니다.

이렇게 하면 권한 확인 작업이 완료됩니다. 어떻게 사용하나요?

사용이 매우 간단합니다

인터셉터 구성으로 인해 사용자 정의 주석의 기본값은 확인이므로 클래스 이름과 메소드 이름만 라벨링하면 됩니다.

Java之Spring AOP 实现用户权限验证

물론 인터셉터에서 기본값을 설정하여 모든 요청을 확인한 다음 요청을 확인하지 않도록 설정할 수도 있습니다.

위 내용은 이 글의 전체 내용입니다. 모든 분들의 학습에 도움이 되기를 바랍니다.

사용자 권한 확인을 구현하는 Java의 Spring AOP와 관련된 더 많은 기사를 보려면 PHP 중국어 웹사이트를 주목하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.