簡單實現一個登陸驗證的註解來保護私有資源

背景

自定義註解標註受保護的資源訪問,當要訪問的url被標註了@LoginRequied的時候就變成了一個受保護的資源,須要用戶登陸或者更進一步須要用戶擁有某個權限才能操做。本項目使用的springboot2.0
話很少說直接上代碼。spring

實現過程

註解類:LoginRequiredspringboot

//省略import
/**
* 攔截聲明
*/

@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface LoginRequired {

boolean value() default true;
}

如今有了咱們想要使用的註解 下一步就是怎麼去實現它,由於要對http請求進行攔截因此咱們在這能夠直接設置一個攔截器攔截全部的請求,當看到被攔截的請求有@LoginRequired註解的時候,咱們再去判斷是否符合條件。
下面咱們來實現這個攔截器。ide

//省略import
/**
 * 自定義的一個登陸攔截器
 */
public class LoginInterceptor extends HandlerInterceptorAdapter {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        if (handler instanceof HandlerMethod) {
            LoginRequired loginRequired = findAnnotation((HandlerMethod) handler, LoginRequired.class);
//沒有聲明須要權限,或者聲明不驗證權限
            if (loginRequired == null) {
                return true;
            } else {
                String token = request.getHeader(「token」);//獲得token
                if (StringUtils.isEmpty(token)) {
                    token = request.getParameter(「token」);
                }
//在這裏實現本身的權限驗證邏輯
                if (!StringUtils.isEmpty(token)) {//若是驗證成功返回true(這裏直接寫false來模擬驗證失敗的處理)
                    return true;
                } else {//若是驗證失敗

                    response.getWriter().write(new Result(HttpStatusConstant.REQUIRED_LOGIN).toJSONString());
                    return false;
                }
            }
        } else {
            return true;
        }
    }

    private T findAnnotation(HandlerMethod handler, Class annotationType) {
        T annotation = handler.getBeanType().getAnnotation(annotationType);
        if (annotation != null) return annotation;
        return handler.getMethodAnnotation(annotationType);
    }
}

preHandle函數表示在以前處理,用到這裏就是在訪問發生以前觸發,咱們利用反射找到LoginRequired 而後進行處理。這樣全部準備工做就作完了。可是咱們想要在spring中使用它還須要告訴spring我寫了一個攔截器。函數

因此咱們再新建一個InterceptorConfig類:ui

//ignore import
@Configuration
public class InterceptorConfig extends WebMvcConfigurerAdapter {
@Bean
public LoginInterceptor loginInterceptor(){
    return new LoginInterceptor();
}
/**
* 註冊當前的interceptor
* @param registry
*/
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(loginInterceptor());
}
}

大功告成。剩下的就是在你Controller中須要登陸驗證的請求的方法上面添加@LoginRequired註解了。url

相關文章
相關標籤/搜索