Shiro禁用Session,使用SSM+JWT+Shiro进行无状态RESTful API

本文源码:github

上一篇Shiro的demo:SpringMVC框架下使用shiro权限管理

最近一直在研究Shiro,因为项目里面要使用Shiro进行权限控制。由于项目不只是在Web端运行,还会在移动端App使用,想要使用JWT方式进行无状态的RESTful API交互,也就是登录后生成token并返回给前端,前端每次请求时都在请求头里面添加token,后端验证有效性。所以Shiro自带的Session要禁用掉,同时要重新写JWT的过滤器。

至于shiro的介绍,搬来官网介绍:https://shiro.apache.org/introduction.html

如上介绍,由于使用JWT需要禁用session,所以该demo只是使用了认证Authentication和授权Authorization两大块。

一开始直接照着网上的例子做demo,一直出错。所以放弃shiro写了个拦截器用来拦截,只是没法细粒度的控制权限,如下:

package filter;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
import util.JwtUtil;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class ControllerInterception extends HandlerInterceptorAdapter {
    private Logger logger = LoggerFactory.getLogger(ControllerInterception.class);

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        String url = request.getServletPath();
        logger.info("url"+url);
        String token = request.getHeader("token");
        logger.info("开始验证token");
        if (JwtUtil.verifyToken(token)) {
            logger.info("验证token通过");
            String role = (String) JwtUtil.parseToken(token).get("role");
            logger.info("role"+role);
            if (url.indexOf(role) == 1){
                logger.info("匹配url通过");
                return true;
            }
        }
        logger.info("验证token失败");
        response.sendRedirect(request.getContextPath()+"/login");
        return false;

    }
}
<!--登录拦截器-->
<mvc:interceptors>
    <mvc:interceptor>
        <!--拦截器拦截的类型-->
        <mvc:mapping path="/**"/>
        <!--不拦截以下请求-->
        <mvc:exclude-mapping path="/login"/>
        <mvc:exclude-mapping path="/index"/>
        <bean id="controllerInterception" class="filter.ControllerInterception"/>
    </mvc:interceptor>
</mvc:interceptors>

但是不想放弃使用shiro,所以自己一直在研究到底禁用session后shiro如何将JWT传递并在哪里校验。最终整理出来后才发现是如此的简单。说一下,使用shiro+ssm+jwt的一些前期准备:

  • 禁用session
  • JWT实现工具,这个网上可以找到很多,这里就不贴代码了
  • 自定义realm,继承AuthorizingRealm,
  • 6
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 14
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值