前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Spring Security + JWT实现前后端分离权限认证

Spring Security + JWT实现前后端分离权限认证

作者头像
二十三年蝉
发布2018-08-27 16:55:06
1.4K0
发布2018-08-27 16:55:06
举报
文章被收录于专栏:闻道于事闻道于事

现在国内前后端很多公司都在使用前后端分离的开发方式,虽然也有很多人并不赞同前后端分离,比如以下这篇博客就很有意思:

https://www.aliyun.com/jiaocheng/650661.html

我们从技术角度来看的话:

http://blog.jobbole.com/111624/

http://www.360doc.com/content/18/0511/06/36490684_752894279.shtml

摘要:

为什么选择前后端分离

  • 在以前传统的网站开发中,前端一般扮演的只是切图的工作,只是简单地将UI设计师提供的原型图实现成静态的HTML页面,而具体的页面交互逻辑,比如与后台的数据交互工作等,可能都是由后台的开发人员来实现的,或者是前端是紧紧的耦合后台。比如,以前淘宝的Web基本上都是基于MVC框架webx,架构决定了前端只能依赖后端。所以他们的开发模式依然是,前端写好静态demo,后端翻译成VM模版,这种模式的问题就不说了,被吐槽了很久。
  • 而且更有可能后台人员直接兼顾前端的工作,一边实现API接口,一边开发页面,两者互相切换着做,而且根据不同的url动态拼接页面,这也导致后台的开发压力大大增加。前后端工作分配不均。不仅仅开发效率慢,而且代码难以维护。而前后端分离的话,则可以很好的解决前后端分工不均的问题,将更多的交互逻辑分配给前端来处理,而后端则可以专注于其本职工作,比如提供API接口,进行权限控制以及进行运算工作。而前端开发人员则可以利用nodejs来搭建自己的本地服务器,直接在本地开发,然后通过一些插件来将api请求转发到后台,这样就可以完全模拟线上的场景,并且与后台解耦。前端可以独立完成与用户交互的整一个过程,两者都可以同时开工,不互相依赖,开发效率更快,而且分工比较均衡。

当然,站在我的角度,CTO要求我们用前后端分离我就用好了,前后端分离的权限控制问题要稍微复杂一些,我们最近的项目采用security+jwt的方式来实现前后端分离的权限控制。

Spring Security是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架。它提供了一组可以在Spring应用上下文中配置的Bean,充分利用了Spring IoC,DI(控制反转Inversion of Control ,DI:Dependency Injection 依赖注入)和AOP(面向切面编程)功能,为应用系统提供声明式的安全访问控制功能,减少了为企业系统安全控制编写大量重复代码的工作。

关于security的其他知识可以看:

https://cloud.tencent.com/developer/article/1954211

Json web token (JWT),是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519)。该标准被设计为紧凑且安全的,一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从资源服务器获取资源,也可以增加一些额外的其它业务逻辑所必须的声明信息。当然该标准也可直接被用于认证,也可被加密。

关于JWT可以看下面这篇博客:

https://cloud.tencent.com/developer/article/1196128

spring security + jwt的具体实现思路是:

用户登陆后台,后台生成一个jwt签名返回给前端,前端每次请求将签名放在Header,后台验证签名是否正确。

关于security的部分这里不再赘述

jwt

代码语言:javascript
复制
<dependency>
   <groupId>io.jsonwebtoken</groupId>
   <artifactId>jjwt</artifactId>
   <version>0.9.0</version>
</dependency>

验证token

代码语言:javascript
复制
public class JwtAuthenticationTokenFilter extends UsernamePasswordAuthenticationFilter {
    @Autowired
    private CustomerUserDetailsService userDetailsService;

    @Autowired
    private JwtTokenUtil jwtTokenUtil;
    
    private String tokenHeader="Authorization";


    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest httpRequest = (HttpServletRequest) request;
        HttpServletResponse httpResopnse = (HttpServletResponse) response;
       if("OPTIONS".equalsIgnoreCase(httpRequest.getMethod())) {
          httpResopnse.setStatus(HttpServletResponse.SC_OK);
       } else {
            String authToken = httpRequest.getHeader(this.tokenHeader);
            if(authToken!=null)
                  authToken =authToken.substring(7);
            String username = jwtTokenUtil.getUsernameFromToken(authToken);
            if (username != null && SecurityContextHolder.getContext().getAuthentication() == null) {
                UserDetails userDetails = this.userDetailsService.loadUserByUsername(username);
                if (jwtTokenUtil.validateToken(authToken, userDetails)) {
                    UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken(userDetails, userDetails.getPassword(), userDetails.getAuthorities());
                    authentication.setDetails(new WebAuthenticationDetailsSource().buildDetails(httpRequest));
                    SecurityContextHolder.getContext().setAuthentication(authentication);
                }
            }
            chain.doFilter(request, response);
       }

    }
}

JWT工具类中,根据USER信息生成token

代码语言:javascript
复制
public String generateToken(UserDetails userDetails) {
   Map<String, Object> claims = new HashMap<>();
   claims.put(CLAIM_KEY_CREATED, new Date());
   ......
   return generateToken(claims);
}

然后前端需要在每次的请求中将这个token放入请求头中。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018-08-20 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 为什么选择前后端分离
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档