package com.civism.shiro;

import com.alibaba.fastjson.JSON;

import com.civism.dao.RedisClient;
import com.civism.error.ErrorType;
import com.civism.utils.SsoResponse;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.session.Session;
import org.apache.shiro.web.filter.authc.UserFilter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.annotation.Resource;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.Serializable;

/**
 * @author star
 * @date 2018/6/28 上午10:51
 */
public class ValidateUserFilter extends UserFilter {

    private static final Logger logger = LoggerFactory.getLogger(ValidateUserFilter.class);

    @Resource
    private RedisClient redisClient;


    @Override
    protected boolean isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue) {
        boolean existSession = SecurityUtils.getSubject().isAuthenticated();
        if (!existSession) {
            return false;
        } else {
            Session session = SecurityUtils.getSubject().getSession(false);
            if (session != null) {
                Serializable id = session.getId();
                if (id != null) {
                    if (redisClient.get((String) id) != null) {
                        return true;
                    }
                }
            }
            return false;
        }
    }

    @Override
    protected boolean onAccessDenied(ServletRequest request, ServletResponse resp) throws Exception {
        HttpServletResponse response = (HttpServletResponse) resp;
        PrintWriter out = null;
        try {
            out = response.getWriter();
            response.setCharacterEncoding("UTF-8");
            response.setHeader("Content-Type", "application/json;charset=utf-8");
            response.setContentType("application/json");
            out.write(JSON.toJSONString(new SsoResponse(ErrorType.TOKEN_INVALID)));
        } catch (IOException e) {
            logger.error("error onAccessDenied", e);
            return false;
        } finally {
            if (out != null) {
                out.close();
            }
        }
        return false;
    }
}